只是一个简单的快速问题,我找不到其他任何地方的可靠答案。默认运算符=只是右侧所有类成员的浅拷贝吗?

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=而言,取决于被复制的成员,即“copy”的含义,它可以是深层或浅层。

具体来说,尽管复制原始指针只是复制指针值,但对Referand并没有任何作用。因此,默认情况下,包含指针成员的对象将被浅拷贝operator=

编写可在复制时执行克隆操作的智能指针的工作很多,因此,如果在各处使用这些指针代替原始指针,则默认operator=将执行深度复制。

如果您的对象具有任何标准容器作为成员,则可能会使Java程序员(例如)说operator=是“浅拷贝”感到困惑。在Java中,Vector成员实际上只是一个引用,因此“浅拷贝”意味着Vector成员不会被克隆:源和目标是指相同的基础 vector 对象。在C++中,将复制vector成员及其内容,因为该成员是实际对象而不是引用(且vector::operator=保证内容随其一起复制)。

如果您的数据成员是指针的 vector ,则您没有深拷贝或浅拷贝。您有一个半深副本,其中源对象和目标对象具有单独的 vector ,但是每个对象中的相应 vector 元素仍指向同一未克隆的对象。

关于c++ - C++中的默认赋值运算符=是浅表拷贝吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5096464/

10-11 15:43