Return C++ 中赋值运算符的类型
Return type of assignment operator in C++
假设我有这样一个 class:
public:
A(const int a);
A& operator = (const A&);
};
为什么“=”运算符的 return 类型必须是“A&”而不是简单的“A”?
return类型没有是A&
;标准只说:
A user-declared copy assignment operator X::operator=
is a non-static non-template member function of class X
with exactly one parameter of type X
, X&
, const X&
, volatile X&
, or const volatile X&
.
我们按照惯例这样做。
oft-cited 的论点是您可以“链式”赋值 (a = b = c
),但老实说,这并不是一种常见的模式。我认为它在某种程度上是货物崇拜编程,但它不会伤害任何人,而且保持一致性很好。
缺点是大多数人甚至不使用这种 return 类型,有时它的实际原因可能会丢失(根据这个问题!)。
我们不 return A
,因为 return 按 operated-on 对象的值(即 returning _copy)相反会更没用,并且会混淆赋值运算符的目的,即 not 来创建一个新的 A
.
所有这些构建没有错误:
A& operator = (const A&);
A& operator = (A&);
A& operator = (const A&);
A& operator = (A);
A operator = (const A&);
const A& operator = (const A&);
void operator = (const A&);
复制赋值运算符是一个类似于任何其他函数的函数。您甚至可以在调用任何其他函数时显式调用它:
A test;
A testToBeCopied;
test.operator=(testToBeCopied);
您可以预期是否为 const,也可以像任何其他函数一样在有或没有 const 的情况下调用复制赋值运算符函数。您不必期待 const 或 ref。你甚至可以return作废。另一方面,通过引用传递或值传递来调用函数,是否期望签名中有 const 取决于您的需要。方法链接是需要 returning ref 的一个例子。你可以通过 ref 因为效率和你不需要另一个新创建的对象。
假设我有这样一个 class:
public:
A(const int a);
A& operator = (const A&);
};
为什么“=”运算符的 return 类型必须是“A&”而不是简单的“A”?
return类型没有是A&
;标准只说:
A user-declared copy assignment operator
X::operator=
is a non-static non-template member function of classX
with exactly one parameter of typeX
,X&
,const X&
,volatile X&
, orconst volatile X&
.
我们按照惯例这样做。
oft-cited 的论点是您可以“链式”赋值 (a = b = c
),但老实说,这并不是一种常见的模式。我认为它在某种程度上是货物崇拜编程,但它不会伤害任何人,而且保持一致性很好。
缺点是大多数人甚至不使用这种 return 类型,有时它的实际原因可能会丢失(根据这个问题!)。
我们不 return A
,因为 return 按 operated-on 对象的值(即 returning _copy)相反会更没用,并且会混淆赋值运算符的目的,即 not 来创建一个新的 A
.
所有这些构建没有错误:
A& operator = (const A&);
A& operator = (A&);
A& operator = (const A&);
A& operator = (A);
A operator = (const A&);
const A& operator = (const A&);
void operator = (const A&);
复制赋值运算符是一个类似于任何其他函数的函数。您甚至可以在调用任何其他函数时显式调用它:
A test;
A testToBeCopied;
test.operator=(testToBeCopied);
您可以预期是否为 const,也可以像任何其他函数一样在有或没有 const 的情况下调用复制赋值运算符函数。您不必期待 const 或 ref。你甚至可以return作废。另一方面,通过引用传递或值传递来调用函数,是否期望签名中有 const 取决于您的需要。方法链接是需要 returning ref 的一个例子。你可以通过 ref 因为效率和你不需要另一个新创建的对象。