繁体   English   中英

提供赋值运算符,但不提供复制构造函数

[英]providing assignment operator but no copy constructor

在这里读到,如果我不编写副本构造函数,则编译器将使用赋值运算符为我完成此操作,这将导致对象的浅表副本。 如果我的所有成员对象中的赋值运算符都重载了怎么办? 会不会导致深度复制?

如果我不编写副本构造函数,则编译器将使用赋值运算符为我完成该操作

不,它不使用赋值运算符; 它是通过隐式生成的复制构造函数完成的,该复制构造函数进行浅表复制。

如果我的所有成员对象中的赋值运算符都重载了怎么办? 会不会导致深度复制?

假定在没有显式定义的副本构造函数的情况下不使用赋值运算符,即使您已重载了赋值运算符,您仍然仍然需要重载副本构造函数。

三的规则在C ++ 03& 的5种规则在C ++ 11。

链接文章中的重要部分是“使用赋值运算符分别使用类的每个成员 ”。 因此,是否为类定义了赋值运算符都没有关系,它将为该类的每个成员使用赋值运算符。

你误会了。 隐式生成的构造函数和赋值运算符仅对所有成员和子对象递归执行构造或赋值:

  • 复制构造函数逐个元素地复制

  • 移动构造函数逐个元素地移动

  • 复制分配逐元素分配

  • 逐元素移动分配move-assigns

这就是为什么最好的设计是您自己不编写任何副本构造函数(或其他三个副本或析构函数中的任何一个),而是组成精心挑选的单一职责类的原因的原因自己的语义负责一切。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM