在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 copydeep copy之间的实际差异变得可见。 在没有指针的情况下,没有什么区别(据我所知)。

要知道它们之间的区别,请参阅这些主题(在stackoverflow本身上):

  • 深拷贝和浅拷贝之间有什么区别?
  • 深拷贝vs浅拷贝

  • 是的,它只是复制对象成员明智,这可能会导致原始指针的问题。

    链接地址: http://www.djcxy.com/p/79363.html

    上一篇: Default assignment operator= in c++ is a shallow copy?

    下一篇: copy a class, C#