默认赋值运算符=在c ++中是浅拷贝?
只是一个简单的快速问题,我无法找到其他任何地方的可靠答案。默认运算符=只是右侧所有类成员的浅表副本吗?
Class foo {
public:
int a, b, c;
};
foo f1, f2;
...
f1 = f2;
将与以下内容相同:
f1.a = f2.a;
f1.b = f2.b;
f1.c = f2.c;
当我测试它时,这似乎是真的,但我需要确定我没有错过某些特定情况。
没有找到相关结果
已邀请:
7 个回复
眠缝
是副本。它复制每个成员。 除非被复制的成员是某种间接(例如指针),否则不会出现浅拷贝和深拷贝之间的区别。就默认的
而言,由复制的成员决定“复制”的含义,它可能是深的还是浅的。 但是,具体来说,复制原始指针只是复制指针值,它对referand没有任何作用。因此,默认情况下,包含指针成员的对象被浅层复制
。 编写在复制时执行克隆操作的智能指针有各种各样的工作,所以如果你用它们来代替原始指针,那么默认的
将执行深度复制。 如果你的对象有任何标准容器作为成员,那么(例如)Java程序员说
是“浅拷贝”可能会让人感到困惑。在Java中,
成员实际上只是一个引用,因此“浅拷贝”意味着不会克隆
成员:源和目标指向相同的底层矢量对象。在C ++中,将复制
成员及其内容,因为该成员是实际对象而不是引用(并且
保证内容随之复制)。 如果您的数据成员是指针的向量,那么您没有深拷贝或浅拷贝。您有一个半深拷贝,其中源和目标对象具有单独的向量,但每个对应的向量元素仍指向相同的未克隆对象。
墩瓣茅械
是浅拷贝。 顺便说一下,当类有指针作为成员字段时,
和
之间的实际差异变得可见。在没有指针的情况下,没有区别(据我所知)! 要了解它们之间的区别,请参阅以下主题(在stackoverflow本身上): 深拷贝和浅拷贝之间有什么区别? 深拷贝与浅拷贝
才改隘瘁
细屠截殴些
课程从三个
改为
,一个
和一个
:
运行此程序时,它会产生以下输出:
很无聊,所以我把它留了出来。但是看看
和
之间的区别:
在f1和f2中是相同的;这就是你所说的“浅层副本”。然而,
在f1和f2之间是不同的;这就是你所谓的“深层复制”。 这里实际发生的是C ++中的默认值
就像所有成员的
按顺序被调用一样。对于
s,
s和其他原始类型的
只是一个字节方式的浅拷贝。
为
执行深拷贝。 所以我想说问题的答案是,不,C ++中的默认赋值运算符不执行浅拷贝。但它也没有执行深层复制。 C ++中的默认赋值运算符以递归方式应用类成员的赋值运算符。
窃誓额
骚瓤
根本不执行复制。它是赋值运算符,而不是复制运算符。 默认赋值运算符分配每个成员。
细屠截殴些