重载运算符=按值返回还是按引用返回?

use*_*408 4 c++ overloading copy constants operator-keyword

1) 有什么区别:

complex& operator = (const complex& c);
Run Code Online (Sandbox Code Playgroud)

complex operator = (complex c);
Run Code Online (Sandbox Code Playgroud)

2)如果我定义(在第二种情况下)复制构造函数,它们是否相同?

complex::complex (const complex& c){

    //code
    }
Run Code Online (Sandbox Code Playgroud)

3)const的作用是什么?

mas*_*oud 5

这些是非常不同的

您想要连锁作业吗?返回*this

a = b = c; // Chained assignment
Run Code Online (Sandbox Code Playgroud)

C++ 中的默认赋值支持链接,因此最好保留此规则。

为了支持这种类型的赋值,每个操作都必须返回引用*this或返回副本:

complex& operator = (const complex& c)
{
  // do assignment

   return *this;
}
Run Code Online (Sandbox Code Playgroud)

或者

complex operator = (const complex& c)
{
  // do assignment

   return *this;
}
Run Code Online (Sandbox Code Playgroud)

但这个简单的工作应该是轻松高效的。假设没有可用的 RVO 或移动,则首选返回引用而不是副本。

 

我更喜欢返回参考文献的另一个原因是为了摆脱我脑海中令人困惑的事情。看这两个场景:

// Returning a reference
a = 1;
b = 2;
c = 3;
(a = b) = c;
Run Code Online (Sandbox Code Playgroud)

分配完作业后,a=3 b=2 c=3. 因为,首先b分配a并返回对 的引用a,然后c分配给该引用并a再次更改。

// Returning a copy
a = 1;
b = 2;
c = 3;
(a = b) = c;
Run Code Online (Sandbox Code Playgroud)

分配完作业后,a=2 b=2 c=3. 因为,首先b分配a并返回一个临时副本,然后c分配给该临时对象(对a或没有影响b)。

正如您所看到的,结果是不同的。忽略发生了什么以及哪一个更好。你应该选择一种程序员流行且期望的方式。我相信 C++ 程序员通过观察(a = b) = c期待第一个结果。

因此你应该使用第一个。

 

关于关键字const

当您通过引用传递对象给函数时,该函数可以修改它。您可以放置​​一个const来保护它免受不必要的更改。