何时需要在运算符声明之前使用&
?
示例:
class ClassName {
public:
// Some constructor here..
ClassName operator+(...)
ClassName operator*(...)
ClassName &operator+=(...) < has an &
ClassName operator==(...)
ClassName &operator<<(...) < has an &
private:
// Some member variables here..
}
如果要区分后缀和前缀i++
或++i
,请使用&
ClassName &operator++()
ClassName operator++(int)
但是什么时候将&
用于其他运算符重载函数?是否有某种规则或与记忆有关?
答案 0 :(得分:8)
tl; dr:与任何功能相同。您是通过价值还是参考来回报?
如果您将“&”号向左对齐(没有语义影响,就像char* str
与char *str
一样,可能会更清楚:
ClassName& operator++()
ClassName operator++(int)
因此,选择取决于您是否要返回对现有对象的引用:
ClassName& operator++()
{
this->someMember += 1;
return *this;
}
…或一个不错的新产品:
ClassName operator++(int)
{
// Post-fix operator so we have to return the "old" unmodified version
ClassName old = *this;
this->someMember += 1;
return old;
}
在第一种情况下,按值返回将使++
的用户感到困惑,因为:
++
的结果进行的进一步操作不会影响原始对象。在第二种情况下,按引用返回将是 bad ,因为:
答案 1 :(得分:6)
何时需要在运算符声明前使用&?
&符号将函数的返回类型声明为引用。更具体地说,是左值引用。因此,当您要返回左值引用时,请使用&;当您要返回非引用时,请不要使用&。
那么,您什么时候想从运算符重载中返回引用?一条简单的经验法则是,如果非类类型的内置运算符是左值表达式,则应返回一个引用,而当内置运算符是右值表达式时,则应返回一个非引用。也有例外。例如,有时您无法返回引用。也许您需要返回某种类似于引用的包装对象。这样的包装器通常按值返回。
赋值运算符,包括复合赋值运算符,例如+=
,通常会返回对*this
的引用。
Postfix运算符通常返回先前的值。因此,它无法返回对*this
的引用,该引用包含当前值。前缀运算符确实返回当前值,因此它可以返回引用。非类对象的前缀增量是左值表达式,因此从运算符重载返回左值(即引用)是一个很好的约定。