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