我对重载的复制赋值运算符有疑问。我在很多书/网站上读到,过载副本分配操作员的签名如下所示:
类型&类型::运算符=(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;
在最后一行之后,所有三个a
、b
和c
都将处于相同的状态,即更改分配之前的c
的状态,因为表达式被解析为a = (b = c);
,并且右侧分配返回对b
的引用,该引用用于在c
被分配给b
之后分配给a
。
不需要从重载的赋值运算符返回对*this
的引用。然而,这样做是惯例,因为它启用了这个特定的用例。如果您不返回对*this
的引用,则当该习语突然不适用于您的类时,您的类的用户可能会感到惊讶,即使它可能不经常使用。
从函数(或运算符(返回的值不需要使用。如果你写
b = a;
返回的引用被简单地丢弃。它从不存储在任何地方,这根本不是问题。