C++ 重载c+中的复制赋值运算符+;
我对重载的复制赋值运算符有疑问。我在许多书籍/网站上读到,重载副本分配运算符的签名如下所示: 类型和类型::运算符=(常量类型和rhs) 然而,我不明白为什么我们需要通过引用返回它,事实上,不返回任何内容是有意义的吗?我的意思是,当我们通过引用或值返回它时,返回值在哪里,因为另一个对象已经在重载的copy assignment操作符中被赋值了 例如,如果我的主要功能中有类似的内容:C++ 重载c+中的复制赋值运算符+;,c++,operator-overloading,copy-constructor,C++,Operator Overloading,Copy Constructor,我对重载的复制赋值运算符有疑问。我在许多书籍/网站上读到,重载副本分配运算符的签名如下所示: 类型和类型::运算符=(常量类型和rhs) 然而,我不明白为什么我们需要通过引用返回它,事实上,不返回任何内容是有意义的吗?我的意思是,当我们通过引用或值返回它时,返回值在哪里,因为另一个对象已经在重载的copy assignment操作符中被赋值了 例如,如果我的主要功能中有类似的内容: int main(){ Type a {<Some lieral value>}; //Initia
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?
}
intmain(){
键入a{};//用一些文字初始化对象a
b型{};
b=a;//调用重载复制运算符时,对象b已经赋值,哪个变量接受返回值?
}
注意:这本书/网站说了一些关于链分配的事情,但是我不知道当我们有上述情况时,价值将返回到哪里
Type b = a;
这不是任务。Is是一个带有初始化的变量定义,导致调用类型
的复制构造函数,并将a
作为参数。构造函数没有返回值,正如您正确指出的那样,Type b=a
没有任何结果值是没有意义的,因为它甚至不是一个表达式
然而
b = a;
(对于先前的类型B;
)是赋值。赋值是一个表达式,因此它有一个可以在其他表达式中使用的结果值。例如,以下内容有效:
int a = 0;
(a = 2) += 1;
并将a
设置为3
。对于基本类型,如int
,赋值返回对赋值左侧的引用
对于类类型,这是通过让复制赋值操作符返回对赋值左侧的引用(即*this
)来模拟的
这方面的一个典型用例是分配给多个实例:
Type a, b, c;
// Do something with c
a = b = c;
在最后一行之后,所有三个a
,b
和c
将处于相同的状态,即更改赋值之前c
的状态,因为表达式解析为a=(b=c)代码>和右侧赋值返回对b
的引用,该引用用于在c
被赋值给b
后,分配给a
不需要从重载赋值运算符返回对该
的引用。然而,这样做是惯例,因为它支持这个特定的用例。如果您没有返回对*的引用,那么当该习语突然对您的类不起作用时,您的类的用户可能会感到惊讶,即使它可能不经常使用
不需要使用从函数(或运算符)返回的值。如果你写信
b = a;
返回的引用将被丢弃。它从来不会存储在任何地方,这根本不是问题
这不是任务。Is是一个带有初始化的变量定义,导致调用类型
的复制构造函数,并将a
作为参数。构造函数没有返回值,正如您正确指出的那样,Type b=a
没有任何结果值是没有意义的,因为它甚至不是一个表达式
然而
b = a;
(对于先前的类型B;
)是赋值。赋值是一个表达式,因此它有一个可以在其他表达式中使用的结果值。例如,以下内容有效:
int a = 0;
(a = 2) += 1;
并将a
设置为3
。对于基本类型,如int
,赋值返回对赋值左侧的引用
对于类类型,这是通过让复制赋值操作符返回对赋值左侧的引用(即*this
)来模拟的
这方面的一个典型用例是分配给多个实例:
Type a, b, c;
// Do something with c
a = b = c;
在最后一行之后,所有三个a
,b
和c
将处于相同的状态,即更改赋值之前c
的状态,因为表达式解析为a=(b=c)代码>和右侧赋值返回对b
的引用,该引用用于在c
被赋值给b
后,分配给a
不需要从重载赋值运算符返回对该
的引用。然而,这样做是惯例,因为它支持这个特定的用例。如果您没有返回对*的引用,那么当该习语突然对您的类不起作用时,您的类的用户可能会感到惊讶,即使它可能不经常使用
不需要使用从函数(或运算符)返回的值。如果你写信
b = a;
返回的引用将被丢弃。它从不存储在任何地方,这根本不是问题。类型b=a代码>不调用复制分配运算符。它调用一个复制构造函数。返回对*的引用,这允许链接赋值,如a=b=c代码>思想是,如果它适用于int
s,那么它就没有理由不适用于您的对象。抱歉@igortandtnik造成了混淆。编辑了这个问题。我的意思是,当我们使用b=a时,它将调用重载运算符,其中左侧的操作数已经用右侧的操作数初始化。那么,在这种情况下,我们为什么需要返回任何值呢?您不需要,但是返回一个值并没有什么害处,即使它并不总是被使用。如果您添加tc;c=b=a
则实际上将使用b=a
的返回值。当您编写运算符=
时,您将不知道是否有人希望在稍后的某个时间链分配您的对象。完全可以忽略任何函数的返回值;总是发生。类型b=a代码>不调用复制分配运算符。它调用