对象细节
2.7 抽象数据类型:将数据连同函数捆绑在一起,这一点就允许创建新的类型。这常常被称为封装。一个已存在的数据类型,例如 float
,有几个数据块:一个指数,一个尾数和一个符号位。我们能够告诉它与另一个 float
或 int
相加,等等。它有属性和行为。stash
也是一个新数据类型,可以 add()
、fetch()
和 inflate()
。由说明 stash S
创建一个 stash
就像由说明 float f
创建一个 float
一样。一个 stash
也有属性和行为,甚至它的活动就像一个实数—一个内建的数据类型。我们称 stash
为抽象数据类型(abstract data type),也许这是因为它能允许我们从问题空间把概念抽象到解空间。
C++编译器把它看作一个新的数据类型,并且如果说一个函数需要一个 stash
,编译器就确保传递了一个 stash
给这个函数。对抽象数据类型(有时称为用户定义类型)的类型检查就像对内建类型的类型检查一样严格。然而,我们会看到在对象上完成运算的方法有所不同。object.member_function(arglist)
是对一个对象“调用一个成员函数”。而在面向对象的用法中,也称之为“向一个对象发送消息”。这样,对于 stash S
,语句 S.add(&i)
“发送消息给 S”,也就是说,“对自己 add()”。事实上,面向对象程序设计可以总结为一句话,“向对象发送消息”。需要做的所有事情就是创建一束对象并且给它们发送消息。当然,问题是勾画出我们的对象和消息是什么,但如果完成了这些,C++ 的实现就直截了当了。
2.8 对象细节:这时我们大概和大多数 C 程序员一样会感到有点困惑,因为原有的 C 是非常低层和面向效率的语言。在研讨会上经常提出的一个问题是“对象应当多大和它应当像什么”。回答是“最好莫过于和我们希望来自 C 的 struct
一样”。事实上,C struct
(不带有 C++ 装饰)在由 C 和 C++ 编译器产生的代码上完全相同,这可以使那些关心代码的安排和大小细节的 C 程序员放心了。并且,由于某种原因,直接访问结构的字节,而不是使用标识符,不一定是效率更高的办法。应当知道,这个术语似乎是有争议的题目。一些人就像这里的用法一样用它,而另一些人用它描述隐藏的实现,这将在第三章中讨论。
想进一步了解面向对象编程的奇妙之处?请点击精彩编程与编程技巧理解面向对象编程 和 面向对象编程C,这些资源会让你对抽象数据类型和对象的奥妙有更深刻的理解!
如果对C语言中的面向对象编程感兴趣,可以参考面向对象编程方法C,这里有更多关于如何在C语言中实现面向对象编程的技巧与方法!
需要一些C++的具体示例和实践?C++ 面向对象编程000面向对象 这个链接包含了许多实用的示例代码和详细解释,帮助你更好地掌握C++的面向对象编程技巧!
探索更多与抽象数据类型相关的内容,请查看面向对象编程Java中的抽象数据类型。这里提供了许多关于如何在Java中使用和实现抽象数据类型的实用建议和实例。
这样,不管是C还是C++,不管是新手还是老手,面对面向对象编程的世界,都有许多资源可以帮助你一一解开其中的奥秘。