2016-03-26 159 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); 

將打印出結果。