繁体   English   中英

在复制构造函数中调用赋值运算符

[英]Calling assignment operator in copy constructor

复制构造函数的这种实现是否存在一些缺点?

Foo::Foo(const Foo& i_foo)
{
   *this = i_foo;
}

我记得在某本书中建议从赋值运算符调用副本构造函数并使用众所周知的交换技巧,但我不记得为什么了...

是的,这是一个坏主意。 用户定义类型的所有成员变量将首先被初始化,然后立即被覆盖。

交换技巧是这样的:

Foo& operator=(Foo rhs) // note the copying
{
   rhs.swap(*this); //swap our internals with the copy of rhs
   return *this;
} // rhs, now containing our old internals, will be deleted 

在构造函数中调用operator=()既有潜在的弊端,也有潜在的好处。

缺点:

  • 无论是否指定值,构造函数都会初始化所有成员变量,然后operator=将再次初始化它们。 这增加了执行复杂度。 您将需要就何时在代码中创建不可接受的行为做出明智的决定。

  • 您的构造函数和operator=紧密耦合。 实例化对象时,您需要执行的所有操作也会在复制对象时完成。 同样,您必须明智地确定这是否是一个问题。

收益:

  • 代码库变得不那么复杂,更易于维护。 再一次,要聪明地评估这个增益。 如果您的结构具有2个字符串成员,则可能不值得。 另一方面,如果您的班级有50个数据成员(您可能不应该,但这是另一篇文章的故事)或彼此之间关系复杂的数据成员,那么只拥有一个成员可能会带来很多好处init函数而不是两个或多个。

您正在寻找Scott Meyers的有效C ++项目12:复制对象的所有部分。

暂无
暂无

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

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