C++面向对象
程序设计
第一章
面向对象程序设计概述
1.1.1 面向过程 程序设计的基本概念
考虑一个银行系统,该系统允许顾客开设不同类型的银
行账户,包括现金账户、支票账户和贷款账户,同时允许
顾客存款、取款和转帐。
首先考虑数据结构,
struct account {
char *name; /* 姓名 */
unsigned long accountId; /* 账号 */
float balance; /* 余额 */
float interestYTD; /* 年利息 */
char accountType; /* 账户类型 (现金 x、支票 z和贷款 d)
};
1.1 什么是面向对象程序设计
1
再考虑用三个 过程 分别负责 存款、取款和转帐。我们可以三个
C函数,
MakeDeposit()
WithDraw()
Transfer()
这种数据结构与 过程分离有很多问题,例如增加一种 账户类型 ---退
休账户 (t),则三个 C函数都必须重新编写。
2
1.1.2 面向对象程序设计的基本概念
面向对象程序设计是一种新的程序设计范型。面向对象程序的主
要结构特点是,
第一,程序一般由类的定义和类的使用两部分组成,在主程序中定
义对象并规定它们之间传递消息的规律;
第二,程序中的一切操作都是通过向对象发送消息来实现的,对象
接收到后,启动有关方法完成相应操作。
数据与定义在它上面的用户需要的操作构成一个整体。
当把对银行账户的操作定义在数据上,银行账户就是一个类,称为
银行账户类。我们可以建立许多具体的银行账户,而每一个具体
的银行账户就是银行账户类的一个对象。
3
class BankAccount {
char *name; /* 姓名 */
unsigned long accountId; /* 账号 */
float balance; /* 余额 */
float interestYTD; /* 年利息 */
public,
void MakeDeposit( float amount) ;
float WithDraw( float amount) ;
bool Transfer( BankAccount & to,float amount) ;
};
4
1.2 对象与类
1.2.1 对象与类概念
对象是现实世界的一个实体,其特性是,
(1) 每一个必须有一个名字以区别于其他对象;
(2) 用属性来描述它的某些特征;
(3) 有一组操作,每一个操作决定对象的一种行为。
类是一组具有共同的属性特征和行为特征的对象的抽象。
类名, 教师类 对象 对象
属性, 姓名:字符串
年龄:整数
学历:字符串
职称:字符串
专业:字符串
动作, 说自己的年龄
吃饭
授课
属性, 姓名,黎明
年龄,30
学历,博士
职称,教授
专业,计算机软件
动作, 说自己的年龄
吃饭
授课
属性, 姓名,
年龄,
学历,
职称,
专业,
动作, 说自己的年龄
吃饭
授课
5
什么是对象( object )
对象是面向对象( O-O)方法的核心。关于对象可以从如下几点说
明,
*对象是人们要进行研究(感兴趣)的任何事物,从最简的整数到航
天飞都可以看成对象
1)有形的实体。指一切看得见摸得着的实物。
2)作用。指人或组织所起的作用。医生、公司、部门等。
3)事件。在特定时间发生的事。如飞行、演出、开会等。
4)性能说明。如机床厂对机床的性能说明。
对象不仅能表示结构化的数据,而且也能表示抽象的事件、规则
以及复杂的工程实体。因此对象具有很强制表达能力和描述功能。
*对象实现了数据与操作结合
对象有状态用来描述它的某些特征,通常用数据来描述。
对象还应当有操作,用以改变对象的状态,对象及其操作就是对
象的行为。为此改变了传统方法中将数据与操作(亦称函数或过
程)相分离的做法,实现了将数据与操作封装在对象的统一体中。
6
*对象应具有唯一识别的功能
对象有唯一对象标识符 (Object Identify,简称 OID)它可唯一,且
永久地标识对象。即使二完全一样的茶杯也是二个对象有甲、乙之

*对象必须参与一个或一个以上的对象类。
对象应参与对象类,并是类的一个实例。
*有自己内部的和对外部的动作,称为操作。
*可以通过指令、命令或称消息发动它的动作。
总之对象是现实世界中可以区分的一个事、物,它有独立性又
有相关性。
7
对象类 (Object class)
对象类是( O-O)方法的一个重要抽象概念,称类。
将具有相同结构、操作,并遵守相同约束规则的对象聚合成一组,
这组对象集合就称为类。它是把许多对象进行抽象。
如茶杯 有不同大小的茶杯,不同材料,不同形状,可可完全相同
的许多茶杯 ---- 茶杯的类
具体对类进行定义时,最低限度应包括如下内容,
1)类名。
2)内部表示。
3)对外接口。对于操纵类实例 —— 对象的外部可施力的操
作。
4)接口如何在内部动作的。内部实现。
对类的一个具体称为对象或实例或实体。
类最鲜明的特色是将数据的结构与数据的操作都封装在类中,并实
现了类的外部特性与类实现的隔离。也就实现了将使用类和对象
的使用者,与具体设计对象和类的开发者区分开,从而有良好的
模块化特性进而为复杂大系统的分析、设计,实现提供先进的方
法。 8
1.2.2 对象的状态
我们可以把对象看成是一个带有状态和行为的活的实体。类的属
性的具体值为 对象的状态。
对象的状态是所有静态属性和这些属性的动态值的总体。
属性, 姓名:字符串
年龄:整数
学历:字符串
职称:字符串
专业:字符串
对象的状态不仅仅是初等的数据类型(整数,字符串),而且可
以是另外的对象作为它的状态的一部分。
一辆车
发动机
座位
车轮
9
1.2.3 对象的交互
对象之间的联系称为对象的交互。一个对象向另一个对象发出的请
求被称为消息。
方法 (Methods)和消息 (Messnges)
方法也即类的外部接口的另一种说法,实际就是类对象的某一个
操作,要使类对象进行某一种操作,先要给以消息,也可以方法
与消息等同。因此,消息是要求对象进行动作的说明或命令或指
导,是对象之间相互请求或相互协作的途径。
把发送消息的对象称为发送者,接收消息的对象称为接收者。对
象间的联系,只能通过传递消息来进行。对象也只有在收到消息
后才能选用方法而被激活。
消息具有三个性质,
( 1)同一个对象可以接收不同形式的多个消息,做出不同的响应。
( 2)相同形式的消息可以传递给不同的对象,所做出的响应可以
是不同的。
( 3)消息的发送可以不考虑具体的接受者,对象可以响应消息,
也可以不响应。 10
C++语言中对类、对象、方法、消息的实现实例
Class person {
private,
char name[20];
int age;
char add[40];
char sex;
void printname(){cout<<name;} \\私有消息
void printage(){cout<<age;}
void printadd(){cout<<add;}
void printsex(){cout<<sex;}
public,
void printme(){ printname(); \\公有消息
printage();
printadd();
printsex(); }
}; // 这是类,有类名 person,内部表示数据,提供外部接口
printme()及实现。有了这个类就可以定义各种各样的人 (对象 ),
及给对象一个信息 (消息 ),他就会自报家门。 11
#include <iostream.h>
main( )
{ person y; //y 是对象
y.printme(); // 这是 消息,向对象 y发送了方法 printme()的消息

}
*注 * 假定 y 己有初值数据,如何给初值以后构造函数中实现。
printme();
y.printname;
y.printage; 等都是错误的。
12
1.3 数据的抽象与封装
1.3.1 现实世界中的抽象与封装
1.3.2 数据的抽象与封装的基本概念
将数据结构和作用于数据结构上的操作组成一个实体,数据的表
示方式和对数据的操作细节被隐藏起来,用户通过操作接口对数
据进行操作。这就是数据的封装。
对象的封装是,
( 1)对象具有一个清楚的边界,对象的私有数据、成员函数的细
节被封装在该边界内;
( 2)具有一个描述对象与其它对象如何相互作用的接口,该接口
必须说明消息传递的使用方法;
( 3)对象内部的代码和数据应受到保护,其它对象不能直接修改。
13
1.3.3 对象的特性
(1)封装性
封装是指将一个数据和与这个数据有关的操作集合放在一起形成
一个能动的实体 ----- 对象,有一个清楚的边界包装,对象,类的所
有私有数据内部程序(成员函数)的细节都被固定在这个边界内。
具有一个接口,这个接口描述了对象对外界的消息、方法和响应。
对象受封壳保护,外界不能直接修改使用本对象所拥有的数据和代
码。
( 2) 模块独立性
( 3) 动态连接性
( 4) 易维护性
14
1.4 继承性
1.4.1 继承的概念
以面向对象程序设计的观点来看,继承所表达的是对象类之间相关
的关系。这种关系使得某类对象可以继承另外一类对象的特征和
能力。
类之间具有继承关系,则有下列特性,
( 1) 类间具有共享特性(包括数据和程序代码的共享);
( 2) 类间具有判别或新增部分(包括非共享的数据和程序代码);
( 3) 类间具有层次结构。
假设有两个类 A和 B,若类 B继承类 A,则属于类 B中的对象具有类 A
的一切特征(包括数据属性和操作),这时,我们称被继承类 A
为基类或父类或超类;而称继承类 B为类 A的派生类或子类。同
时我们还可以说,类 B是从类 A中派生出来的。如果类 B从类 A派
生出来,而类 C又是从类 B派生出来的,就构成了类的层次。
继承机制允许派生类继承基类的数据和操作(即数据成员和成员函
数),也就是说,允许派生类使用基类的数据和操作。同时派生
类还可以增加新的操作和数据。 15
1.4.2 继承的分类
从继承源上分,继承分为单继承和多继承。
从继承内容上划分,继承可分为取代继承、包含继承、受限继承、
特化继承等。
16
1.4.3 继承与封装的关系
在面向对象系统中,封装的单位是对象,也就是说,把一个属于
某一类的对象封装起来,使其数据和操作成为一个整体。
一个对象,无论它是基类的实例,还是派生类的实例,都是一个
被封装的实体。因此,我们得出结论:继承机制的引入并不影响
对象的封装性。
继承是类之间的相交关系,即类间的继承关系。
要进行类间继承它们之间应有,
类间具有共享特征(包括数据和程序共享)
类间具有细微的差别或有新增部分(非共享的数据和代码)
类间具有层次结构
从继承源上划分,单继承和多继承
从继承内容上划分,继承可以对数据(结构特性)的继承又具
有操作(行为)的继承。
17
1.5 多态性
1.5.1 什么是多态性
面向对象系统的多态性是指不同的对象收到相同的消息时产生多
种不同的行为方式。
1.5.2 重载的概念
重载一般包括函数重载和运算符重载。函数重载是指一个标识符
可同时用于为多个函数命名,而运算符重载是指一个运算符可同
时用于多种运算。
多态性:指接收同一个消息名后,对象可以采用多种不同的行为
(态度)
重载概念:即可以有同名函数。同一运算符可以定义成不同的操
作。
虚函数概念:指类继承和派生中可以用相同函数名,但不同的实
现版本。
抽象类的概念:可以定义一种类,这种类中有虚函数,因此不能
有具体对象的类,称抽象类。 18
1.6 面向对象程序设计语言
面向对象的程序设计,必须使用面向对象程序设计语言。面向对
象程序设计语言应该具备下述特征,
( 1) 它支持对象的概念(包括对象所有的特性,如封装等);
( 2) 它要求对象属于类;
( 3) 它提供继承机制。
要点
(1),面向对象的程序设计将数据及数据的操作放在一起,它将对象
及对象的操作抽象成一种新的数据类型称为类。
(2),对象是其自身所具有的状态特征及可以对这些状态施加的操作
结合一起所构成的独立实体。
(3),类是对一组客观对象的抽象,将该组对象共同特征集中起来。
(4),面向对象系统的特性是封装性、继承性、多态性。
抽象:抽象分类 从一组对象为起点,抽取公共的行为将其放到一
个类中,不同类的对象具有不同的行为。
19