2016-03-26 122 views
2

我已经在因特网上经历了一些运营商超载的例子,其中返回类型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); 
+5

“既然我们不能连锁'+ ='”?为什么不? '(((a + = b)+ = c)+ = d)'或'a + =(b + =(c + = d)))''。它像以往一样可以链接。 – AnT

+0

@AnT好的,但我们不需要返回任何东西。因为这些更改是在LHS中进行的,并且可用于下一个操作。所以不需要'T&'作为回报​​。 –

+1

但是,如果你想链接它,你*有*返回的东西。 – AnT

回答

3

您希望operator +=返回对当前对象的引用的另一个原因是当您要重载operator +时。既然你正在写一个整数类,如果+=可用,那么它就没有多大意义,但+不是。

这里是operator +会是什么样子:

MyInteger MyInteger::operator+(const MyInteger& rhs) 
{ 
    MyInteger temp(*this); 
    return temp += rhs; // <-- Uses operator += 
} 

以上不能工作(甚至编译)如果operator +=没有返回引用。

+0

我同意这个有效的观点,因为我经常看到这一点,但是当怀疑出现时没有触动我的大脑。 –

3

正如@Ant已经指出的那样,可以被链接,但它不是唯一的考虑因素。考虑

cout << (a += b); 

例如 - 如果没有返回,这将不起作用。

算术运算符本身只不过是人类惯例。从技术上讲,你甚至可以有+=-= - 它会建立并可能为你运行(只要你遵循你的新私人约定)。在C++,你应该遵循语言的约定:你的代码的客户端将预期+=自我增量,而

cout << (a += b); 

将打印出结果。