1) 不論是 increment 或 decrement 的前綴還是后綴都只有一個參數。為了解決這個語言問題,C++
規定后綴形式有一個 int 類型參數,當函數被調用時,編譯器傳遞一個 0 做為 int 參數的值
給該函數(即:decrement函數)。示例如下:
/******************************************************************************
@-Author : Jacc.Kim
@-create : [11-25-2013 20:33:55]
@-summary : c++的increment與decrement學習
@-modified:
******************************************************************************/
class UPInt
{
public:
/**************************************************************************
@-summary : ++ 前遞增操作符重載
@-in param:
@-return :
@-!!!note : 1) 該函數返回的是當前對象自增后的引用。一定注意:是引用。
@- 2) 該函數沒有輸入參數
@- 3) 下面的 -- 前遞減操作符重載類似
**************************************************************************/
UPInt &operator++() {
// 處理遞增操作
//
// some code here 
..
//
// 返回自身實例
return *this;
}
/**************************************************************************
@-summary : ++ 后遞增操作符重載
@-in param:
@-return :
@-!!!note : 1) 該函數返回的是當前對象自增前的一個const副本。一定注意:是const副本。
@- 2) 該函數接受一個int型參數,但實際上,該參數是沒有任何作用的。
@- 3) 下面的 -- 后遞減操作符重載類似
**************************************************************************/
const UPInt operator++(int) {
UPInt retObj = *this;
++(*this);
return retObj;
}
/**************************************************************************
@-summary : -- 前遞增操作符重載
@-in param:
@-return :
@-!!!note : 1) 該函數返回的是當前對象自減前的引用。一定注意:是引用。
@- 2) 該函數沒有輸入參數
**************************************************************************/
UPInt &operator--() {
// 處理遞減操作
//
// some code here 
..
//
// 返回自身實例
return *this;
}
/**************************************************************************
@-summary : ++ 后遞減操作符重載
@-in param:
@-return :
@-!!!note : 1) 該函數返回的是當前對象自減前的一個const副本。一定注意:是const副本。
@- 2) 該函數接受一個int型參數,但實際上,該參數是沒有任何作用的。
**************************************************************************/
const UPInt operator--(int) {
UPInt retObj = *this;
--(*this);
return retObj;
}
public:
UPInt();
virtual ~UPInt();
};//class UPInt
/******************************************************************************
@-summary : 示例使用UPInt的 ++ 與 -- 的前、后操作符重載
@-in param:
@-return :
******************************************************************************/
void testUPIntIncAndDecOperator() {
UPInt theObj;
++theObj; // 調用 theObj.operator++();
theObj++; // 調用 theObj.operator++(0);
--theObj; // 調用 theObj.operator--();
theObj--; // 調用 theObj.operator--(0);
} 2) 為什么前綴與后綴的返回值會不同??
答:一個后綴 increment 必須返回一個對象(它返回的是增加前的值),但是為什么
是 const 對象呢?假設不是 const 對象,下面的代碼就是正確的:
UPInt i;
i++++; // 兩次 increment 后綴
這組代碼與下面的代碼相同:
i.operator++(0).operator++(0);
很明顯,第一個調用的 operator++函數返回的對象調用了第二個 operator++函數。
有兩個理由導致我們應該厭惡上述這種做法,第一是與內置類型行為不一致。當設計一
個類遇到問題時,一個好的準則是使該類的行為與 int 類型一致。而 int 類型不允許連續進
行兩次后綴 increment:
int i;
i++++; // 錯誤!
第二個原因是使用兩次后綴 increment 所產生的結果與調用者期望的不一致。如上所
示,第二次調用 operator++改變的值是第一次調用返回對象的值,而不是原始對象的值。
因此如果:
i++++;
是合法的,i 將僅僅增加了一次。這與人的直覺相違背,使人迷惑(對于 int 類型和 UPInt
都是一樣),所以最好禁止這么做。
3) 同樣條件下,前綴比后綴操作符來的高效。