我对C ++中的复制构造函数行为有疑问。我有一个结构如下:
struct Vec4
{
public:
float elems[4];
};
现在,如果我做了类似的事情:
Vec4 copied = some_func(); // returns a Vec4 object
这会执行elms数组的深层复制还是只复制指针地址?我认为它应该是后者,应该提供一个显式的复制构造函数和赋值运算符,但我不确定。
我做了一个小测试,它完成了应该做的事情,但我不确定这是不是偶然!
答案 0 :(得分:2)
是的,elems
是Vec4
对象的子对象,因此它会随Vec4
一起被复制。没有要复制的指针。数组元素实际上嵌入在Vec4
对象中。
我发现深层和浅层的术语在C和C ++中有点误导。我认为更好的思考方式是默认副本不会遵循任何级别的间接(例如指针)。你可以拥有一个非常“深层”的对象(许多子对象的子对象等),其中没有涉及间接,并且仍然会复制整个事物,但我们仍然将其称为“浅层副本”。如果需要遵循任何间接,则需要实现执行“深层复制”的自定义复制构造函数。