Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重载c+中的复制赋值运算符+;_C++_Operator Overloading_Copy Constructor - Fatal编程技术网

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

C++ 重载c+中的复制赋值运算符+;,c++,operator-overloading,copy-constructor,C++,Operator Overloading,Copy Constructor,我对重载的复制赋值运算符有疑问。我在许多书籍/网站上读到,重载副本分配运算符的签名如下所示: 类型和类型::运算符=(常量类型和rhs) 然而,我不明白为什么我们需要通过引用返回它,事实上,不返回任何内容是有意义的吗?我的意思是,当我们通过引用或值返回它时,返回值在哪里,因为另一个对象已经在重载的copy assignment操作符中被赋值了 例如,如果我的主要功能中有类似的内容: int main(){ Type a {<Some lieral value>}; //Initia

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

类型和类型::运算符=(常量类型和rhs)

然而,我不明白为什么我们需要通过引用返回它,事实上,不返回任何内容是有意义的吗?我的意思是,当我们通过引用或值返回它时,返回值在哪里,因为另一个对象已经在重载的copy assignment操作符中被赋值了 例如,如果我的主要功能中有类似的内容:

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不调用复制分配运算符。它调用