不同情形下 对象的构造函数和析构函数的调用并不相同

对象在不同情况下的构造函数和析构函数的调用差异很大

构造函数和析构函数的调用次数有所不同

 

当对象做参数时,实参完全复制给形参,所以不需再调用构造函数

其实是调用的拷贝构造函数即CClass a();CClass b=a;

 

但形参运行时为临时变量,需调用析构函数

但对象引用做参数时,因为是原实参本身,所以在函数内不会调用析构

 

   

结果是:

constructor 2
constructor 0
constructor 4
print 4
print 2
destructor  3
destructor  2
destructor  3
print 2
print 3
destructor  3
destructor  2
Press any key to continue

 

   

结果是

constructor 2
constructor 0
constructor 4
print 4
print 2
destructor  3  (the parameter object's destruction has gone )
destructor  3
print 2
print 3
destructor  3
destructor  2
Press any key to continue

参数引用的实参析构函数没了

 多出来的析构函数是谁的呢

利用断点调试的时候可以清晰的看出constructor对应的destructor

先看下例

结果

constructor 2
constructor 0
constructor 4
destructor  3
destructor  0
destructor  2
Press any key to continue

数量一致

差别主要在return 语句

那么,问题很可能就在这里

 我们有一种猜测,就是函数返回时,先对要返回的局部变量做一份拷贝,函数返回

之后 ,才把返回值赋给被赋值变量

有待证明

 

 

结果是

constructor 2
constructor 4
print 4
print 2
destructor  3
print 2
print -858993460
destructor  2
Press any key to continue

临时对象的指针是不能做返回值的

对象指针 因没有分配对象内存而无所谓构造函数的调用了

 

如果使用new 动态分配内存,析构在delete时才调用

动态变量存在于堆内存,必须手动释放

有一个new就要有一个delete与之对应

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值