2010-05-05 45 views
10

如何區分重載operator ++的2個版本?C++增加運算符

const T& operator ++(const T& rhs) 

哪一個?

i++; 
++i; 
+13

你的C++教科書對這個主題有什麼要說的? – 2010-05-05 23:10:24

回答

10

這些運算符是一元運算符,即它們不採用右側參數。

至於你的問題,如果你真的必須超載這些運營商,爲preincrement使用簽名const T& operator ++(),併爲後增量,const T& operator(int)。 int參數是一個虛擬的。

+3

它們可以是非成員函數。 – 2010-05-05 23:16:20

+0

@gf真。但那不會是我增量運營商的首選。 (無論如何,我的第一選擇是不重載運算符。) – 2010-05-05 23:19:49

+2

@Daniel:如果你想編寫一個C++的ish迭代器或類似迭代器的對象,你別無選擇。 – 2010-05-06 00:09:30

3

對於後綴++和 - 操作符,函數必須採用虛擬int參數。如果它沒有參數,則它是前綴運算符

2

將後綴增量i++想象爲具有第二個(缺失)參數(即i++x)。所以後綴增量簽名有一個右手參數,而前綴增量沒有。

11

對於非成員的版本,其中一個參數的函數是前綴,而具有兩個參數,第二個是int一個功能是後綴:

struct X {}; 
X& operator++(X&);  // prefix 
X operator++(X&, int); // postfix 

對於構件的版本,零參數版本是前綴和一個參數的版本以int爲後綴:

struct X { 
    X& operator++(); // prefix 
    X operator++(int); // postfix 
}; 

int參數後綴運營商的通話將具有零值。

+0

@gf添加一個示例,這將是最佳答案 – 2010-05-05 23:52:56

+0

@Caspin:好點,完成。 – 2010-05-05 23:58:51