在 C++ 中重载复制赋值运算符

Overloading copy assignment operator in c++

我对重载的复制赋值运算符有疑问。我在许多 books/websites 中读到重载复制赋值运算符的签名如下所示:

Type &Type::operator=(const Type &rhs)

但是,我不明白为什么我们需要通过引用来return它,实际上return没有任何意义吗?我的意思是当我们通过引用或按值 return 时,return 值被 return 编辑到哪里,因为另一个对象已经在重载的复制赋值运算符中被赋值 例如。如果我的主要功能中有这样的东西:

int main(){
 Type a {<Some lieral value>}; //Initialise object a with some literal
 Type b {<Some literal value>}; 
 b=a; //Object b is already assigned when we call overloaded copy operator, which variable accepts the return value?
}

注意:book/website 说了一些关于链赋值的事情,但是我不明白当我们遇到上述情况时,值将 return 编辑到哪里。

Type b = a;

不是赋值。 Is 是一个带有初始化的变量定义,并导致 Type 的副本 constructora 作为参数被调用。构造函数没有 return 值,正如您正确指出的那样,Type b = a 没有任何结果值,因为它甚至不是表达式。

但是

b = a;

(之前有 Type B; 赋值。赋值是一个表达式,所以它有一个可以在其他表达式中使用的结果值。例如,以下是有效的:

int a = 0;

(a = 2) += 1;

并将 a 设置为 3。这里对于 int 等基本类型,赋值 return 是对赋值左侧的引用。

对于 class 类型,这是通过复制赋值运算符 return 对赋值左侧的引用(即 *this)来模拟的。

一个典型的用例是分配给多个实例:

Type a, b, c;
// Do something with c
a = b = c;

在最后一行之后,所有三个 abc 将处于相同的状态,c 在更改赋值之前的状态,因为表达式被解析为 a = (b = c); 并且右侧赋值 return 是对 b 的引用,它用于在 c 赋值给 [= 之后赋值给 a 24=].

不需要 return 重载赋值运算符对 *this 的引用。然而,这样做是约定俗成的,因为它支持这个特定的用例。如果您不 return 引用您 class 的 *this 用户,当该成语突然对您的 class 不起作用时可能会感到惊讶,即使它可能不是经常使用。

不需要使用从函数(或运算符)编辑的值 return。如果你写

b = a;

returned 引用被简单地丢弃了。它永远不会存储在任何地方,这根本不是问题。