1
第十五讲
面向对象程序设计与 C++
2
内 容
?程序设计方法概述
?面向对象程序设计方法
?C++语言
3
一、程序设计方法概述
4
程序设计方法
?早期的程序设计方法
?结构化程序设计方法
?面向对象程序设计方法
5
早期的程序设计方法追求程序的高效率,
编程过份依赖技巧,而不注重所编写程序的结
构,也就是 没有固定程序设计方法 的时期。程
序的可读性、可重用性都很差。其中一个典型
问题是频繁使用 goto语句。
虽然这种方法存在很多问题,但对于单人
完成较为简单的任务,事实上还是经常被采用
的。
早期的程序设计方法
6
结构化方法出现在 70年代中期,我们可以
这样理解它,
结构化程序设计方法是从程序要实现的 功
能 的角度出发的。一般按照 自顶向下, 逐步求
精 的方式,将程序要完成的功能逐级划分成许
多小的功能模块,象搭积木一样搭起来。这些
小的功能模块最终都可以转化成三种基本控制
结构的组合。
所谓的功能可以理解为对数据的操作。在
程序实现中,特定的功能或功能模块一般用 函
数 来实现,它们要对特定的 数据 进行操作。
结构化程序设计方法
7
结构化设计方法的特点
?结构化程序设计方法的主要技术是 自顶
向下, 逐步求精,采用 单入口, 单出口
的控制结构
?自顶向下 是一种分解问题的技术,逐步
求精 指结构化程序的连续分解,最终成
为下面三种基本控制结构的组合
?三种基本控制结构,顺序、分支、循环
8
分支结构
语句 1
语句 2
语句 3
条件
语句 2 语句 1
语句 1
语句 2
顺序结构 循环结构
9
例,
从键盘输入一个学生的信息(包括姓名、
年龄、性别、学号等)和一个老师的信
息(包括姓名、年龄、性别、是否授课
等),然后将信息输出到屏幕。
一个简单的例子
10
分析,
根据需求(题目要求),我们可以把问
题划分为两个功能模块,一个是 输入模块,
一个是 输出模块,做完了输入模块,再做
输出模块。再具体考虑每个模块如何实现
(逐步求精)。
我们用 C语言来写,参看下面的代码,
11
// ……
void main() // 主函数开始
{
// 声明用于存储学生信息的变量
char strStudentName[20]; // 学生姓名
int nStudentAge; // 学生年龄
char cStudentSex; // 学生性别
int nStudentNumber; // 学生学号
// 声明用于存储老师信息的变量
char strTeacherName[20]; // 老师姓名
int nTeacherAge; // 老师年龄
char cTeacherSex; // 老师性别
int nIsTeaching; // 是否授课
// 输入模块
GetStudentInfo(…); // 输入学生信息
GetTeacherInfo(…); // 输入老师信息
// 输出模块
PrintStudentInfo(…); // 输出学生信息
PrintStudentInfo(…); // 输出老师信息
}
描述学生的数据
描述老师的数据
函数
函数
12
上面的例子中,我们可以进一步将属于学生和
老师的变量放入 结构 中 。这样可以在一定程度上完
成 对数据的封装 。但 在结构化程序设计中,数据与
对其进行操作的函数仍是分离的。
// 声明学生结构 Student
struct Student
{
char strStudentName[20]; // 学生姓名
int nStudentAge; // 学生年龄
char cStudentSex; // 学生性别
int nStudentNumber; // 学生学号
};
// 声明老师结构 Teacher
struct Teacher
{
char strTeacherName[20]; // 老师姓名
int nTeacherAge; // 老师年龄
char cTeacherSex; // 老师性别
int nIsTeaching; // 是否教书
};
13
程序=算法+数据结构
算法 数据结构
描述问题 解决问题
结构化程序设计方法
14
问题,
函数用于完成一定的功能,它们都是针
对特定的数据进行操作的。那么我们能
不能以特定的数据为中心,将数据与对
其进行操作的函数封装起来呢?
15
面向对象程序设计方法
?面向对象程序设计出现在 80年代中后期
?面向对象程序设计是建立在结构化程序
设计基础上的,但它不再是从功能入手,
而是从 对象 (人、地方、事情等)入手
?面向对象程序设计以 类 作为构造程序的
基本单位,它具有封装、数据抽象、继
承、多态等特点
16
简单地说,对象就是现实世界中的各
种实体,包括人、地点和事物等。例如,
桌子、椅子、教室、学生、老师、电话、
汽车等等。一般都要从 属性 和 行为 两个
方面来对它们加以描述。在这里,我们
认为对象和对象的实例是同一个概念。
什么是对象?
17
对象具有的一些特征称为属性,以 一个
人 为例,他的姓名、年龄、身高、体重等
可以作为他的属性。 这些属性会有其对应
的值,一般至少会有一项区别于其它对象,
它们在程序设计中对应的是一定的 数据 。
为了达到目的,对象 必须提供的功能
(或必须提供的服务)称为对象的 行为,
在程序设计中对应一定的方法( 函数 )。
属性和行为
18
类描述了一组具有相同属性(数据
元素)和相同行为(函数)的对象。
类的数据成员是对对象属性的抽象,
类的函数成员是对对象行为的抽象,
而类本身就是对对象的抽象。
什么是类?
19
class Student // Student类的声明
{
public,// 公有成员
Student(); // 构造函数
~Student(); // 析构函数
char* GetName(); // 查询姓名
int GetAge(); // 查询年龄
char GetSex(); // 查询姓名
int GetNumber(); // 查询学号
bool SetName(char* n); // 设置姓名
bool SetAge(int age); // 设置年龄
bool SetSex(char* s); // 设置性别
bool SetNumber(int num);// 设置学号
protected,// 保护成员
char m_strName[20]; // 姓名,字符串数组
int m_nAge; // 年龄,整型
char m_cSex; // 性别,字符型
int m_nNumber; // 学号,整型
};
例,C++中类的声明 ——Student类
成员函数
成员函数
成员变量
20
……
Student A; // 声明 Student的对象 A
A.SetName(“张三” ); // 设置 A的名字
A.SetAge(20); // 设置 A的年龄
……
例,C++中类使用
21
程序=对象+对象+……
对象 1
描述问题 解决问题
面向对象程序设计方法
……
数据 算法
对象 n
数据 算法 ……
22
总的来说,
?结构化程序设计方法是一种模块化程序设计
方法,它在解决问题时是 以功能为中心 的,
一定的功能模块虽然也作用于特定的数据,
但它们并没有被封装在一起。
?面向对象程序设计方法则是 以对象为中心 来
解决问题的。属于同种对象的属性(数据)
和服务(功能)被抽象出来封装到一起。
23
二、面向对象程序设计方法
24
? 数据抽象
? 封装
? 继承
? 多态
? 动态绑定
面向对象方法的主要特点
25
数据抽象
对 象 类 抽象数据类型
抽象 抽象
具体 具体
类是一组相似对象的抽象描述,它
抽取了这些对象的共性组成了一个共同
的概念。抽象数据类型( Abstract
Data Type,ADT)是一组相似的类的抽
象,而一个类又是 ADT的具体实现。
26
封装是指软件的组成部分(模块、子
程序、方法等)应该 互相独立,或者 隐
藏设计的细节 。在传统的方法中,封装
通常局限于将功能和数据分开封装;而
在面向对象方法中,封装将功能和数据
同时装入对象中。
参看 Student类的例子
封 装
27
class Student // Student类的声明
{
public,// 公有成员
Student(); // 构造函数
~Student(); // 析构函数
char* GetName(); // 查询姓名
int GetAge(); // 查询年龄
char GetSex(); // 查询姓名
int GetNumber(); // 查询学号
bool SetName(char* n); // 设置姓名
bool SetAge(int age); // 设置年龄
bool SetSex(char* s); // 设置性别
bool SetNumber(int num);// 设置学号
protected,// 保护成员
char m_strName[20]; // 姓名,字符串数组
int m_nAge; // 年龄,整型
char m_cSex; // 性别,字符型
int m_nNumber; // 学号,整型
};
例,C++中类的声明 ——Student类
28
如果类与类之间有 is-a(是一种)的
关系,那么可以采用继承机制来表示。
子类可以自动继承父类中的一些属性和
行为,而不必再进行定义,从而实现了
代码的复用 。同时,继承也是产生 新类
的方法之一。
继 承
29
从上图可以看出,学生和教师都是人
的一种,所以,学生类和教师类可以从
人类继承而来,从而实现了代码的共享。

学 生 教 师
30
class People // People类的声明
{
public,// 公有成员
People(); // 构造函数
~People(); // 析构函数
char* GetName(); // 查询姓名
int GetAge(); // 查询年龄
……
bool SetName(char* n); // 设置姓名
bool SetAge(int age); // 设置年龄
……
private,// 私有成员
protected,// 保护成员
char m_strName[20]; // 姓名,字符串数组
int m_nAge; // 年龄,整型
char m_cSex; // 性别,字符型
……
};
类的声明举例 ——People类
31
class Teacher,public People // Teacher类的声明
{
public,// 公有成员
Teacher(); // 构造函数
~Teacher(); // 析构函数
bool IsTeaching(); // 查询是否授课
……
private,// 私有成员
……
protected,// 保护成员
bool m_bIsTeaching // 是否授课
……
};
类的声明举例 ——Teacher类
32
class Student, public People
{
public,
Student(); // 构造函数
~Student(); // 析构函数
int GetNumber(); // 查询学号
bool SetNumber(int n); // 设置学号
……
private,
……
protected,
int m_nNumber; // 学号
……
};
类的声明举例 ——Student类
33
在程序中同一符号或名字在不同情况
下具有不同解释的现象称为多态性
( Polymorphism)。在面向对象程序设
计语言中,由程序员设计的多态性由两
种基本形式,编译时多态性 和 运行时多
态性 。许多程序设计语言都或多或少地
支持多态性,但 运行时多态性是面向对
象程序设计语言的一大特点 。
多 态
34
编译时多态性 是指在程序编译阶段即可
确定下来的多态性,主要通过使用重载
( Overloading)机制获得,重载机制包括
函数重载 和 运算符重载 两大类。
举一个 C++中的例子,
int Abs(int x);
double Abs(double x);
cout<<Abs(-4)<<endl; //调用 int Abs…
cout<<Abs(3.2)<<endl;//调用 double Abs…
35
运行时多态性 是指必须等到程序动态
运行时才可确定的多态性,主要通过 继
承 结合 动态绑定 获得。
动态绑定也称晚绑定,它也是面向对
象的重要特点之一。动态绑定的使用可
以提高程序的可用性和可扩展性。
36
…… 科德方法
面向对象方法
37
三,C++语言
38
C 语 言
C语言的优点,
?与硬件无关,可移植性强
?语言简洁,使用方便
?丰富的运算符和数据类型
?可直接访问内存地址
?能进行位操作
?目标代码质量高,运行效率高
39
C语言的弱点,
?检查机制弱,编译时不能发现编程错误
?面向过程的语言,没有支持代码复用的
机制
?很难控制大规模程序的复杂性
40
C++ 语 言
?是 C的超集,保持了与 C的 兼容 性
?继承了 C语言 高效性, 灵活性 的特点
?扩充了对 面向对象程序设计 和 高层次问题抽象
方法的支持,是面向对象程序设计语言之一
?完善了 C语言的 类型检查, 代码重用, 数据抽
象 机制,便于大规模软件开发
?既反映了 结构化 程序设计方法,又反映了 面向
对象 程序设计方法
41
基本数据类型
构造数据类型
整型 ( int)
实数型
字符型 ( char)
空类型 ( void)
布尔型 ( bool)
引申数据类型
结构化数据类型
指针 ( *)
引用 ( &)
数组 ( [])
结构 (struct)
联合 (union)
枚举 ( enum)
类 (class)
浮点型 ( float)
双精度型 ( double)
C++中的数据类型
42
class 类名
{
public,
公有数据和函数
protected,
受保护数据和函数
private,
私有数据和函数
};
类的声明
43
class People // People类的声明
{
public,// 公有成员
People(); // 构造函数
~People(); // 析构函数
char* GetName(); // 查询姓名
int GetAge(); // 查询年龄
……
bool SetName(char *n); // 设置姓名
bool SetAge(int age); // 设置年龄
……
private,// 私有成员
protected,// 保护成员
char m_strName[20]; // 姓名,字符串数组
int m_nAge; // 年龄,整型
char m_cSex; // 性别,字符型
……
};
类的声明举例 ——People类
44
? 类名是有效的标识符,不能是关键字
(保留字)
? 数据成员在声明时不能进行初始化
? 数据成员不能是正在声明的类,但可以
用指针
? 访问控制 public,private,protected可以
以任意次序出现,并可重复多次
说 明
45
?public,公有成员, 可以被任何函数访
问 ( 即可以从类的外部进行访问 ) 。
?private,私有成员, 只有类成员函数
和友员类可以访问 。
?protected,保护成员, 只有类成员函
数, 派生类, 友员类可以访问 。
?缺省方式为 private
类成员访问控制
46
class Teacher,public People // Teacher类的声明
{
public,// 公有成员
Teacher(); // 构造函数
~Teacher(); // 析构函数
bool IsTeaching(); // 查询是否授课
……
private,// 私有成员
……
protected,// 保护成员
bool m_bIsTeaching // 是否授课
……
};
类的声明举例 ——Teacher类
47
class Student, public People
{
public,
Student(); // 构造函数
~Student(); // 析构函数
int GetNumber(); // 查询学号
bool SetNumber(int n); // 设置学号
……
private,
……
protected,
int m_nNumber; // 学号
……
};
类的声明举例 ——Student类
48
继承 多态 重载 等内容
……
49
【 1】, 面向对象系统分析与设计, Ronald J,Norman
著,周之英等译,2000
【 2】, 面向对象程序设计基础,,李师贤,李文军,
周晓聪 编著,高等教育出版社,1998
【 3】 C++语言和面向对象程序设计(第二版),宛延

【 4】 C++讲义,徐玉华、殷人昆老师提供
【 5】 http://www.cbi.pku.edu.cn/Doc/teach/cpp/
参考资料
50
结 束