在c ++中的默认赋值operator =是一个浅拷贝?
只是一个简单的快速问题,我无法在其他任何地方找到可靠的答案。 默认的操作员=只是右边所有班级成员的浅表副本?
Class foo {
public:
int a, b, c;
};
foo f1, f2;
...
f1 = f2;
将与以下内容相同:
f1.a = f2.a;
f1.b = f2.b;
f1.c = f2.c;
这在我测试时似乎是真实的,但我需要确保我不会错过某些特定情况。
我会说,默认operator=
是一个副本。 它复制每个成员。
除非被复制的成员是某种间接方式(如指针),否则不会出现浅拷贝和深拷贝之间的区别。 就默认的operator=
而言,取决于复制的成员是什么“复制”的意思,它可能是深层或浅层。
具体而言,虽然复制一个原始指针只是复制指针值,但它对referand没有任何作用。 因此,包含指针成员的对象默认情况下被operator=
浅拷贝。
在编写复制时执行克隆操作的智能指针方面有各种努力,因此如果您在各处使用那些代替原始指针的默认operator=
将执行深度复制。
如果你的对象有任何标准容器作为成员,那么(例如)一个Java程序员说operator=
是一个“浅拷贝”可能会造成混淆。 在Java中, Vector
成员实际上只是一个引用,所以“浅拷贝”意味着Vector
成员不被克隆:源和目标引用相同的基础矢量对象。 在C ++中, vector
成员将与其内容一起被复制,因为该成员是一个实际的对象而不是引用(并且vector::operator=
保证内容被复制)。
如果你的数据成员是一个指针向量,那么你没有深度拷贝或浅拷贝。 您有一个半深的副本,其中源对象和目标对象具有单独的向量,但每个相应的向量元素仍指向相同的未克隆对象。
是的,默认operator=
是浅拷贝。
顺便说一下,当类的指针是成员字段时, shallow copy
和deep copy
之间的实际差异变得可见。 在没有指针的情况下,没有什么区别(据我所知)。
要知道它们之间的区别,请参阅这些主题(在stackoverflow本身上):
是的,它只是复制对象成员明智,这可能会导致原始指针的问题。
链接地址: http://www.djcxy.com/p/79363.html上一篇: Default assignment operator= in c++ is a shallow copy?
下一篇: copy a class, C#