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

1.1.2 面向对象程序设计的基本概念

为了掌握面向对象程序设计技术,我们从最基本的概念入手。本节介绍的内容是面向对象程序设计的理论基础,它们不依赖于具体的程序设计语言,也就是说,无论使用哪种面向对象语言进行面向对象程序设计,本节内容都有指导意义。

1.对象

在此,我们讨论的对象具有两方面的含义,即在现实世界中的含义和面向对象程序设计中的含义。

在现实世界中,任何事物都是对象。它可以是一个有形的、具体存在的事物,如一粒米、一名学生、一辆汽车,甚至一个星球。它也可以是一个无形的、抽象的事件,如一次演出、一场球赛、一次出差等。对象既可以很简单,也可以很复杂,复杂的对象可以由若干简单的对象构成,整个世界都可以认为是一个非常复杂的对象。

现实世界中的对象既具有静态的属性(或称状态),又具有动态的行为(或称操作、功能)。例如,每个人都有姓名、性别、年龄、身高、体重等属性,都有吃饭、走路、睡觉、学习等行为。所以,在现实世界中,对象一般可以表示为属性+行为。

现实世界中的对象具有以下特性:

(1)每一个对象必须有一个名字以区别于其他对象。

(2)用属性来描述它的某些特征。

(3)有一组操作,每个操作决定对象的一种行为。

(4)对象的操作可以分为两类:一类是自身所承受的操作,另一类是施加于其他对象的操作。

在面向对象程序设计中,对象是描述其属性的数据以及对这些数据施加的一组操作封装在一起构成的统一体。对象可以认为是数据+操作。对象所能完成的操作表示它的动态行为,通常也把操作称为方法。

为了帮助读者理解对象的概念,图1-1形象地描绘了具有3个操作的对象。

图1-1 具有3个操作的对象示意图

下面我们用一台录音机比喻一个对象,通俗地说明对象的某些特点。

录音机上有若干按键,如Play(播放)、Rec(录音)、Stop(停止)、Rew(倒带)等,当人们使用录音机时,只要根据自己的需要如放音、录音、停止、倒带等按下与之对应的键,录音机就会完成相应的工作。这些按键安装在录音机的表面,人们通过它们与录音机交互。人们无法(当然也没必要)操作录音机的内部电路,因为它们被装在机壳里,录音机的内部情况对于用户来说是隐蔽的、不可见的。也就是该对象向公众开放的操作。

当我们用录音机比喻对象时,使用对象向公众开放的操作就好像使用录音机的按键,只需知道该操作的名字(如录音机的键名)和所需要的参数(用于提供附加信息或设置状态,好像听录音前先装录音带并把录音带转到指定位置),根本无须知道实现这些操作的方法。事实上,实现对象操作的代码和数据是隐藏在对象内部的,一个对象好像是一个黑盒子,表示它内部状态的数据和实现各个操作的代码,都被封装在这个黑盒子内部,在外面是看不见的,更不能从外面去访问或修改这些数据或代码。

使用对象时只需知道它向外界提供的接口形式而无须知道它的内部实现算法,不仅使得对象的使用变得非常简单、方便,而且具有很高的安全性和可靠性。可见面向对象程序设计中的对象来源于现实世界,更接近人们的思维。

2.类

在实现世界中,类是一组具有相同属性和行为的对象的抽象。例如,张三、李四、王五等,虽然每个人的性格、爱好、职业、特长等各有不同,但是他们的基本特征是相似的,都具有相同的生理构造,都能吃饭、说话、走路等,于是把他们统称为“人”类,而具体的每一个人是人类的一个实例,也就是一个对象。

类和对象之间的关系是抽象和具体的关系。类是多个对象进行综合抽象的结果,一个对象是类的一个实例。例如,“学生”是一个类,它是由千千万万个具体的学生抽象而来的一般概念。

类在现实世界中并不真正存在。例如,在地球上并没有抽象的“人”,只有一个个具体的人,如张三、李四、王五等。同样,世界上没有抽象的“学生”,只有一个个具体的学生。

在面向对象程序设计中,类是具有相同的数据和相同的操作的一组对象的集合,也就是说,类是对具有相同数据结构和相同操作的一类对象的描述。例如,“学生”类可由学号、姓名、性别、成绩等表示其属性的数据项和对这些数据的录入、修改和显示等操作组成。

在C++中把类中的数据称为数据成员,类中的操作是用函数来实现的,这些函数称为成员函数。

在面向对象程序设计中,总是先声明类,再由类生成其对象。类是建立对象的“模板”,按照这个模板所建立的一个个具体的实例,通常称为对象。打个比方,手工制作月饼时,先雕刻一个有凹下图案的木模,然后在木模上抹油,接着将事先揉好的面塞进木模里,用力挤压后,将木模反扣在桌上,一个漂亮的图案就会出现在月饼上了。这样,就可以制造出外形一模一样的月饼。这个木模就好比是“类”,制造出来的月饼好比是“对象”。

3.消息

现实世界中的对象不是孤立存在的实体,它们之间存在着各种各样的联系,正是它们之间的相互作用、联系和连接,才构成了世间各种不同的系统。同样,在面向对象程序设计中,对象之间也需要联系,称之为对象的交互。面向对象程序设计技术必须提供一种机制允许一个对象与另一个对象的交互,这种机制称为消息传递。

在面向对象程序设计中的消息传递实际是对现实世界中的信息传递的直接模拟。以实际生活为例,每一个人可以为他人服务,也可以要求他人为自己服务。当需要别人为自己服务时,必须告诉他们需要的是什么服务,也就是说,要向其他对象提出请求,其他对象接到请求后,才会提供相应的服务。

在面向对象程序设计中,一个对象向另一个对象发出的请求称为“消息”。当对象接收到发向它的消息时,就调用有关的方法,执行相应的操作。消息是一个对象要求另一个对象执行某个操作的规格说明,通过消息传递才能完成对象之间的相互请求或相互协作。例如,有一位教师对象张三和一名学生对象李四,对象李四可以发出消息,请求对象张三演示一个实验,当对象张三接收到这个消息后,确定应完成的操作并执行之。

一般情况下,称发送消息的对象为发送者或请求者,称接收消息的对象为接收者或目标对象。对象中的联系只能通过消息传递来进行。接收对象只有在接收到消息时,才能被激活,被激活的对象会根据消息的要求完成相应的功能。

消息具有以下3个性质:

(1)同一个对象可以接收不同形式的多个消息,做出不同的响应。

(2)相同形式的消息可以传递给不同的对象,所做出的响应可以是不同的。

(3)对消息的响应并不是必需的,对象可以响应消息,也可以不响应。

4.方法

在面向对象程序设计中的消息传递实际是对现实世界中的信息传递的直接模拟。调用对象中的函数就是向该对象传送一个消息,要求该对象实现某一行为(功能、操作)。对象所能实现的行为(操作),在程序设计方法中称为方法,它们是通过调用相应的函数来实现的,在C++中方法是通过成员函数来实现的。

方法包括界面和方法体两部分。方法的界面给出了方法名和调用协议(相对于C++中成员函数的函数名和参数表);方法体则是实现某种操作的一系列计算步骤,也就是一段程序(相对于C++中成员函数的函数体)。消息和方法的关系是:对象根据接收到的消息,调用相应的方法;有了方法,对象才能响应相应的消息。