1.3 面向对象编程
虽然结构化编程的理念提高了程序的清晰度、可靠性,并使之便于维护,但它在编写大型程序时,仍面临着挑战。为应付这种挑战,OOP 提供了一种新方法。与强调算法的过程性编程不同的是,OOP 强调的是数据。OOP 不像过程性编程那样,试图使问题满足语言的过程性方法,而是试图让语言来满足问题的要求。其理念是设计与问题的本质特性相对应的数据格式。
在 C++ 中,类是一种规范,它描述了这种新型数据格式,对象是根据这种规范构造的特定数据结构。例如,类可以描述公司管理人员的基本特征(姓名、头衔、工资、特长等),而对象则代表特定的管理人员(Guilford Sheepblat、副总裁、$925,000、知道如何恢复 Windows 注册表)。通常,类规定了可使用哪些数据来表示对象以及可以对这些数据执行哪些操作。例如,假设正在开发一个能够绘制矩形的计算机绘图程序,则可以定义一个描述矩形的类。定义的数据部分应包括顶点的位置、长和宽、4 条边的颜色和样式、矩形内部的填充颜色和图案等;定义的操作部分可以包括移动、改变大小、旋转、改变颜色和图案、将矩形复制到另一个位置上等操作。这样,当使用该程序来绘制矩形时,它将根据类定义创建一个对象。该对象保存了描述矩形的所有数据值,因此可以使用类方法来修改该矩形。如果绘制两个矩形,程序将创建两个对象,每个矩形对应一个。
OOP 程序设计方法首先设计类,它们准确地表示了程序要处理的东西。例如,绘图程序可能定义表示矩形、直线、圆、画刷以及画笔的类。类定义描述了对每个类可执行的操作,如移动圆或旋转直线。然后您便可以设计一个使用这些类的对象的程序。从低级组织(如类)到高级组织(如程序)的处理过程叫做自下向上(bottom-up)的编程。
OOP 编程并不仅仅是将数据和方法合并为类定义。例如,OOP 还有助于创建可重用的代码,这将减少大量的工作。信息隐藏可以保护数据,使其免遭不适当的访问。多态让您能够为操作符和函数创建多个定义,通过编程上下义来确定使用哪个定义。继承让您能够使用旧类派生出新类。正如接下来将看到的那样,OOP 引入了很多新的理念,使用的编程方法不同于过程性编程。它不是将重点放在任务上,而是放在表示概念上。有时不定使用自顶向下的编程方法,而是使用自下向上的编程方法。本书将通过大量易于掌握的范例帮助读者理解这些要点。
设计有用、可靠的类是一项艰巨的任务,幸运的是,OOP 语言使程序员在编程中能够轻松地使用已有的类。广商提供了大量有用的类库,包括设计用于简化 Windows 或 Mac 环境下编程的类库。C++真正的优点之一是:可以方便地重用和修改现有的、经过仔细测试的代码。
1.3.1 C++ 和泛型编程
泛型编程是 C++ 支持的另一种编程模式。它与 OOP 的目标相同,即使重用代码和抽象通用概念的技术更简单。不过 OOP 强调的是编程的数据方面,而泛型编程强调的是算法方面。它们的侧重点不同。在C++中,泛型编程是一种强大的编程范式,它允许你编写可以处理多种数据类型的通用代码。主要通过模板来实现泛型编程,C++中的模板允许你编写通用的函数和类,而不用提前指定具体的数据类型。
泛型编程在C++中广泛应用,特别是在STL(标准模板库)中,其中包括了许多通用的数据结构和算法,如向量、链表、排序、搜索等,可以适用于多种数据类型。