2013-07-26 72 views
4

我重載了operator ++的前綴版本。如果重載函數不是我的類的成員*,我如何重載後綴版本?重載postfix操作符++

#include <iostream> 
using namespace std; 

class Number{ 
    int number; 
public: 
    Number(int inNr):number(inNr){} 
    friend void operator++(Number& fst); 
}; 

void operator++(Number& fst){ 
    fst.number=fst.number+1; 
} 

int main(){ 
    Number nr1(1); 
    ++nr1; 
    //nr1++; error: no 'operator++(int)' declared for postfix '++' 
} 

*我明白,如果它是類的成員,我可以使用虛擬INT參數來區分它們。

回答

12

非會員重載還採用了虛擬int參數來區分它們:

friend void operator++(Number&);  // prefix 
friend void operator++(Number&, int); // postfix 

注意,有些人可能希望這些模仿內置運營商分別返回,新的行爲,舊值:

Number& operator++(Number& fst) { 
    fst.number=fst.number+1; 
    return fst; // reference to new value 
} 

Number operator++(Number& fst, int) { 
    Number old = fst; 
    ++fst; 
    return old; // copy of old value 
} 
+0

沒有提到返回類型? –

+0

@MooingDuck:我不喜歡評判;因爲我不喜歡同時做兩件事,所以我會很開心'void'。也許我會添加關於更多傳統行爲的說明。 –

1

我相信(我不能在此刻測試了這一點),你使用虛擬INT作爲第二個參數的運算符重載,即

void operator++(Number& fst, int /*dummy*/){ 
    fst.number=fst.number+1; 
}