我在互联网上浏览了一些运算符重载的示例,其中operator+=
的返回类型为T&
。由于我们无法像+=
那样链T a = b = c;
,因此可以将返回类型声明为void
。使用void
时,一切似乎都正常。有什么情况我们必须避免吗?
例如:
class MyInteger{
private:
int x;
public:
MyInteger(const int& a):x(a){}
void operator+=(const MyInteger& rhs){
x += rhs.x;
}
};
MyInteger a(10);
a += a; //No need to return anything because we can't chain
a = a + (a += a);
答案 0 :(得分:3)
正如@Ant已经指出的那样,可以被链接,但它并不是唯一的考虑因素。考虑
cout << (a += b);
例如,如果没有回报,这将无法运作。
算术运算符本身只不过是一种人类约定。从技术上讲,你甚至可以+=
做-=
- 它将构建并可能为你运行(只要你遵循新的私人约定)。在C ++中,您应该遵循该语言的约定:代码的客户端将期望+=
自我增量,并且
cout << (a += b);
将打印出结果。
答案 1 :(得分:3)
您希望operator +=
返回对当前对象的引用的另一个原因是您希望重载operator +
。由于您正在编写一个整数类,如果+=
可用,则没有多大意义,但+
不可用。
以下是operator +
的样子:
MyInteger MyInteger::operator+(const MyInteger& rhs)
{
MyInteger temp(*this);
return temp += rhs; // <-- Uses operator +=
}
如果operator +=
未返回引用,则上述操作无效(甚至无法编译)。