我读here如果我不写复制构造函数,编译器会为我使用它 赋值运算符,它导致对象的浅拷贝。如果我有的话怎么办? 赋值运算符在我的所有成员对象中重载?不会导致深层复制吗?
答案 0 :(得分:3)
如果我不编写复制构造函数,编译器会使用赋值运算符
为我执行此操作
不,它不使用赋值运算符;它是通过隐式生成的复制构造函数来完成的,复制构造函数执行浅拷贝。
如果我在所有成员对象中都重载了赋值运算符,该怎么办?它不会导致深层复制吗?
鉴于在没有明确定义的复制构造函数的情况下不使用赋值运算符,即使您已经重载了赋值运算符,您仍然需要重载复制构造函数。
阅读C ++ 03&中的 Rule of Three 。 C ++ 11中的 Rule of Five 。
答案 1 :(得分:0)
链接文章中的重要部分是“使用赋值运算符单独的每个成员”。因此,如果为您的类定义赋值运算符并不重要,它将为您的每个类成员使用赋值运算符。
答案 2 :(得分:0)
你被误导了。隐式生成的构造函数和赋值运算符只是在所有成员和子对象上递归执行构造或赋值:
复制构造函数逐元素复制
移动构造函数逐个元素地移动
复制作业按元素分配
按元素移动分配move-assigns元素
这个逻辑就是为什么最好的设计是你自己不写任何拷贝构造函数(或者其他三个,或析构函数)的原因,而是编写你精心挑选的类,单一责任类,其自身的语义可以处理所有事情。