2011-09-01 68 views
3

我使用成員函數將++前綴運算符重載。這裏的原型:前綴運算符重載

Test &operator++(); 

但我的疑問是當我用我的物體,像下面:

Test t; 
++t; 

據我瞭解到,爲任何操作一個成員函數應該重載成爲該運營商的左側的同一類別的對象。但是當我打電話給這個++前綴重載的運算符時,我不需要在左邊有Test類的任何對象。

爲什麼?

+0

我認爲你剛剛得知它錯了。你的例子很好。 –

+0

@Kerrek SB我讀了一本書C++如何編程,第5版第576頁 – teacher

+0

他們可能只說二元運算符,因爲它們的左操作數需要是類類型。但**任何**這個詞肯定會被濫用。 –

回答

1

據我所知,對於任何由成員函數重載的運算符,該運算符左側應該有該同一類的對象。

這將持有任何二進制運營商。增量前和後,以及解引用運算符(*obj)都是一元運算符。它們只有一個參數(函數參數或隱含的「this」參數,取決於您如何重載操作符)以及重載操作符,此唯一參數必須是類類型。

但是,當我調用這個++前綴重載操作符時,我不需要左側的Test類的任何對象。

一元運算符沒有「左」和「右」邊(操作數),它們只有一個操作數。


請記住,在你的情況:

++t; 

只是表示:

t.operator++(); 

所以 - 在某些扭曲的思維 - t確實是左側。 :)

2

你剛剛學習不正確。你怎麼能在一元前綴運算符的左邊有東西?

operator~operator--operator!也是如此。你在他們的左邊也沒有任何東西。

2

然後你學會錯了......

你的例子很好;這確實是如何爲前置增量運算符聲明一個超載。

1

運算符重載提供的語法與任何其他成員(或非成員)函數略有不同。無論您是執行預增量作爲成員函數還是作爲自由函數,您都正在實現預增,預增量的語法爲++obj

3
Test& operator++(); 

始終是C++標準的前綴運算符。

爲了覆蓋後綴操作,您需要使用另一個簽名:

Test& operator++(int); 

這些簽名是由編譯器知道,它會正確地覆蓋右操作。