基类的析构函数为什么要用virtual
与构造函数相反,当对象结束其生命周期,系统自动执行析构函数(如对象所在的函数已调用完毕时)。
析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,delete会自动调用析构函数后释放内存)。
为了避免内存泄漏,而且是当子类中会有指针成员变量时才会使用得到的。也就说虚析构函数使得在删除指向子类对象的基类指针时可以调用子类的析构函数达到释放子类中堆内存的目的,而防止内存泄露的.
(1)如果父类的析构函数不加virtual关键字
当父类的析构函数不声明成虚析构函数的时候,当子类继承父类,父类的指针指向子类时,delete掉父类的指针,只调动父类的析构函数,而不调动子类的析构函数。
(2)如果父类的析构函数加virtual关键字
当父类的析构函数声明成虚析构函数的时候,当子类继承父类,父类的指针指向子类时,delete掉父类的指针,先调动子类的析构函数,再调动父类的析构函数
const和static
const 是 constant 的缩写,本意是不变的,不易改变的意思。在 C++ 中是用来修饰内置类型变量,自定义对
一、修饰变量
const修饰普通类型的变量
const int a=7;
const 修饰指针变量。
关于指针:
int *p=&a;这一句作用相当于int *p;p=&a;
这句话的意思是定义一个int类型指针,然后用a的地址赋值给p;
所以*p就是取a地址中存放的值;
1.const 修饰指针指向的内容,则内容为不可变量。
2.const 修饰指针,则指针为不可变量。
3.const 修饰指针和指针指向的内容,则指针和指针指向的内容都为不可变量。
1)const int *p
2)int const *p
3)int * const p
4)const int * const p
(1)
当把 const 放最前面的时候,它修饰的就是 *p,那么 *p 就不可变。*p 表示的是指针变量 p 所指向的内存单元里面的内容,此时这个内容不可变。其他的都可变,如 p 中存放的是指向的内存单元的地址,这个地址可变,即 p 的指向可变。但指向谁,谁的内容就不可变。
(2)
const只修饰其后的变量,int const *p 和 const int *p等价
(3)
int * const p
此时 const 修饰的是 p,所以 p 中存放的内存单元的地址不可变,而内存单元中的内容可变。即 p 的指向不可变,p 所指向的内存单元的内容可变。
(4)
*p 和 p 都被修饰了,那么 p 中存放的内存单元的地址和内存单元中的内容都不可变。
修饰函数参数
char* str(char* str1, const char* str2);
str1可以被修改,而str2不能修改。
修饰返回值
如果是值传递,没有必要将返回值用const 修饰,例如,
const int func();
函数的返回值为一个int 类型的值,这只是个临时的值,没有必要用const 修饰,最终这个值会复制给接受它的变量。
如果返回值为指针,加上const修饰之后内容是不能修改的,接受的变量也必须是const 修饰。
const char* func();
char* str = func();
const char* str = func();
修饰成员函数
成员函数名后加上const,即表明该函数为常成员函数。常成员函数的const隐式修饰this指针,即对象不可修改,所以,常成员函数只能访问成员变量,而不能修改。只能调用其他常成员函数。
修饰对象
修饰对象时只能访问成员变量,不能修改。只能调用常成员函数。
static
#include
using namespace std;
static int x = 0; //全局静态变量
int main(void)
{
static int y = 0; //局部静态变量
return 0;
}
静态局部变量局部变量:它的作用域仅限于函数内部,生命周期直接结束。
局部静态变量:它的作用域仅限于函数内部,生命周期直到程序结束。
静态全局变量在单个文件中,全局静态变量与静态变量是一样的,
当一个程序由多个文件组成,全局变量在各个源文件中都有效,但静态全局变量只能在当前文件中使用
全局变量、静态全局变量、静态局部变量的默认值都是0;
静态函数在函数的返回类型前加上static关键字,函数即被定义为静态函数。静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。
成员变量和成员函数前加上关键字static,称为静态成员。
静态成员变量
所有对象共享一份数据、在编译阶段分配内存、类内声明,在类外定义。
类中的静态成员变量必须在类内声明,在类外定义(被const修饰的除外).
访问静态成员变量的两种方法:
- 通过对象访问静态成员变量;
- 通过类名访问静态成员变量;
静态成员函数
所有对象共享同一个函数;
静态成员函数只能访问静态成员变量
Static总结static局部变量 将一个变量声明为函数的局部变量,那么这个局部变量在函数执行完成之后不会被释放,而是继续保留在内存中
static 全局变量 表示一个变量在当前文件的全局内可访问
static 函数 表示一个函数只能在当前文件中被访问
static 类成员变量 表示这个成员为全类所共有
static 类成员函数 表示这个函数为全类所共有,而且只能访问静态成员变量
象,成员函数,返回值,函数参数。



