2009-01-21 13 views
2

在他的C++編程語言斯特勞斯給出INC/DEC超載下面的例子:重載增量的返回值

class Ptr_to_T { 
    T* p; 
    T* array ; 
    int size; 
public: 
    Ptr_to_T(T* p, T* v, int s); // bind to array v of size s, initial value p 
    Ptr_to_T(T* p); // bind to single object, initial value p 
    Ptr_to_T& operator++(); // prefix 
    Ptr_to_T operator++(int); // postfix 
    Ptr_to_T& operator--(); // prefix 
    Ptr_to_T operator--(int); // postfix 
    T&operator*() ; // prefix 
} 

爲什麼引用前綴經營回報,同時通過值後綴運算符的回報?

謝謝。

+0

應該是: Ptr_to_T&operator - (); //前綴 Ptr_to_T運算符 - (int); //後綴 – 2009-01-21 15:06:45

回答

8

爲了更好地理解,你必須想象(或看看)這些操作符是如何實現的。通常情況下,++將被寫入或多或少這樣的前綴操作符:

MyType& operator++() 
{ 
    // do the incrementation 
    return *this; 
} 

由於this已被修改,「就地」,我們可以爲了避免無用的副本返回實例的引用。

現在,這裏的後綴運算符++代碼:

MyType operator++(int) 
{ 
    MyType tmp(*this); // create a copy of 'this' 
    ++(*this); // use the prefix operator to perform the increment 
    return tmp; // return the temporary 
} 

作爲後綴運算符返回一個臨時的,它通過值返回它(否則,你會得到一個懸空參考)。

C++ Faq Lite也有一個關於這個問題的段落。

17

後綴運算符在值增加之前返回值的副本,所以它幾乎必須返回一個臨時值。前綴運算符確實返回對象的當前值,因此它可以返回對當前值的引用。

+0

加上你不能通過引用返回臨時的事實,這是一個很好的答案。 – xtofl 2009-01-21 14:46:31

0

假設我使用重載的預增量來增加私有成員。不返回對私有成員的引用將++ private_var表達式轉換爲左值,從而可以直接修改私有成員?

+0

您不會將引用返回給私有成員,而是返回給您的類的對象。 (因爲外部世界正在增加你的對象,而不是私人領域)。 – Kasprzol 2009-01-21 15:18:33