2 qq 31630271 qq_31630271 于 2016.04.13 00:30 提问

关于c++中默认拷贝构造函数的理解
c++

如题,请解释一次详细的原理
假如我定义一个类的对象a,然后在没有自己编写构造函数的情况下用语句A b=a来初始化新的对象b,会发生什么,为什么?

5个回答

caozhy
caozhy   Ds   Rxr 2016.04.13 00:42

编译器会给你产生一个默认的拷贝构造函数,执行的是浅拷贝。所谓浅拷贝,就是直接字段的拷贝。如果对象包含一个指针,那么两个对象都指向同一个地址。

qq423399099
qq423399099   Ds   Rxr 2016.04.13 09:34

如果未提供自己的拷贝构造函数,则C++提供一个默认拷贝构造函数,就像没有提供构造函数时,C++提供默认构造函数一样。
C++提供的默认拷贝构造函数工作的方法是:完成一个成员一个成员的拷贝,如果成员是类对象,则调用其拷贝构造函数或者默认拷贝构造函数。
在默认拷贝构造函数中,拷贝的策略是逐个成员依次拷贝,但是,一个类可能会拥有资源,如果拷贝构造函数
简单地制作了一个该资源的拷贝,而不对它本身分配,就得面临一个麻烦的局面:两个对象都拥有同一个资源
。当对象析构时,该资源将经历两次资源返还(两次delete,导致出错)。

luojj26
luojj26   2016.04.13 13:08

如果没有在类的定义中声明并实现自己的拷贝构造函数,编译器将会自动帮你生成一个浅拷贝的拷贝构造函数。
所谓的浅拷贝,就是将两个类中对应的元素相赋值。即将a中的成员一个一个对应地赋值给b中的成员,然后完成b的构建
如果类里面没有指针,浅拷贝和深拷贝产生的效果一样;
如果类里面有指针,浅拷贝就只会将a中指针的值赋值给b中的指针,那么就只是a与b中的指针指向同一个区域而已,
而我们的本意无疑是应该想要b中的指针指向另一个区域,这个区域中的内容和a中指向的区域的内容相等。
所以这个时候,就需要我们自己去写拷贝构造函数,完成深拷贝

CSDNXIAON
CSDNXIAON   2016.04.13 15:12

对c++拷贝构造函数的一点理解
linux平台C++中拷贝构造函数及“=”重载的理解
c++默认的拷贝构造函数是浅拷贝
----------------------同志你好,我是CSDN问答机器人小N,奉组织之命为你提供参考答案,编程尚未成功,同志仍需努力!

VisualEleven
VisualEleven   Ds   Rxr 2016.04.14 16:55

如果你没有提供构造拷贝函数,编译器会为你自动合成一个

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!