析构函数
//当一个对象消亡(消失,离开了生命周期) ,即当对象的生命周期结束时,撤销类对象时候会自动调用析构函数
~CLA_NAME(void){
};
1)对象在生命期结束,撤销类对象时会自动调用析构函数。
如果在一个函数中定义了一个非静态局部对象,那当函数调用结束时候,对象被释放,在对象被释放前调用析构函数。
函数中的静态局部对象在函数调用结束时候对象并不释放,因此不调用析构函数。静态局部对象或全局作用域的对象只有在主函数结束时候,才会调用析构函数。
2)如果用new运算动态地建立一个对象,那用delete运算符释放该对象时,才会调用析构函数。
这种方式不以作用域范围为对象的生命期,而是以执行new和delete运算区间为生命期,因此这种方式可以跨越多个函数作用域。需要注意,尽管动态对象可以跨作用域范围,保存动态对象的指针变量确实以作用域范围为声明周期的。
动态对象的指针即使超出其作用域,也不会自动调用对象的析构函数,只有在指向该对象的指针被delete时才撤销。如果没有delete指向动态对象的指针,对象就一直存在,导致内存泄漏,对象内部使用的任何资源也不会释放。
注意:
1.在C++中,任何一个类中都有唯一的一个析构函数
2.如果程序员没有手动实现析构函数,那么编译器将自动生成析构函数
析构函数名 ~类名
析构函数没有返回值 也不是void
析构函数没有参数 所以不能重载
在一个类中,析构有且只有一个
一般来说,析构函数用编译器自动生成的即可,但如果需要手动释放内存,则需要自行添加
3.析构函数的调用顺序和构造函数严格相反
构造函数的执行顺序:
父类(按继承顺序)的构造函数-->类类型成员(按定义的顺序)的构造函数-->本类的构造函数
析构函数的执行顺序:
本类的析构函数-->类类型成员的析构函数(按定义顺序的逆序)-->父类的析构函数(按继承的逆序)
4.对象消亡时,自动调用析构函数
delete释放 new的对象时,调用析构函数
析构函数形如:
~类名(void){
}
#include <iostream>
using namespace std;
class Test{
public:
Test(){
cout << "无参构造" << endl;
}
//析构函数
~Test(void){
cout << "析构函数" << endl;
}
};
void func(){
Test t1;
}
int main(){
Test t;
cout << "------------" << endl;
func();
cout << "------------" << endl;
cout << "+++++++++++++++++" << endl;
Test *pt = new Test();
delete pt;
cout << "+++++++++++++++++" << endl;
Test arr[10];
return 0;
}
但是还有一种情况编译器会自动优化
#include <iostream>
using namespace std;
class Test{
public:
Test(){
cout << "无参构造" << endl;
}
//析构函数
~Test(void){
cout << "析构函数" << endl;
}
};
Test getTest(){
Test t1;//构造一个对象
return t1;//优化
}
int main(){
//Test t = getTest();//优化 只有一个对象
Test t;
t = getTest();
return 0;
}
析构函数的功能
(1)释放动态内存 比如在构造函数时 new malloc 内存
(2)关闭文件 fclose() close()
(3)删除临时文件
(4)释放资源