C++ - 析构函数
2016-01-14 本文已影响68人
Mitchell
- 成员函数的一种
- 名字与类名相同
- 在前面加“~”
- 没有参数和返回值
- 一个类最多只有一个析构函数
- 对象消亡时候 - > 自动被调用
- 在对象消亡前做善后工作
- 释放分配的空间等
- 定义类时没写析构函数,则编译器生成缺省析构函数
- 不涉及释放用户申请的内存释放等清理工作
- 定义了析构函数,则编译器不生成缺省析构函数
class String{
private:
char * p;
public:
String(){
p = new char[10];
}
~String();
};
String::~String(){
//注意,由于要释放的是数组,所以前面必须有[],如果用 delete p 只是释放了一个对象。
delete [] p;
}
- 对象数组生命周期结束时
-> 对象数组的每个元素的析构函数都会被调用 - delete 运算导致析构函数调用
Ctest * pTest;
p'Test = new Ctest;// 构造函数调用
delete pTest;//析构函数调用
pTest = new Ctest[3];//构造函数调用3次
delete[] pTest;//析构函数调用3次
- 析构的顺序
Demo d1(1);
void Func(){
static Demo d2(2);
Demo d3(3);
cout<<"Func"<<endl;
}
int main(){
Demo d4(4);
d4 = 6;
cout<<"main"<<endl;
{Demo d5(5); }
Func();
cout<<"main ends"<<endl;
return 0;
}
输出:
id = 1 Constructed
id = 4 Constructed
//复制构造函数会创建一个临时的对象
id = 6 Constructed
id = 6 Destructed// d4的 id = 6
main
id = 5 Constructed
id = 5 Destructed
id = 2 Constructed
id = 3 Constructed
Func
id = 3 Destructed
main ends
id = 6 Destructed//d4
id = 2 Destructed
id = 1 Destructed