在 C++ 中重载复制赋值运算符
Overloading copy assignment operator in c++
我对重载的复制赋值运算符有疑问。我在许多 books/websites 中读到重载复制赋值运算符的签名如下所示:
Type &Type::operator=(const Type &rhs)
但是,我不明白为什么我们需要通过引用来return它,实际上return没有任何意义吗?我的意思是当我们通过引用或按值 return 时,return 值被 return 编辑到哪里,因为另一个对象已经在重载的复制赋值运算符中被赋值
例如。如果我的主要功能中有这样的东西:
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?
}
注意:book/website 说了一些关于链赋值的事情,但是我不明白当我们遇到上述情况时,值将 return 编辑到哪里。
Type b = a;
不是赋值。 Is 是一个带有初始化的变量定义,并导致 Type
的副本 constructor 以 a
作为参数被调用。构造函数没有 return 值,正如您正确指出的那样,Type b = a
没有任何结果值,因为它甚至不是表达式。
但是
b = a;
(之前有 Type B;
) 是 赋值。赋值是一个表达式,所以它有一个可以在其他表达式中使用的结果值。例如,以下是有效的:
int a = 0;
(a = 2) += 1;
并将 a
设置为 3
。这里对于 int
等基本类型,赋值 return 是对赋值左侧的引用。
对于 class 类型,这是通过复制赋值运算符 return 对赋值左侧的引用(即 *this
)来模拟的。
一个典型的用例是分配给多个实例:
Type a, b, c;
// Do something with c
a = b = c;
在最后一行之后,所有三个 a
、b
和 c
将处于相同的状态,c
在更改赋值之前的状态,因为表达式被解析为 a = (b = c);
并且右侧赋值 return 是对 b
的引用,它用于在 c
赋值给 [= 之后赋值给 a
24=].
不需要 return 重载赋值运算符对 *this
的引用。然而,这样做是约定俗成的,因为它支持这个特定的用例。如果您不 return 引用您 class 的 *this
用户,当该成语突然对您的 class 不起作用时可能会感到惊讶,即使它可能不是经常使用。
不需要使用从函数(或运算符)编辑的值 return。如果你写
b = a;
returned 引用被简单地丢弃了。它永远不会存储在任何地方,这根本不是问题。
我对重载的复制赋值运算符有疑问。我在许多 books/websites 中读到重载复制赋值运算符的签名如下所示:
Type &Type::operator=(const Type &rhs)
但是,我不明白为什么我们需要通过引用来return它,实际上return没有任何意义吗?我的意思是当我们通过引用或按值 return 时,return 值被 return 编辑到哪里,因为另一个对象已经在重载的复制赋值运算符中被赋值 例如。如果我的主要功能中有这样的东西:
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?
}
注意:book/website 说了一些关于链赋值的事情,但是我不明白当我们遇到上述情况时,值将 return 编辑到哪里。
Type b = a;
不是赋值。 Is 是一个带有初始化的变量定义,并导致 Type
的副本 constructor 以 a
作为参数被调用。构造函数没有 return 值,正如您正确指出的那样,Type b = a
没有任何结果值,因为它甚至不是表达式。
但是
b = a;
(之前有 Type B;
) 是 赋值。赋值是一个表达式,所以它有一个可以在其他表达式中使用的结果值。例如,以下是有效的:
int a = 0;
(a = 2) += 1;
并将 a
设置为 3
。这里对于 int
等基本类型,赋值 return 是对赋值左侧的引用。
对于 class 类型,这是通过复制赋值运算符 return 对赋值左侧的引用(即 *this
)来模拟的。
一个典型的用例是分配给多个实例:
Type a, b, c;
// Do something with c
a = b = c;
在最后一行之后,所有三个 a
、b
和 c
将处于相同的状态,c
在更改赋值之前的状态,因为表达式被解析为 a = (b = c);
并且右侧赋值 return 是对 b
的引用,它用于在 c
赋值给 [= 之后赋值给 a
24=].
不需要 return 重载赋值运算符对 *this
的引用。然而,这样做是约定俗成的,因为它支持这个特定的用例。如果您不 return 引用您 class 的 *this
用户,当该成语突然对您的 class 不起作用时可能会感到惊讶,即使它可能不是经常使用。
不需要使用从函数(或运算符)编辑的值 return。如果你写
b = a;
returned 引用被简单地丢弃了。它永远不会存储在任何地方,这根本不是问题。