问题描述
- 关于c++中默认拷贝构造函数的理解
-
如题,请解释一次详细的原理
假如我定义一个类的对象a,然后在没有自己编写构造函数的情况下用语句A b=a来初始化新的对象b,会发生什么,为什么?
解决方案
编译器会给你产生一个默认的拷贝构造函数,执行的是浅拷贝。所谓浅拷贝,就是直接字段的拷贝。如果对象包含一个指针,那么两个对象都指向同一个地址。
解决方案二:
如果未提供自己的拷贝构造函数,则C++提供一个默认拷贝构造函数,就像没有提供构造函数时,C++提供默认构造函数一样。
C++提供的默认拷贝构造函数工作的方法是:完成一个成员一个成员的拷贝,如果成员是类对象,则调用其拷贝构造函数或者默认拷贝构造函数。
在默认拷贝构造函数中,拷贝的策略是逐个成员依次拷贝,但是,一个类可能会拥有资源,如果拷贝构造函数
简单地制作了一个该资源的拷贝,而不对它本身分配,就得面临一个麻烦的局面:两个对象都拥有同一个资源
。当对象析构时,该资源将经历两次资源返还(两次delete,导致出错)。
解决方案三:
如果没有在类的定义中声明并实现自己的拷贝构造函数,编译器将会自动帮你生成一个浅拷贝的拷贝构造函数。
所谓的浅拷贝,就是将两个类中对应的元素相赋值。即将a中的成员一个一个对应地赋值给b中的成员,然后完成b的构建
如果类里面没有指针,浅拷贝和深拷贝产生的效果一样;
如果类里面有指针,浅拷贝就只会将a中指针的值赋值给b中的指针,那么就只是a与b中的指针指向同一个区域而已,
而我们的本意无疑是应该想要b中的指针指向另一个区域,这个区域中的内容和a中指向的区域的内容相等。
所以这个时候,就需要我们自己去写拷贝构造函数,完成深拷贝
解决方案四:
对c++拷贝构造函数的一点理解
linux平台C++中拷贝构造函数及“=”重载的理解
c++默认的拷贝构造函数是浅拷贝
解决方案五:
如果你没有提供构造拷贝函数,编译器会为你自动合成一个
时间: 2024-12-27 11:46:43