也谈C++深拷贝、浅拷贝和函数返回值作参数及其临时变量的生存期

本文针对C++中的深拷贝和浅拷贝概念进行探讨,通过分析不同情况下函数返回值赋值给对象时的临时变量生存期,揭示了书中错误的解释。程序示例展示了构造函数、深拷贝构造函数、赋值运算符的调用顺序和作用,强调了临时对象的生命周期以及赋值运算与深拷贝的区别。
摘要由CSDN通过智能技术生成

    为什么会要会想要谈谈这个话题呢,因为最近在看书的时候发现一本书上的一个例程有关于用函数返回值赋值一个对象时,注释说先清除临时对象,再清除函数内作返回值的局部对象。考虑了下,有些怀疑。于是写了几个程序想验证,结果注释掉了复制构造函数的声明作对比。然而,结果却让自己困惑了很久,特别是程序6。最后就作了下面的讨论。当然,也证明了书上说的是错误的。

    这段测试程序代码如下,打开和关闭注释可得6个程序:

#include<iostream>
using namespace std;
int count;
class test
{
private:
 int x,y;
public:
 test(){ count=count+1;cout<<"count="<<count<<" "<<"initializing..."<<&x<<endl;};
 test(int a,int b):x(a),y(b){ count=count+1; cout<<"count="<<count<<" "<<"initializing..."<<&x<<endl;}
 test(const test &);
 void Show();
 ~test(){ count=count-1; cout<<"count="<<count<<" "<<"delete"<<x<<","<<y<<&x<<endl;}
};
test::test(const test &t)
{
 x=t.x;
 y=t.y;
 count=count+1; cout<<"count="<<count<<" "<<"copying..."<<&x<<endl;
}
void test::Show()
{
 cout<<"this is "<<x<<","<<y<<endl;
}
test func()
{
 cout<<"entering func"<<endl;
 test A(1,1);
 A.Show();
 return A;
}
void display(test a)
{
 cout<<"entering display"<<endl;
 test A(2,2);
 A.Show();
}
int main()
{
 //打开复制构造函数注释则是程序1,注释掉复制构造数声明及定义是程序4
 test C;
 C=func(); 
 /*
 //打开复制构造函数注释则是程序2,注释掉复制构造数声明及定义是程序5

 test C=func();
 */ 
 /*
 //打开复制构造函数注释则是程序3,注释掉复制构造数声明及定义是程序6

 display(func());
    */
 cout<<"out display"<<endl;
 return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值