| 汽车实例 | 对象特征 | 软件实例:排序程序 |
| “Car” | 整个事物具有一个名字 | “sort” |
| 输入:燃料和汽油 输出:交通运输 | 定义良好的输入和输出 | 输入:一个未排序的文件 输出:一个已排序的文件 |
| 发动机、传感器、泵等 | 由更小的自包含的对象组成 | 模块、头文件、函数、数据结构等 |
| 世界上存在很多汽车,有很多不同的品种 | 可有很多的实例对象 | 它的实现应该允许几个用户同时排 序,例如不需要依赖一个全局的临时工作空间 |
| 燃料泵并不依赖并影响车板清洗器 | 更小的自包含的对象无相互作用, 除非它是通过定义良好的接口进行 | 用于读取记录的程序应该与关键的的比较程序独立 |
| 计时器的计时变化并不是驾车者的任务,所以驾驶员不能直接控制计时器 | 不能直接操纵或甚至看到细节 | 用户应该并不需要或进一步利用程序所使用的特定的排序算法(如快速排序、堆排序、Shell排序等) |
| 可以更换一个更好的发动机,而无须更改驾驶员的操作方法 | 可以不修改用户接口的情况下修改实现 | 实现者应该能够在不影响用户使用的的前提下替换一种更好的算法 |
抽象---取事物的本质特性
面向对象编程从面向对象设计开始,而面向对象设计从抽象开始。
关键概念:抽象
抽象的概念就是观察一群“事物”,并认识到它们具有一些共同的主题。你可以忽略不重要的区别,只记录表示事物特征的关键数据项。当你这样做的时候,就是在进行“抽象”,所以存储的数据类型就是“抽象数据类型”。抽象---只不过是事物的简化而已。
抽象是非常有用的,因为它允许程序实现下列目标:
*隐藏不相关的细节,把注意力集中在本质特征上。
*向外部世界提供一个“黑盒”接口。接口确定了施加在对象之上的有效操作的集合,但它并不提示在内部是怎样实现的。
*把一个复杂的系统分解成一个相互独立的组成部分。这可以做到分工明确,避免组件之间不符合规则的相互作用。
*重用和共享代码。
C语言通过允许用户定义新的类型(struct、enum)来支持抽象。用户定义类型几乎和预定义类型(int, char等)一样方便,使用形式也几乎一样。我们说“几乎一样方便”是因为C语言并不允许在用户定义类型中重新定义*、<<、[]、+等预定义操作符。C++则消除了这个障碍。C++同时提供了自动和受控制的初始化、数据在生命期结束后自动清除以及隐式类型转换。有些特性是C语言所不支持的,有些在C语言里不是很方便。
抽象建立了抽象数据类型,C++使用类(class)这个特性来实现它。它提供了一种自上而下的观察数据类型属性的方法来看待封装:把用户定义类型中的各种数据和方法组合在一起。它同时提供了一种自底而上的观点来看待封装:把各种数据和方法组合在一起实现一种用户自定义行为。