在复制赋值运算符中按值传递与按引用传递

时间:2020-02-28 01:39:09

标签: c++ copy-assignment copy-and-swap

首先,也有类似的热门帖子What is the copy-and-swap idiom?。 接受的答案具有指向https://web.archive.org/web/20140113221447/http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/的链接。

接受页面和链接页面都表示复制分配运算符的常用实现是(从上一个链接复制并粘贴)

T& T::operator=(T const& x) // x is a reference to the source
{ 
    T tmp(x);          // copy construction of tmp does the hard work
    swap(*this, tmp);  // trade our resources for tmp's
    return *this;      // our (old) resources get destroyed with tmp 
}

但是那个

T& operator=(T x)    // x is a copy of the source; hard work already done
{
    swap(*this, x);  // trade our resources for x's
    return *this;    // our (old) resources get destroyed with x
}

更好,这是由于编译器对复制的优化,或者通常总是按值传递而不是按引用传递,然后复制按引用传递的参数。

我同意第二个选项与第一个选项等效或更好,但并不差,但我感到困惑,为什么第一个选项甚至是这样写的。我不明白为什么需要一个临时变量和一个交换。

相反,我们不能做类似的事情吗?

T& T::operator=(T const& x) // x is a reference to the source
{ 
    this->member_var = x.member_var;
    //if we have to do a deep copy of something, implement that here
    return *this;
}

不使用副本构造函数。

1 个答案:

答案 0 :(得分:1)

如果有多个成员,则您的赋值运算符不是异常安全的:

T& T::operator=(T const& x) 
{ 
    this->member_var1 = x.member_var1; 
    this->member_var2 = x.member_var2; // if an exception occurs here, this->member_var1 will still be changed
    return *this;
}