C++面向对象程序设计(微课版)
上QQ阅读APP看书,第一时间看更新

1.1 面向对象技术的基本概念

1.1.1 面向过程与面向对象

面向对象技术强调在软件开发过程中面向客观世界或问题域中的事物,采用人类在认识客观世界的过程中普遍运用的思维方法,直观、自然地描述客观世界中的有关事物。相对于过程化的程序设计方法,面向对象技术更符合人对客观世界的认识规律。

在面向对象方法出现以前,程序员都采用面向过程的程序设计方法。早期的计算机主要被设计用来进行数据计算,例如:最初是为了计算炮弹的飞行轨迹。为了完成计算任务,需要将计算过程分解为若干个步骤完成,软件设计的主要工作是分解问题,并设计求解问题的过程。

随着计算机硬件系统的高速发展,计算机的应用领域不仅仅限于数学计算,它所处理的问题的规模也变得日益庞大、复杂,程序也越来越庞大。传统的面向过程的方法中数据和针对数据的操作在实质上高度依赖,但在形式上又是绝对分离的。这种矛盾使得大型程序后期的升级、维护变得异常复杂。当需要多人合作编写程序完成任务时,程序员之间很难读懂对方的代码,更谈不上代码的重用,软件开发周期无限期延后,基于这些原因,面向对象技术应运而生。

面向对象技术将数据及对数据的操作放在一起,成为一个不可分割的整体——对象。针对同类对象抽象出共同的数据和操作,形成类;根据需要,设定类中大部分的数据只能被本类的方法处理;设定一些外部接口与外界发生关系,对象与对象之间通过消息进行通信。

面向对象的软件开发方法使开发软件的方法与过程尽可能地接近人类认识世界、分析问题和解决问题的方法和过程。面向对象的软件开发技术是以面向对象方法学为基本指导思想的软件开发技术。

1.1.2 对象与类

与人们认识客观世界的规律相同,面向对象技术认为客观世界是由各种各样的对象组成的;在要解决的问题中,客观存在很多事物,对象是对这些事物的抽象,每个对象都有自己的特征,包括静态特征(一般用数据来描述)和动态特征(对象所表现的行为或具有的功能)。

把系统中要考虑的对象归类,在归类的过程中忽略与当前要考虑的系统无关的特征,只考虑那些与当前目标有关的本质特征,从而找到事物的共性,把具有相同属性和行为的对象划为一类,并通过一个统一的概念来描述它。例如:学生、教师、教室等。

如图1-1所示,有多个洗衣机对象,每个对象都有自己的特征,包括属性和行为两部分,如图1-2所示。

50051-00-009-1

图1-1 洗衣机对象

50051-00-009-2

图1-2 每个洗衣机对象都具有的属性和行为

将具有相同特征的对象集抽象就形成了类。类为属于该类的全部对象提供了统一的抽象描述,类是生成对象的模板,其内部包括属性(数据)和行为(操作)两个部分。通过类可以生成一个具体的对象,对象是类的一个实例。

上述洗衣机对象可以抽象用洗衣机类表示。

这是一台洗衣机=这是洗衣机类的一个实例

简单来说,类是用户自定义的一种抽象的数据类型,对象就是通过这种数据类型定义的变量。

类与对象的示例代码如下:

class Car
{
    int color;
    int door_number;
    int speed;
    char manufacturer[50];
    char style[10];
    int price;
    void brake() {…}
    void speedup() {…}
    void slowdown() {…}
};
Car         car1;
Car         car2;

面向对象技术将现实问题中的对象映射为程序中的一个整体——类;使用类将具有相同属性和行为的对象抽象为程序中的一个整体。类突破了传统数据与操作分离的模式。

1.1.3 封装和消息

消息是描述事件发生的信息,消息是对象之间发出的行为请求。封装使得对象成为一个独立的实体,消息则使得对象之间动态地联系起来,对象的行为能互相配合,构成一个有机的运行系统。

封装信息的隐蔽性反映了事物的相对独立性,用户可以只关心它对外所提供的接口,即能做什么,而不注意其内部细节,即怎么提供这些服务。封装对于用户而言,使得操作变得更加简单,对于对象本身而言,封装使得使用者不能随意去修改对象内部的属性,使对象安全性得到提高。用陶瓷封装起来的一块集成电路芯片,其内部电路是不可见的,而且使用者也不关心它的内部结构,只关心芯片引脚的个数、引脚的电气参数及引脚提供的功能,通过这些引脚,使用者就能将各种不同的芯片连接起来,就能组装成具有一定功能的模块。一个封装起来的电视机对于使用者来说,只需要了解基本的开关按钮、调换频道、调音量按钮等功能,而不需要知道电视机内部复杂的结构就可以很方便地使用它。对于电视机对象而言,封装使对象本身更加安全;对于电视机对象的使用者来说,封装使操作变得更加简单。

一方面,封装使对象以外的部分不能随意存取对象的内部属性,从而有效地避免了外部错误对它的影响,大大减小了查错和排错的难度;另一方面,即使对象内部被修改,由于它只通过少量的外部接口对外提供服务,因此同样减小了内部的修改对使用者的影响。

封装机制将对象的使用者与设计者分开,使用者不必知道对象行为实现的细节,只需要使用设计者提供的外部接口。封装实际上隐藏了内部结构复杂性,并提高了代码重用性,从而降低了软件开发的难度。

对象使用者向对象发送消息,完成需要进行的操作,消息传递模型如图1-3所示。

50051-00-010-1

图1-3 消息传递模型

例如,电视观看者可以向电视对象发送换频道的消息,开机或关闭的消息。示例代码如下:

TVSet   tv;
tv.ChangeChannel(5);