学习没有捷径,但考试有捷径
临近考试,虽然之前对一些概念搞清楚了,但时日一长,很多又模糊了。因此利用整理成章,将知识重拾。
考试的范围如下:
- 常量(const、符号、字符串常量、立即数)
- 引用和指针
- 类的封装和隐藏(静态成员、友元函数)
- 类的初始化(初始化方式和顺序)
- 类的继承(继承方式、构函列表、多继承)
- 类的多态性(函数重载、运算符重载、虚函数、虚函数表)
- 类的作用域概念
多态性
- 运算符重载
- 函数名重载
- 虚函数
运算符重载
规则
- 不可创造新的运算符
- 不可修改基本数据类型的运算符操作
- 不可重载的运算符
*
::
.
? :
一个疑惑
在实现极坐标形式复数的表示时,疑惑:
如何重载乘法符号*
?
答案:可以重载,仅
*
做为取内容运算符时不能重载
函数名重载
避免二义性问题
void fun(void);
void fun(int a = 6);
不可同时使用,最好使用参数默认方式
子类型
公有继承时,派生类是基类的子类型
派生类的对象可以做为基类的对象进行处理,需要基类对象的任何地方都可以使用公有派生类的对象来代替,可以使用相同的函数统一处理。
关系可以传递,但不可逆
可以将派生类赋值给基类
指针
一个指向基类的指针可以指向任何公有派生类的对象
虚函数
将基类函数(成员函数,除构造函数)指定为虚函数
virtual void printStandard();
则派生类可对其进行重新定义,若不修改则沿用基类函数
必须完全一致
函数形参为基类引用或指针,实参传入派生类对象,若调用函数为虚函数则可调用派生类对应的函数。
但仅在派生类中重新定义只能调用基类函数。
- 派生类中重定义结果
- 派生类对象访问派生类函数,基类对象访问基类函数,不会重载
- 派生类函数调用基类同名函数加基类作用域
虚函数表(virtual function table)
- 每个虚函数的类有一个虚函数表
- 虚函数表包括此类调用的函数指针
- 每个对象含指针指向对应的虚函数表
- 调用虚函数时,通过对象的指针找到对应调用函数
纯虚函数
基类需要靠派生类提供各个具体实现版本
基类为抽象类,可传递
virtual void printStandard()=0;
可以在声明为虚函数的同时,提供实现版本
不得声明纯虚函数为内联函数
虚析构函数
- 一个基类指定为虚析构函数,则继承的派生类都为虚析构函数
- 当某层的虚析构函数执行后,自动调用直接基类的虚析构函数