2016-02-24 46 views
0

我對前綴運算符重載有一個疑問。爲什麼我們必須從一元前綴運算符重載返回const引用

我的示例程序:

class ABC { 
    int i; 
public: 
    const ABC& operator++() { i=i+1; return *this;} 
}; 

int main() { 
    ABC ob ; //let value of i =5; 
    ++ob; // value of i will be 6 
    return 0; 
} 

但調用++ob

APMK ++ob轉化爲ob.operator++()時,我可以通過重載像下面

void operator++() { i=i+1;} 

這給了我同樣的結果做同樣的事情。

我的疑問是什麼發生在返回值。該編譯器產生類似的代碼:提前

+2

你不知道。但有人可能會做'++(++ ob)'或類似的。或'ob2 = ++ ob;' – immibis

+0

前綴增量應該通常返回一個非常量左值引用。 – NathanOliver

回答

0

返回對象引用的原因是使行爲與整數(對於內置類型)相同。

​​4

如果i是一個整數,這將工作。如果您返回對該對象的引用(假設您已爲您的課程定義了operator<<),這將只在類中起作用。

class ABC { 
    int i; 
public: 
    ABC(int x = 0) : i(x) {} 
    const ABC& operator++() { i=i+1; return *this;} 
      ABC operator++(int) { ABC result(*this);i=i+1; return result;} 
    friend std::ostream& operator<<(std::ostream& out, ABC const& val) 
    { 
     return out << val.i; 
    } 
}; 

通過這個定義,那麼你的類的行爲相同的方式,一個整數將在上述情況的行爲。這使得它在使用模板時非常有用,因爲您現在可以使用類型替換整數。

注意通常我會返回一個引用(而不是一個const引用)。

/*const*/ ABC& operator++() { i=i+1; return *this;} 
^^^^^^^^^ 

見:https://stackoverflow.com/a/3846374/14065

但是C++允許你做任何事情,你可以返回任何有用或對情況做出合適的含義。你應該考慮什麼對你的課程有意義並且返回一個合適的值。請記住Principle of lease surprise

+0

感謝您分享此信息「std :: cout << ++ i; std :: cout << i ++; 如果我是一個整數,這將工作,這將只在類中工作,如果你返回一個引用對象(假設你爲你的類定義了operator <<)。「 –

1

爲什麼我們不得不返回從一元前綴經營者常引用重載

您不必

ob = ob.operator++(); 

感謝。通常你返回非const引用,但你可以讓它返回任何東西。你不應該,但你可以。內置的預增量用於返回非const引用的工作方式,因此它最有意義。

+0

感謝您的答案。但我的查詢是不同的。讓我再解釋一遍。當我做ob1 = ++ ob時,編譯器轉換爲ob1 = ob.operator ++()。我的返回左值分配給ob1。但是如果只有「++ ob」,編譯器如何處理返回值,因爲返回值沒有分配給任何人 –

+0

@rajibapradhan返回值將被丟棄。 –

相關問題