繁体   English   中英

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

[英]Overloading copy assignment operator in c++

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

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

但是,我不明白为什么我们需要通过引用返回它,实际上不返回没有意义吗? 我的意思是当我们通过引用或值返回它时,返回值在哪里返回,因为另一个 object 已经在重载的复制分配运算符中分配了例如。 如果我的主要 function 中有这样的东西:

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 是一个带初始化的变量定义,并导致Type的复制构造函数a as 参数调用。 构造函数没有返回值,正如您正确指出的那样, Type b = a具有任何结果值是没有意义的,因为它甚至不是表达式。

然而

b = a;

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

int a = 0;

(a = 2) += 1;

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

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

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

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

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

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

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

b = a;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM