本节书摘来自异步社区出版社《C++面向对象高效编程(第2版)》一书中的第1章,第1.2节,作者: 【美】Kayshav Dattatri,更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.2 理解对象模型
C++面向对象高效编程(第2版)
理解面向对象编程(OOP)范式最大的困难之一,是理解类和对象的概念。要灵活运用OOP,必须充分理解这些概念。
OOP中的基本实体是类。我们继续以银行账户为例,每个BankAccount类对象都有相同的结构和行为。因此,所有的BankAccount类对象都可以使用MakeDeposit以及类中声明的其他操作(即可以通过类的任意对象使用类中的任何操作)。同时所有对象都有自己的私有数据副本(balance、account_number等)。各对象之间的差别取决于保存在私有数据中的值。例如,BankAccount类的alpha对象中,balance的值可能为500;而BankAccount类的另一个beta对象中,balance的值可能为10000,如图1-2所示。
对象是类的实例(如切好的甜饼)。类仅在程序的源代码中可见,而对象则参与到程序的运行中,它是类的活实例。对象占据内存空间,我们可以感受到对象的存在。创建类对象的过程称为实例化对象(instantiating an object)。
在面向过程编程中,我们总是讨论调用过程,总是以“调用过程X(或调用X)和调用Y”来谈论问题(这里的X和Y都指过程)。但是,在OOP中,我们说“通过某对象调用X”,而决不会说“调用X或调用Y”。假设有一个BankAccount类的对象myAccount,我们说“通过myAccount对象调用MakeDeposit过程”。换言之,过程通过对象调用。
图1-2
没有对象,不能简单地调用过程。我们绝不会说“调用过程”,而必须说“通过对象调用过程”。操作(例如存款)必须通过对象调用过程(即函数)才可完成,不可能直接修改他人的数据。
在面向过程编程的模型中,程序员查看数据结构时,很难明白数据结构用于完成什么工作以及如何使用,甚至不清楚数据结构代表什么。由于数据结构并不是一个智能的实体,它的目的、用法和限制都难以理解,一些用于正确使用数据结构的信息被深埋在其他函数中,而这些函数又在别处。面向对象编程不会陷入这样的困境,因为类所要完成的工作全都以公有操作的形式清楚地陈述,而且在别处也不存在独立的数据结构。事实上,客户看不见独立的数据结构,客户所能见到的是类和一组清晰定义的操作。数据结构(隐藏在类内部)以及它能执行的操作已构成一个整体。换言之,客户利用类可做之事已在类中详细地说明,客户无需到别处查找。