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