1. 程式人生 > >C++自增自減過載

C++自增自減過載

#include <iostream>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
//前置運算子 ++i
//過載為成員函式
//T operator++()
//T operator--()

//過載全域性函式
//T operator++(T)
//T operator--(T)
//呼叫的形式有 ++obj obj.operato4r++() operator++(obj)


//後置運算子作為二元運算子過載 i++
//多寫一個引數 具體無意義
//過載為成員函式 T operator++(int)    T operator--(int)
//過載為全域性函式 T operator++(T, int) T operator--(T,int)
 //呼叫形式有 obj++ obj.operator++(0) operator(obj,0)
 class CDemo{
     private:
         int n;
     public:
         CDemo(int i = 0):n(i){}
        CDemo operator++();//用於前置形式
        CDemo operator++(int);//用於後置形式
        operator int(){ return n;} //過載括號運算子 強制型別轉換符號
        friend CDemo operator--(CDemo&);//用於前置形式
        friend CDemo operator--(CDemo&,int);//用於後置形式
 };
 
 CDemo CDemo::operator++(){//前置++
     n++;
     return *this;
 }
 
 CDemo CDemo::operator++(int k){//後置++
     CDemo tmp(*this);//儲存修改前的物件 淺複製
    n++;
    return tmp; //返回修改前的物件
 }
 CDemo operator--(CDemo& d){//前置--
     d.n--;
     return d;
 }
 CDemo operator--(CDemo& d,int){//後置--
     CDemo tmp(d);
    d.n--;
    return tmp;
 }

 /*
     operator int(){ return n;}
     int 作為一個型別強制轉換運算子被過載
     Demo s;
     (int) s;//等效與s.int();
     型別強制轉換運算子過載時
     不能寫返回值型別
     實際上其返回值型別--型別強制轉換運算子代表的型別
 
 */
 
int main(int argc, char** argv) {
    CDemo d(5);
    cout<<(d++)<<",";//等價於d.operator(0)
    cout<<d<<",";//過載<< 為全域性函式
    cout<<(++d)<<",";//等價於d.operator++()
    cout<<d<<endl;
    
    
    cout<<(d--)<<",";//等價於operator--(d,0)
    cout<<d<<",";//
    cout<<(--d)<<",";//等價於operator--(d)
    cout<<d<<endl;
    return 0;
}




/*

運算子過載注意事項
1 C++不允許定義新的運算子
 過載後的運算子的含義符合日常習慣
 運算子過載不改變運算子優先級別
 **以下運算子不能被過載: . .*  :: ?: sizeof
 **過載運算子() [] -> 或者賦值運算子=時,過載函式必須宣告為類的成員函式。

*/