C++ 析构函数

析构函数

//当一个对象消亡(消失,离开了生命周期) ,即当对象的生命周期结束时,撤销类对象时候会自动调用析构函数
~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)释放资源
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HOVL_C++

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值