1
C++面向对象 程序设计 复习
2
第一章 面向对象程序设计概述
1.1 什么是面向对象程序设计
1.1.1 面向过程程序设计的基本概念
1.1.2 面向对象程序设计的基本概念
面向对象程序设计是一种新的程序设计范型。面向对象程序的
主要结构特点是,
第一,程序一般由类的定义和类的使用两部分组成,在主程序中定
义各对象并规定它们之间传递消息的规律;
第二,程序中的一切操作都是通过向对象发送消息来实现的,对象
接收到后,启动有关方法完成相应操作。
3
1.2 对象与类
1.2.1 对象与类概念
对象是:现实世界的一个实体,其特性是,
(1) 每一个必须有一个名字以区别于其他对象;
(2) 用属性来描述它的某些特征;
(3) 有一组操作,每一个操作决定对象的一种行为。
类是:一组具有共同的属性特征和行为特征的对象的抽象。
1.2.2 对象的状态
1.2.2 对象的交互
1.2.4 类的确定与划分
4
1.3 数据的抽象与封装
面向对象系统的特征是:封装性、继承性和多态性
1.3.1 现实世界中的抽象与封装
1.3.2 数据的抽象与封装的基本概念
将数据结构和作用于数据结构上的操作组成一个实体,数据的表示
方式和对数据的操作细节被隐藏起来,用户通过操作接口对数据
进行操作。这就是数据的封装。
1.3.3 对象的特性
1.4 继承性
1.4.1 继承的概念
允许派生类继承基类的数据和操作 (即数据成员和成员函数 ),允许
派生类使用基类的数据和操作的同时,派生类还可以增加新的数
据和操作。
1.4.2 继承的分类
1.4.3 继承与封装的关系
5
1.5 多态性
1.5.1 什么是多态性
不同的对象收到相同的消息时产生多种不同的行为方式。
1.5.2 重载的概念
1.6 面向对象程序设计语言
6
第二章 C++概述
2.1 C++的起源和特点
2.1.1 C++的起源
2.1.2 C++的特点
2.2,C++源程序的构成
2,2,1 C+=程序的一般格式
2.2.2 C++程序的结构特点
2.3 C++在非面向对象方面的一些特性
2.3.1 注释行
2.3.2 新的 I/O流
cin是标准输入流,在程序中用于代表标准输入设备,即键盘。
运算符,>>”表示向右
cout是标准输出流,在程序中用于代表标准输出设备,即屏幕。
运算符,<<”表示向左
使用 cin或 cout进行 I/O操作时,在程序中必须嵌入头文件 iostream.h
7
2.3.3 灵活的局部变量说明
2.3.4 结构、联合和枚举名可直接作为类型名
2.3.5 const修饰符
2.3.6 内置函数
2.3.7 函数原型
2.3.8 带有缺省参数的函数
2.3.9函数重载
2.3.10作用域运算符,,
2.3.11无名联合
2.3.12 强制类型转换
2.3.13 new和 delete
2.3.14 引用
引用可为变量起别名,它主要用作函数参数以及函数的返回类
型。有参数引用和返回值引用。
8
第三章 类和对象
3.1 类与对象的基本概念
3.1.1 结构与类
(1) 结构的扩充
(2) 类的定义
3.1.2 成员函数的定义
第一种方式是在类定义中只给出成员函数的原形,而成员函数体
在类的外部定义。
第二种方式是将成员函数定义在类的内部,即定义为内置函数。
(1) 隐式定义
(2) 显式定义
3.1.3 对象的定义及引用
1,类与对象的关系
2,对象的定义
3,对象的引用
外部函数不能引用对象的私有成员
4,对象的赋值语句
3.1.4 类的作用域
9
3.2 构造函数与析构函数
3.2.1 构造函数
构造函数的特点,
(1) 构造函数的名字必须与类名相同
(2) 构造函数可以有任意类型的參数,但不能具有返回值
(3) 定义对象时,编译系统会自动地调用构造函数
3.2.2 缺省参数的构造函数
3.2.3 析构函数
3.3.4 重载构造函数
3.3.5 拷贝构造函数
3.3 对象数组与对象指针
3.3.1 对象数组
3.3.2 对象指针
3.3.3 this 指针
3.4 向函数传递对象
3.5 静态成员
3.5.1 静态数据成员
3.5.2 静态成员函数
10
3.6 友元
友元:不属于任何类的一般函数,另一个类的成员函数,整个的一
个类。
3.6.1 友元函数
不属于任何类的一般函数
3.6.2 友元成员
该函数是另一个类的成员函数,前加上 friend表示该另类的成员
函数,又是本类的友元成员。
3.6.3 友元类
在类内说明一个类 (该类前面已定义 ),前加上 friend表示该类是
本类的友元类。友元类的所有成员函数可以访问它自己类私有成
员又可本类的私有成员
3.7 对象成员
11
第四章 派生类与继承
4.1 派生类的概念
4.1.1 为什么要使用继承
4.1.2 派生类的声明
派生方式可为公有派生 (用 public)和私有派生 (用 private或缺省 )。特
点如下,
(1) 基类中的私有成员既不允许外部函数访问,也不允许派生类中
的成员函数访问,当然可以通过基类提供的公有成员函数访问。
(2)公有派生和私有派生的不同点在于基类中的公有成员在派生类
中的访问属性
公有派生时,基类中的所有公有成员在派生类中也都是公有的。
私有派生时,基类中的所有公有成员只能成为派生类中的私有
成员。
4.1.3 基类的保护成员作用
4.2 派生类的构造函数和析构函数
4.2.1 派生类的构造函数和析构函数执行顺序
当派生类的基类构造函数含有参数时,必须定义派生类的构造函数。
12
格式为,
派生类的构造函数名 (参数表 ):基类的构造函数名 (参数表 )
当派生类中还含有对象成员时,其构造函数的格式为,
派生类的构造函数名 (参数表 ):基类的构造函数名 (参数表 ),对象成员
1(参数表 ),...,
对象成员 n(参数表 ) { //.....,}
定义派生类对象时构造函数执行顺序,
基类的构造函数 对象成员构造函数 派生类的构造函数;
当撤消派生类对象时,析构函数执行顺序正好相反
4.3 多重继承
4.3.1 多重继承的声明
4.3.2 多重继承的构造函数和析构函数
4.3.3 虚基类
一个派生类从多个基类派生,而这些基类又有一个相同的基类,
则在派生类访问这个共同基类的成员时会产生二义性,如果希望
基类只有一个拷贝,则在定义时把基类说明成虚基类,加上
virtual,
13
第五章 多态性
5.1 编译时的多态性与运行时的多态性
静态联编(前期联编)
静态联编要求在程序编译时就知道调用哪个函数,就决定如何
实现某一动作。
动态联编(后期联编、滞后联编)
一直要到程序运行时才能确定调用哪个函数。系统在运行时才动
态完成的联编。
静态联编支持的多态性称为编译时多态性,也称静态多态性。在
C++中,编译时多态性是通过 函数重载 和 运算符重载 实现的。
动态联编支持的多态性称为运行时多态性,也称动态多态性。在
C++中,运行时多态性是通过 继承 和 虚函数 来实现的。
5.2 函数重载
类外的一般的函数、成员函数和构造函数都可以重载
5.3 运算符重载
在 C++中,除了可以对函数重载外,还可以对大多数运算符实施重
载。
14
5.3.1 类以外的运算符重载
5.3.2 成员运算符函数
5.3.3 友元运算符函数
5.3.4 成员运算符函数与友元运算符函数的比较
5.3.5,++”和,- -”的重载
5.3.6 赋值运算符, =”的重载
5.3.7 函数调用运算符, (), 与下标运算符, []”的重载
5.3.8 类型转换
5.4 虚函数
虚函数 是一种动态的 重载方式,虚函数允许函数调用与函数体
之间的联系在运行时才建立,也就是在运行时才决定如何动作,
即所谓 动态联编
5.4.1 引入派生类后的对象指针
( 1) 基类的指针可以指向它的公有派生类的 对象。但不允许 指向
它的私有派生类的 对象 。
( 2) 派生类的指针 不允许 指向它的基类的 对象。
15
( 3) 基类的指针指向它的公有派生类的 对象时,只能用它来直接
访问 派生类 中从 基类 继承来的成员,而不能直接访问 公有派生类
中定义的新成员。
5.4.2 虚函数的定义及使用
1,虚函数的作用
2,虚函数的定义
虚函数就是在基类中被关键字 virtual说明,并在派生类中重新定
义的函数 。在派生类中重新定义时,其函数原型,包括返回类型、
函数名、参数个数与参数类型的顺序,都必须与基类中的原形完
全相同
5.4.3 纯虚函数和抽象类
纯虚函数是一个在基类中说明的虚函数,它在该基类中没有定义,
但要求在它的派生类中定义自己的版本。
纯虚函数的一般形式如下,
virtual type func_name(参数表 )=0;
抽象类 如果一个类至少有一个纯虚函数,那么就称该类为 抽象类
16
第六章 模 板
6.1 模板的概念
6.2 函数模板与模板函数
所谓函数模板,就是写一个 函数模子,用这个模子 套印出许多
功能相同,参数类型和返回类型不同的 函数 。
模板函数:函数模板实例化后的具体函数。
6.2.1 函数模板的声明与模板函数的生成
函数模板的声明格式如下,
template <class type>
返回类型 函数名(参数表)
{
函数体
}
type是模板形参,在使用函数模板时,必须将其实例化,即用实际
的数据类型替代它 。
17
6.3 类模板和模板类
类模板 (也称为类属类或类生成类 )是:允许用户为类定义一种模子,
使得类中的某些数据成员,某些成员函数的参数或者返回值,能取
任意数据类型。
模板类:类模板实例化成一个具体的类;类名 <实际的类型 >对
象名。
18
第七章 C++的 I/O流类库
7.1 C++为何建立自己的输入输出系统
7.2 C++的流及流类库
7.2.1 C++的流
7.2.2 流类库
7.3 输入输出的格式控制
7.3.1 用 ios 类的成员函数进行格式控制
ios类中有几个成员函数可以用来对输入输出进行格式控制。
主要控制 状态标志字, 域 宽, 填充字符 及 输出精度 。
7.3.2 使用操作符进行输入输出格式控制
操作符:称为操纵函数的特殊函数
7.4 用户自定义类型的输入输出
7.4.1 重载输出运算符, <<”
7.4.2 重载输入运算符, >>”
7.5 文件的输入输出
7.5.1 文件的打开与关闭
在实际编程时,打开一个文件的最常见的形式为,
ofstream out (”test”) ; 用 if (!out) 检测是否打开成功
19
7.5.2 文件的读写
在含有文件操作的程序中,必须有如下的预处理命令,
# include <fstream.h>
1,文本文件的读写
文件打开后,文本文件的读写使用运算符,<<”与,>>”,只是必
须用与文件相连接的流代替 cin和 cout。
2,二进制文件的读写
任何文件,无论它包含格式化的文本还是包含原始数据,都能以
文本方式或二进制方式打开。文本文件是字符流,而二进制文件
是字节流。
3,文件的随机读写
定义了几个与在输出流中随机移动文件指针的成员函数 。
20
复习重点
一、有关概念
在以上复习中论述的概念
二、程序错误
1,变量定义、类定义、对象定义
2,类的作用域
3,各种函数的定义及调用
4.派生类与继承中的访问权限
5.虚函数和 引入派生类后的对象指针
三、阅读程序
1.派生类的构造函数和析构函数执行顺序
2.派生和继承的应用
3.抽象类的应用 (5.5)
4.类模板 的应用
5.文件读写的习题
四、程序设计
1,定义类、成员函数及构造函数的习题
2,链表的操作
C++面向对象 程序设计 复习
2
第一章 面向对象程序设计概述
1.1 什么是面向对象程序设计
1.1.1 面向过程程序设计的基本概念
1.1.2 面向对象程序设计的基本概念
面向对象程序设计是一种新的程序设计范型。面向对象程序的
主要结构特点是,
第一,程序一般由类的定义和类的使用两部分组成,在主程序中定
义各对象并规定它们之间传递消息的规律;
第二,程序中的一切操作都是通过向对象发送消息来实现的,对象
接收到后,启动有关方法完成相应操作。
3
1.2 对象与类
1.2.1 对象与类概念
对象是:现实世界的一个实体,其特性是,
(1) 每一个必须有一个名字以区别于其他对象;
(2) 用属性来描述它的某些特征;
(3) 有一组操作,每一个操作决定对象的一种行为。
类是:一组具有共同的属性特征和行为特征的对象的抽象。
1.2.2 对象的状态
1.2.2 对象的交互
1.2.4 类的确定与划分
4
1.3 数据的抽象与封装
面向对象系统的特征是:封装性、继承性和多态性
1.3.1 现实世界中的抽象与封装
1.3.2 数据的抽象与封装的基本概念
将数据结构和作用于数据结构上的操作组成一个实体,数据的表示
方式和对数据的操作细节被隐藏起来,用户通过操作接口对数据
进行操作。这就是数据的封装。
1.3.3 对象的特性
1.4 继承性
1.4.1 继承的概念
允许派生类继承基类的数据和操作 (即数据成员和成员函数 ),允许
派生类使用基类的数据和操作的同时,派生类还可以增加新的数
据和操作。
1.4.2 继承的分类
1.4.3 继承与封装的关系
5
1.5 多态性
1.5.1 什么是多态性
不同的对象收到相同的消息时产生多种不同的行为方式。
1.5.2 重载的概念
1.6 面向对象程序设计语言
6
第二章 C++概述
2.1 C++的起源和特点
2.1.1 C++的起源
2.1.2 C++的特点
2.2,C++源程序的构成
2,2,1 C+=程序的一般格式
2.2.2 C++程序的结构特点
2.3 C++在非面向对象方面的一些特性
2.3.1 注释行
2.3.2 新的 I/O流
cin是标准输入流,在程序中用于代表标准输入设备,即键盘。
运算符,>>”表示向右
cout是标准输出流,在程序中用于代表标准输出设备,即屏幕。
运算符,<<”表示向左
使用 cin或 cout进行 I/O操作时,在程序中必须嵌入头文件 iostream.h
7
2.3.3 灵活的局部变量说明
2.3.4 结构、联合和枚举名可直接作为类型名
2.3.5 const修饰符
2.3.6 内置函数
2.3.7 函数原型
2.3.8 带有缺省参数的函数
2.3.9函数重载
2.3.10作用域运算符,,
2.3.11无名联合
2.3.12 强制类型转换
2.3.13 new和 delete
2.3.14 引用
引用可为变量起别名,它主要用作函数参数以及函数的返回类
型。有参数引用和返回值引用。
8
第三章 类和对象
3.1 类与对象的基本概念
3.1.1 结构与类
(1) 结构的扩充
(2) 类的定义
3.1.2 成员函数的定义
第一种方式是在类定义中只给出成员函数的原形,而成员函数体
在类的外部定义。
第二种方式是将成员函数定义在类的内部,即定义为内置函数。
(1) 隐式定义
(2) 显式定义
3.1.3 对象的定义及引用
1,类与对象的关系
2,对象的定义
3,对象的引用
外部函数不能引用对象的私有成员
4,对象的赋值语句
3.1.4 类的作用域
9
3.2 构造函数与析构函数
3.2.1 构造函数
构造函数的特点,
(1) 构造函数的名字必须与类名相同
(2) 构造函数可以有任意类型的參数,但不能具有返回值
(3) 定义对象时,编译系统会自动地调用构造函数
3.2.2 缺省参数的构造函数
3.2.3 析构函数
3.3.4 重载构造函数
3.3.5 拷贝构造函数
3.3 对象数组与对象指针
3.3.1 对象数组
3.3.2 对象指针
3.3.3 this 指针
3.4 向函数传递对象
3.5 静态成员
3.5.1 静态数据成员
3.5.2 静态成员函数
10
3.6 友元
友元:不属于任何类的一般函数,另一个类的成员函数,整个的一
个类。
3.6.1 友元函数
不属于任何类的一般函数
3.6.2 友元成员
该函数是另一个类的成员函数,前加上 friend表示该另类的成员
函数,又是本类的友元成员。
3.6.3 友元类
在类内说明一个类 (该类前面已定义 ),前加上 friend表示该类是
本类的友元类。友元类的所有成员函数可以访问它自己类私有成
员又可本类的私有成员
3.7 对象成员
11
第四章 派生类与继承
4.1 派生类的概念
4.1.1 为什么要使用继承
4.1.2 派生类的声明
派生方式可为公有派生 (用 public)和私有派生 (用 private或缺省 )。特
点如下,
(1) 基类中的私有成员既不允许外部函数访问,也不允许派生类中
的成员函数访问,当然可以通过基类提供的公有成员函数访问。
(2)公有派生和私有派生的不同点在于基类中的公有成员在派生类
中的访问属性
公有派生时,基类中的所有公有成员在派生类中也都是公有的。
私有派生时,基类中的所有公有成员只能成为派生类中的私有
成员。
4.1.3 基类的保护成员作用
4.2 派生类的构造函数和析构函数
4.2.1 派生类的构造函数和析构函数执行顺序
当派生类的基类构造函数含有参数时,必须定义派生类的构造函数。
12
格式为,
派生类的构造函数名 (参数表 ):基类的构造函数名 (参数表 )
当派生类中还含有对象成员时,其构造函数的格式为,
派生类的构造函数名 (参数表 ):基类的构造函数名 (参数表 ),对象成员
1(参数表 ),...,
对象成员 n(参数表 ) { //.....,}
定义派生类对象时构造函数执行顺序,
基类的构造函数 对象成员构造函数 派生类的构造函数;
当撤消派生类对象时,析构函数执行顺序正好相反
4.3 多重继承
4.3.1 多重继承的声明
4.3.2 多重继承的构造函数和析构函数
4.3.3 虚基类
一个派生类从多个基类派生,而这些基类又有一个相同的基类,
则在派生类访问这个共同基类的成员时会产生二义性,如果希望
基类只有一个拷贝,则在定义时把基类说明成虚基类,加上
virtual,
13
第五章 多态性
5.1 编译时的多态性与运行时的多态性
静态联编(前期联编)
静态联编要求在程序编译时就知道调用哪个函数,就决定如何
实现某一动作。
动态联编(后期联编、滞后联编)
一直要到程序运行时才能确定调用哪个函数。系统在运行时才动
态完成的联编。
静态联编支持的多态性称为编译时多态性,也称静态多态性。在
C++中,编译时多态性是通过 函数重载 和 运算符重载 实现的。
动态联编支持的多态性称为运行时多态性,也称动态多态性。在
C++中,运行时多态性是通过 继承 和 虚函数 来实现的。
5.2 函数重载
类外的一般的函数、成员函数和构造函数都可以重载
5.3 运算符重载
在 C++中,除了可以对函数重载外,还可以对大多数运算符实施重
载。
14
5.3.1 类以外的运算符重载
5.3.2 成员运算符函数
5.3.3 友元运算符函数
5.3.4 成员运算符函数与友元运算符函数的比较
5.3.5,++”和,- -”的重载
5.3.6 赋值运算符, =”的重载
5.3.7 函数调用运算符, (), 与下标运算符, []”的重载
5.3.8 类型转换
5.4 虚函数
虚函数 是一种动态的 重载方式,虚函数允许函数调用与函数体
之间的联系在运行时才建立,也就是在运行时才决定如何动作,
即所谓 动态联编
5.4.1 引入派生类后的对象指针
( 1) 基类的指针可以指向它的公有派生类的 对象。但不允许 指向
它的私有派生类的 对象 。
( 2) 派生类的指针 不允许 指向它的基类的 对象。
15
( 3) 基类的指针指向它的公有派生类的 对象时,只能用它来直接
访问 派生类 中从 基类 继承来的成员,而不能直接访问 公有派生类
中定义的新成员。
5.4.2 虚函数的定义及使用
1,虚函数的作用
2,虚函数的定义
虚函数就是在基类中被关键字 virtual说明,并在派生类中重新定
义的函数 。在派生类中重新定义时,其函数原型,包括返回类型、
函数名、参数个数与参数类型的顺序,都必须与基类中的原形完
全相同
5.4.3 纯虚函数和抽象类
纯虚函数是一个在基类中说明的虚函数,它在该基类中没有定义,
但要求在它的派生类中定义自己的版本。
纯虚函数的一般形式如下,
virtual type func_name(参数表 )=0;
抽象类 如果一个类至少有一个纯虚函数,那么就称该类为 抽象类
16
第六章 模 板
6.1 模板的概念
6.2 函数模板与模板函数
所谓函数模板,就是写一个 函数模子,用这个模子 套印出许多
功能相同,参数类型和返回类型不同的 函数 。
模板函数:函数模板实例化后的具体函数。
6.2.1 函数模板的声明与模板函数的生成
函数模板的声明格式如下,
template <class type>
返回类型 函数名(参数表)
{
函数体
}
type是模板形参,在使用函数模板时,必须将其实例化,即用实际
的数据类型替代它 。
17
6.3 类模板和模板类
类模板 (也称为类属类或类生成类 )是:允许用户为类定义一种模子,
使得类中的某些数据成员,某些成员函数的参数或者返回值,能取
任意数据类型。
模板类:类模板实例化成一个具体的类;类名 <实际的类型 >对
象名。
18
第七章 C++的 I/O流类库
7.1 C++为何建立自己的输入输出系统
7.2 C++的流及流类库
7.2.1 C++的流
7.2.2 流类库
7.3 输入输出的格式控制
7.3.1 用 ios 类的成员函数进行格式控制
ios类中有几个成员函数可以用来对输入输出进行格式控制。
主要控制 状态标志字, 域 宽, 填充字符 及 输出精度 。
7.3.2 使用操作符进行输入输出格式控制
操作符:称为操纵函数的特殊函数
7.4 用户自定义类型的输入输出
7.4.1 重载输出运算符, <<”
7.4.2 重载输入运算符, >>”
7.5 文件的输入输出
7.5.1 文件的打开与关闭
在实际编程时,打开一个文件的最常见的形式为,
ofstream out (”test”) ; 用 if (!out) 检测是否打开成功
19
7.5.2 文件的读写
在含有文件操作的程序中,必须有如下的预处理命令,
# include <fstream.h>
1,文本文件的读写
文件打开后,文本文件的读写使用运算符,<<”与,>>”,只是必
须用与文件相连接的流代替 cin和 cout。
2,二进制文件的读写
任何文件,无论它包含格式化的文本还是包含原始数据,都能以
文本方式或二进制方式打开。文本文件是字符流,而二进制文件
是字节流。
3,文件的随机读写
定义了几个与在输出流中随机移动文件指针的成员函数 。
20
复习重点
一、有关概念
在以上复习中论述的概念
二、程序错误
1,变量定义、类定义、对象定义
2,类的作用域
3,各种函数的定义及调用
4.派生类与继承中的访问权限
5.虚函数和 引入派生类后的对象指针
三、阅读程序
1.派生类的构造函数和析构函数执行顺序
2.派生和继承的应用
3.抽象类的应用 (5.5)
4.类模板 的应用
5.文件读写的习题
四、程序设计
1,定义类、成员函数及构造函数的习题
2,链表的操作