析构函数

构造函数
·成员函数的一种
·名字和类名相同
·可以有参数,不能有返回值
·可以有多个构造函数
用来初始化对象

析构函数(Destructor)
·成员函数的一种
    ·名字和类名相同
    ·在前面加 ~
    ·没有参数和返回值
    ·一个类最多只有一个析构函数

·对象消亡时---自动被调用
    ·在对象消亡前做善后工作
        ·释放分配的空间等
·定义类时没写析构函数,则编译器生成缺省析构函数
    ·不涉及释放用户申请的内存释放等清理工作
·定义了析构函数,则编译器不生成缺省析构函数
 

class String{
	private:
		char *p;
	public:
		String(){
			p = new char[10];
		}
		~String();
};
String::~String(){
	delete []p;
}

·对象数组生命期结束时
    对象数据的每个元素的析构函数都会被调用
 

class Ctest{
	public:
		~Ctest(){
			cout << "destructor called" << endl;
		}
};
int main(){
	Ctest arrat[2];
	cout << "End Main" << endl; 
	return 0;
}
输出:
End Main
destructor called
destructor called

·delete运算导致析构函数的调用
    Ctest *pTest;
    pTest = new Ctest;//构造函数调用
    delete pTest;//析构函数调用
    ----------------------------------------
    pTest = new Ctest[3];//构造函数调用3次
    delete []pTest;//析构函数调用3次

例题:

class Demo{
	int id;
	public:
		Demo(int i){
			id = i;
			cout << "id=" << id << "Constructed" << endl;
		}
		~Demo(){
			cout << "id=" << id << "Destructed" << endl;
		}
};
Demo d1(1);
void Func(){
	static Demo d2(2);
	Demo d3(3);
	cout << "Func" << endl;
}
int main(){
	Demo d4(4);
	d4 = 6;//id=6 Constructed  id=6 Destructed
	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
main
id=5 Constructed
id=5 Destructed
id=2 Constructed
id=3 Constructed
Func
id=3 Destructed
main ends
id=6 Destructed
id=2 Destructed
id=1 Destructed

先构造的对象会最后被析构掉

·个别调用情况不一致
    ·编译器有bug
    ·代码优化措施

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值