可能是重复问题:
什么是深拷贝和浅拷贝之间的区别?
深拷贝和浅拷贝有什么区别?复制构造函数会生成哪种类型的副本?
可能是重复问题:
什么是深拷贝和浅拷贝之间的区别?
深拷贝和浅拷贝有什么区别?复制构造函数会生成哪种类型的副本?
浅拷贝:
拷贝的某些成员可能会引用与原始对象相同的对象:
class X
{
private:
int i;
int *pi;
public:
X()
: pi(new int)
{ }
X(const X& copy) // <-- copy ctor
: i(copy.i), pi(copy.pi)
{ }
};
在这里,原始对象和复制对象中的pi
成员都将指向相同的int
。
深拷贝:
原始对象的所有成员都被克隆(必要时进行递归)。没有共享对象。
class X
{
private:
int i;
int *pi;
public:
X()
: pi(new int)
{ }
X(const X& copy) // <-- copy ctor
: i(copy.i), pi(new int(*copy.pi)) // <-- note this line in particular!
{ }
};
在这里,原始对象和复制后的 X
对象的 pi
成员会指向不同的 int
对象,但这两个对象具有相同的值。
默认的复制构造函数(如果您没有自己提供)仅创建浅层副本。
更正:下面的一些评论正确地指出了说默认的复制构造函数总是执行浅层副本(或者深层副本)是错误的。一个类型的复制构造函数是否创建浅层副本、深层副本、或介于两者之间,取决于每个成员的复制行为的组合;毕竟,一个成员类型的复制构造函数可以做任何它想做的事情。
以下是1998年C ++标准第12.8段第8句话对上述代码示例的说明:
类
X
的隐式定义的复制构造函数执行其子对象的逐成员复制。 [...]每个子对象都以其类型适当的方式进行复制:[...]如果子对象是标量类型,则使用内置赋值运算符。
struct Person { string firstName, lastName; }
- 默认的复制构造函数会进行深度复制。 - UncleBens这种情况的典型例子是指向可变结构体或对象的指针数组。
浅拷贝会复制该数组并保留对原始对象的引用。
深拷贝将复制(克隆)对象,使它们与原始对象毫无关系。 隐含在此中的是对象本身被深度复制了。 这就是困难所在,因为没有真正的方法知道某个东西是否被深度复制。
复制构造函数用于使用先前创建的同一类别的对象来初始化新对象。默认情况下,编译器编写了一个浅拷贝。当未涉及动态内存分配时,浅拷贝可以正常工作,但涉及动态内存分配时,两个对象都将指向堆中的同一内存位置,因此为了解决这个问题,我们写了深拷贝,这样两个对象在内存中都有自己的属性副本。
要阅读具有完整示例和说明的详细信息,请参见构造函数和析构函数文章。
默认的复制构造函数是浅拷贝。您可以根据需要创建深度或浅拷贝的自己的复制构造函数。请参见C++笔记:面向对象编程:复制构造函数。
这取决于实现。这意味着没有严格的规定,你可以像深拷贝或浅拷贝一样实现它,但据我所知,实现深拷贝是常见做法。默认的复制构造函数执行浅拷贝。复制构造函数执行哪种类型的复制?
int ivar;
实现浅拷贝? - kesarling He-Him