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



我对重载的复制赋值运算符有疑问。我在很多书/网站上读到,过载副本分配操作员的签名如下所示:

类型&类型::运算符=(const Type&rhs(

然而,我不明白为什么我们需要通过引用返回它,事实上,什么都不返回没有意义吗?我的意思是,当我们通过引用或值返回它时,由于另一个对象已经在重载的复制分配运算符中被分配,所以返回的返回值在哪里例如,如果我的主要功能中有这样的东西:

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?
}

注:书/网站上说了一些关于链分配的内容,但我不明白当我们遇到上述情况时,价值会返回到哪里。

Type b = a;

不是分配。Is是一个带有初始化的变量定义,它会导致以a为参数调用Type的副本构造函数。构造函数没有返回值,正如您正确指出的,Type b = a没有任何结果值是没有意义的,因为它甚至不是一个表达式。

然而

b = a;

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

int a = 0;
(a = 2) += 1;

并且将CCD_ 5设置为CCD_。这里,对于int等基本类型,赋值返回对赋值左侧的引用。

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

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

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

在最后一行之后,所有三个abc都将处于相同的状态,即更改分配之前的c的状态,因为表达式被解析为a = (b = c);,并且右侧分配返回对b的引用,该引用用于在c被分配给b之后分配给a

不需要从重载的赋值运算符返回对*this的引用。然而,这样做是惯例,因为它启用了这个特定的用例。如果您不返回对*this的引用,则当该习语突然不适用于您的类时,您的类的用户可能会感到惊讶,即使它可能不经常使用。

从函数(或运算符(返回的值不需要使用。如果你写

b = a;

返回的引用被简单地丢弃。它从不存储在任何地方,这根本不是问题。

最新更新