MoreEffectiveC++:自增和自減

字號(hào):

很久以前(八十年代),沒有辦法區(qū)分++和--操作符的前綴與后綴調(diào)用。這個(gè)問題遭到程序員的報(bào)怨,于是C++語言得到了擴(kuò)展,允許重載increment 和 decrement操作符的兩種形式。
    然而有一個(gè)句法上的問題,重載函數(shù)間的區(qū)別決定于它們的參數(shù)類型上的差異,但是不論是increment或decrement的前綴還是后綴都只有一個(gè)參數(shù)。為了解決這個(gè)語言問題,C++規(guī)定后綴形式有一個(gè)int類型參數(shù),當(dāng)函數(shù)被調(diào)用時(shí),編譯器傳遞一個(gè)0做為int參數(shù)的值給該函數(shù):
    class UPInt { // "unlimited precision int"
    public:
    UPInt& operator++(); // ++ 前綴
    const UPInt operator++(int); // ++ 后綴
    UPInt& operator--(); // -- 前綴
    const UPInt operator--(int); // -- 后綴
    UPInt& operator+=(int); // += 操作符,UPInts
    // 與ints 相運(yùn)算
    ...
    };
    UPInt i;
    ++i; // 調(diào)用 i.operator++();
    i++; // 調(diào)用 i.operator++(0);
    --i; // 調(diào)用 i.operator--();
    i--; // 調(diào)用 i.operator--(0);
    這個(gè)規(guī)范有一些古怪,不過你會(huì)習(xí)慣的。而尤其要注意的是這些操作符前綴與后綴形式返回值類型是不同的。前綴形式返回一個(gè)引用,后綴形式返回一個(gè)const類型。下面我們將討論++操作符的前綴與后綴形式,這些說明也同樣使用與--操作符。
    從你開始做C程序員那天開始,你就記住increment的前綴形式有時(shí)叫做“增加然后取回”,后綴形式叫做“取回然后增加”。這兩句話非常重要,因?yàn)樗鼈兪莍ncrement前綴與后綴的形式上的規(guī)范。
    // 前綴形式:增加然后取回值
    UPInt& UPInt::operator++()
    {
    *this += 1; // 增加
    return *this; // 取回值
    }
    // postfix form: fetch and increment
    const UPInt UPInt::operator++(int)
    {
    UPInt oldValue = *this; // 取回值
    ++(*this); // 增加
    return oldValue; // 返回被取回的值
    }
    后綴操作符函數(shù)沒有使用它的參數(shù)。它的參數(shù)只是用來區(qū)分前綴與后綴函數(shù)調(diào)用。如果你沒有在函數(shù)里使用參數(shù),許多編譯器會(huì)顯示警告信息,很令人討厭。為了避免這些警告信息,一種經(jīng)常使用的方法時(shí)省略掉你不想使用的參數(shù)名稱