1、const
1.1 指针常量和常量指针
说说const int *a, int const *a, const int a, int *const a, const int *const a分别是什么,有什么特点。
const int *a==int const *a; //可以通过 a 访问整数值,但不能通过 a 修改该整数的值,指针本身是可变的,可以指向不同的整数
const int a; //a变量变成常量,不可修改
int *const a; //a的值可以更改,但是指向它的指针不能更改
int const *const a; //a本身和指向它的指针都不能更改
1.2 const成员函数
常函数内不能修改成员变量
对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。
1.3 const和#define的区别
1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。
而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应) 。
(2)有些集成化的调试工具可以对 const 常量进行调试,但是不能对宏常量进行调试。
(3)#define是在编译的预处理阶段起作用,而const是在编译、运行的时候起作用。
(4)#define定义的常量不分配内存,而const定义的常量会分配在常量存储区中。
具体可看以下博客7.5小节
2、 虚函数
2.1 作用
父类型的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。
2.2 实现
每个虚函数都会有一个与之对应的虚函数表,该虚函数表的实质是一个指针数组,存放的是每一个对象的虚函数入口地址。对