青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 25, 文章 - 0, 評論 - 6, 引用 - 0
數據加載中……

C++操作符重載

//原文鏈接: http://blog.csdn.net/xiegenwendada/article/details/8477209 

#include<stdio.h>  
#include <stdlib.h>  

/*///////////////////////////// 操作符重載 ////////////////////////////////////////////
-
-    操作符重載必須是,參數類型或個數不同,還有是否為const,但不以返回值的類型左判斷。
-
-    ------------------------------------------------------------------------------------    
-    |            不能重載的操作符號            |            可以重載的操作符                |
-    ------------------------------------------------------------------------------------
-    |    . .* :: ?: new delete sizeof        |    new new[] delete delete[] + - * / % ^    |
-    |    typeid static_cast dynamic_cast        |    & | ~ ! = < > += -= *= /= %=  ^= &= |=    |
-    |    const_cast reintERPret_cast            |    << >> >>= <<= == != <= >= && || ++ --    |
-    |                                        |    ->* -> () []                            |
-    -------------------------------------------------------------------------------------
-    
-
-    ------------------------------------------------------------------------------------    
-    |            類成員操作符重載            |            友員函數操作符重載                |
-    ------------------------------------------------------------------------------------
-    |        左右操作數都是該類對象            |            左操作數為其它類型                |
-    | 必須為類成員操作符:                    |                                            |
-    | 賦值(=),下標([]),調用(())        |                                            |
-    | 和成員訪問箭頭(->)                    |                                            |
-    -------------------------------------------------------------------------------------
-
//////////////////////////////// 操作符重載 ////////////////////////////////////////////
*/

// 簡單的重載
class CBaseOperator  
{  

public:  
    int nData;        //測試的變量  

public:  
    CBaseOperator(int nData = 0):nData(nData)  
    {  
        nData++;  
        --nData;  
    }  


    CBaseOperator(const CBaseOperator& cBO)  
    {  
        nData = cBO.nData;  
    }  
    //重載=操作符,一般=操作符和拷貝構造函數是成對出現的。  
    const CBaseOperator& operator=(const CBaseOperator& cBO)  
    {  
        nData = cBO.nData;  
        return *this;  
    }  

public:  

    //重載+操作符,簡單的二元操作符重載是最常見也是比較簡單的。基本思路都是這樣,注意如果  
    
//操作符出現在左邊,則只能用友員了。這里了有幾個返回類型是CBaseOperator,return  
    
//語句中卻是兩個int相加,這種情況是可以通過的,編譯器會自動構建一個相應的對象返回,  
    
//前提是你的構造函數要有相應的參數,這里是int作為參數  
    int operator+(int nAdd) const  
    {  
        return nData + nAdd;  
    }  

    int operator+(int nAdd)  
    {  
        return nData + nAdd;  
    }  

    friend int operator+(int nAdd,const CBaseOperator& cAdd)  
    {  
        return nAdd + cAdd.nData;  
    }  

    CBaseOperator operator+(const CBaseOperator& cAdd) const  
    {  
        return nData + cAdd.nData;  
    }  

    //重載減法什么的也是一樣。就不寫了。哈哈  

    
//比較操作符重載==,!=,>, >=, <, <=總結:這里都是配套的操作一般來說如果寫一個  
    
//都會重載其他幾個,特別是==,!=。當然也有例外。哈哈。。  
    bool operator==(const CBaseOperator& cEqual) const  
    {  
        return nData == cEqual.nData;  
    }  
    bool operator == (int nEqual) const  

    {        

        return nData == nEqual;  
    }  
    friend bool operator ==(int nEqual, const CBaseOperator& cEqual)  
    {  
        return cEqual.nData == nEqual;  
    }  
    bool operator!=(const CBaseOperator& cEqual) const  
    {  
        return nData != cEqual.nData;  
    }  

    //其他的也就不寫了,基本一樣。哈哈  

    
//重載++,--操作符,因為++,--有兩種方式,一種是前增量(++XXX先改變自己,返回),  
    
//一種是后增量(改變自己,返回改變前的狀態)  
    
//因為重載是判斷參數的,為了能區別前增量和后增量,C++的設計者做了這樣的考慮。  
    
//就是重載后增量的時候在參數列表中加一個int類型參數,這樣就避免的重載的重復了。  
    
//在調用上,如果都重載,那么用int參數的是后增量++,沒有參數的是前增量++,  
    
//(注:我在這里說的是成員函數,當然友員的重載參數個數要多一個,以后的我可別說我無知啊。)  
    
//如果都重載,那么前增量和后增量都會調用相應的函數,如果只重載了后增量,那么前增量會失敗  
    
//如果只重載了前增量,就會無論是前增量和后增量都會調用這個函數。所以一般他們也是成對  
    
//出現的,除非你懶,只寫前增量,可惜如果人家要調用后增量呢?結果會錯的哦。哈哈。  

    
//重載后增量.  
    CBaseOperator operator++(int)  
    {  
        CBaseOperator cTemp = *this;  
        ++nData;  
        return cTemp;  
    }  

    //重載前增量  
    CBaseOperator& operator++()  
    {  
        ++nData;  
        return *this;  
    }  

    //重載--操作符是一樣的,也不寫了。  

    
//重載[],()等操作符號,同樣[]的參數個數是確定的。  
    
//我之說以把他們寫一起,是因為我錯誤的以為[]的參數個數是可以自己定義。錯了錯了。  
    
//知錯能改是好的,對了,()的參數個數是可以自己定義的。這個就給我們很大的發揮空間了。  
    
//都忘了[],() = 等操作符必須是成員函數,上面有寫。不能用友員和靜態成員函數  

    
//重載[]  
    int operator[](int nIndex) const  
    {  
        return nIndex;  
    }  

    //重載()  
    int operator()(int a) const  
    {  
        return a;  
    }  

    bool operator()(int a, int b) const  
    {  
        return a > b;  
    }  

    CBaseOperator operator()(int a, int b, int c)  
    {  
        return CBaseOperator(a+b+c+*this);  
    }  

    //重載*,->的操作符,*操作符就是相當于指針的*p;不過這里已經失去了原來的意義,他不是一個指針了。  
    
//但如果是想通過他來得到一些東西,也是可以的,特別在迭代器中常用這種方法。->也是和*配對出現的。  
    
//不過->操作符比較有意思,貌似和(*p).dddd真的差不多,所以返回的應該是一個結構的指針,我們這里  
    
//就返回了本身,當然可以返回任何結構的指針的。(并不是只能返回本身)。  

    
//重載*,這里參數個數是固定的,多寫一個就成了乘法的操作了。哈哈  
    int operator*() const  
    {  
        return nData;  
    }  

    //重載->  
    CBaseOperator* operator->()  
    {  
        return this;  
    }  

    //其他的例如&& || 這樣的操作符還是不重載的好。利用其原有的本性  

    
//重載new delete,這里編譯器做了一個限制,new必須返回void*類型, delete必須  
    
//返回void類型。(上面說過函數重載是不檢查返回類型的,和這里并沒有沖突,他只是限定了返回  
    
//類型,而不是只有返回類型不同的函數能重載,這個是編譯器做的工作,一定上確保new能更好的工作吧)  
    
//還有就是他們的參數個數都是可以自定義的。new 和 new[] 是兩個不同的操作符,所以還是要分別重載一下。  
    
//delete 和 delete[] 也是兩個不同的操作符。這里只重載了一個。  
    voidoperator new(size_t size)  
    {  

        return  malloc(size);  
    }  

    voidoperator new[](size_t size)  
    {  
        return  malloc(size);  
    }  

    void operator delete(void* P, unsigned int size)  
    {  
        size = 0;  
        free(P);  
    }  
};  

int test_OverLoad()  
{  
    const CBaseOperator cCo1(100);  

    //判斷+重載符  
    int nSum = cCo1 + 50;  
    printf("%d\n", nSum);  
    nSum = 50 + cCo1;  
    printf("%d\n", nSum);  

    //這里順便檢測一下拷貝構造函數  
    CBaseOperator co2(20);  
    CBaseOperator co3 = co2 + cCo1;  
    nSum = co3.nData;  
    printf("%d\n", nSum);  

    nSum = co3 + 60;  
    printf("%d\n", nSum);  

    //檢測+,和=操作符  
    co3 = 10 + cCo1 + co2 + 20;  
    nSum = co3.nData;  
    printf("%d\n", nSum);  

    //查看比較操作符  
    if (cCo1 == cCo1 && cCo1 == 100 && 100 == cCo1)  
    {  
        printf("True\n");  
    }  
    co3 = co2;  
    if (!(co3 != co2))  
    {  
        printf("True\n");  
    }  

    //增量操作符,cCo1是不能做這個操作的,因為他是常量  
    nSum = co2.nData;  

    printf("%d\n", nSum);  

    nSum = (co2++).nData;  
    printf("%d\n", nSum);  
    nSum = (++co2).nData;  
    printf("%d\n", nSum);  

    //測試[],  
    nSum = cCo1[45];  
    printf("%d\n", nSum);  

    //測試()  
    nSum = cCo1(50);  
    printf("%d\n", nSum);  

    if (cCo1(45, 23))  
    {  
        printf("True\n");  
    }  

    co2 = co3(10,20,30);  
    nSum = co2.nData;  
    printf("%d\n", nSum);  

    //測試*,這里co2并不是指針哦。只是重載了*的操作符  
    nSum = *co2;  
    printf("%d\n", nSum);  

    //測試->,這里也一樣。  
    nSum = co2->nData;  
    printf("%d\n", nSum);  

    //測試new new[] delete,  
    
//這里沒有測試輸出。單步就知道了。  
    CBaseOperator* pCb1 = new CBaseOperator();  
    CBaseOperator* pCb2 = new CBaseOperator[10];  
    delete pCb1;  
    delete pCb2;  
    system("pause");  
    return 0;  

posted on 2013-03-07 11:07 chenjt3533 閱讀(214) 評論(0)  編輯 收藏 引用 所屬分類: C/C++

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲激情视频网| 欧美91大片| 亚洲夫妻自拍| 久久久综合网站| 久久久免费精品视频| 欧美在线不卡视频| 欧美在线免费播放| 久久永久免费| 亚洲人体一区| 亚洲欧美日本日韩| 久久另类ts人妖一区二区| 欧美成人午夜免费视在线看片| 欧美精品电影| 国产女优一区| 亚洲三级网站| 欧美在线不卡| 亚洲国产精品一区二区三区| 一本久久a久久免费精品不卡| 亚洲一区二区三区在线视频| 久久都是精品| 欧美日本韩国一区| 国产婷婷色一区二区三区在线| 亚洲福利视频网| 亚洲综合视频网| 欧美激情无毛| 性欧美xxxx大乳国产app| 欧美精品国产一区| 极品av少妇一区二区| 亚洲午夜国产成人av电影男同| 久久米奇亚洲| 亚洲天天影视| 欧美极品色图| 影音国产精品| 久久精品国产亚洲aⅴ| 亚洲精品中文字幕在线观看| 久久久国产一区二区三区| 欧美视频久久| 日韩视频永久免费观看| 久久综合色综合88| 亚洲一区二区三区精品在线| 久久视频免费观看| 99视频一区| 欧美顶级艳妇交换群宴| 伊人久久婷婷色综合98网| 欧美一级二级三级蜜桃| 99精品视频一区二区三区| 欧美成人免费观看| 亚洲电影天堂av| 浪潮色综合久久天堂| 久久aⅴ国产欧美74aaa| 国产精品视频久久| 午夜精品久久久久久久99水蜜桃| 亚洲免费不卡| 欧美日韩三级| 亚洲视频观看| 99国产精品久久久久久久成人热| 欧美成人一品| 亚洲免费观看高清完整版在线观看熊 | 国产视频在线观看一区二区三区 | 伊人成综合网伊人222| 欧美一二区视频| 亚洲在线播放| 国产亚洲视频在线观看| 欧美一区2区三区4区公司二百| 国产精品99久久久久久久久久久久| 欧美精品乱码久久久久久按摩| 亚洲精品美女久久久久| 亚洲国内自拍| 欧美亚洲第一区| 欧美在线不卡视频| 久久精品女人| 91久久夜色精品国产网站| 亚洲激情社区| 国产精品激情| 久久影院午夜论| 欧美阿v一级看视频| 亚洲久久成人| 亚洲一区二区久久| 黄色成人av在线| 亚洲电影第1页| 国产精品初高中精品久久| 欧美在线免费看| 久久久蜜桃一区二区人| 亚洲精品人人| 亚洲免费一在线| 亚洲国产精品久久久久秋霞蜜臀 | 欧美寡妇偷汉性猛交| 欧美日本精品一区二区三区| 亚洲在线观看视频网站| 欧美中文字幕在线观看| 亚洲另类春色国产| 久久福利精品| 免费高清在线视频一区·| 亚洲一区二区欧美| 久久不射中文字幕| 一区二区三区成人精品| 欧美一级久久| 一区二区三区欧美激情| 欧美中文字幕在线| 亚洲视频综合在线| 久久综合狠狠综合久久综青草| 亚洲一区二区在线免费观看| 久久精品二区三区| 亚洲一区二区三区中文字幕| 麻豆国产精品777777在线| 欧美伊人精品成人久久综合97| 欧美高清影院| 免费看亚洲片| 国产一区自拍视频| 亚洲一区二区久久| 一本在线高清不卡dvd | 免费观看国产成人| 国产精品v日韩精品v欧美精品网站 | 在线不卡a资源高清| 亚洲天堂成人| 亚洲婷婷国产精品电影人久久| 久久免费视频在线| 久久本道综合色狠狠五月| 欧美日韩中文精品| 亚洲国产精品久久久久秋霞影院 | 精品9999| 久久高清国产| 久久精品一区二区三区不卡| 国产精品成人一区二区艾草| 亚洲伦理自拍| 一个色综合av| 欧美日韩中文字幕精品| 亚洲精品乱码久久久久久久久| 亚洲精品国产无天堂网2021| 老司机精品视频网站| 嫩草影视亚洲| 亚洲国产精品999| 老**午夜毛片一区二区三区| 美女免费视频一区| 有码中文亚洲精品| 久久久www成人免费毛片麻豆| 欧美在线啊v一区| 国产午夜精品在线观看| 香蕉久久夜色精品国产| 久久精品国产亚洲一区二区三区| 国产区二精品视| 欧美一区二视频| 久久亚洲精品中文字幕冲田杏梨| 韩国三级电影一区二区| 久久久一区二区| 亚洲国产美女精品久久久久∴| 亚洲美女中文字幕| 欧美三区在线视频| 亚洲欧美国产高清| 久久亚洲视频| 亚洲日本乱码在线观看| 欧美日韩在线影院| 亚洲自拍偷拍网址| 久久久久成人精品| 久久嫩草精品久久久精品| 六月丁香综合| 亚洲美女在线国产| 国产精品女人久久久久久| 亚洲欧美视频| 噜噜噜躁狠狠躁狠狠精品视频| 1024成人网色www| 欧美屁股在线| 欧美一级免费视频| 欧美激情精品久久久久久久变态 | 亚洲欧美另类国产| 国产一区二区三区在线观看视频| 久久久久久久久蜜桃| 亚洲人成在线观看一区二区| 亚洲欧美视频在线观看视频| 狠狠色综合网站久久久久久久| 欧美激情精品久久久久久久变态| 亚洲视频香蕉人妖| 蜜臀av在线播放一区二区三区| 日韩一二三在线视频播| 国产香蕉97碰碰久久人人| 欧美激情影音先锋| 久久成人精品无人区| 亚洲美女诱惑| 蜜桃久久av| 午夜视频在线观看一区二区| 国内精品久久久久久久97牛牛| 欧美伦理91| 久久综合999| 亚洲男女自偷自拍| 亚洲精品国产日韩| 免费的成人av| 久久精品卡一| 亚洲欧美另类久久久精品2019| 悠悠资源网亚洲青| 国产精品一区视频网站| 欧美国产免费| 久久女同互慰一区二区三区| 亚洲女人小视频在线观看| 91久久精品美女高潮| 欧美1区免费| 久久一区精品| 久久精品视频一| 欧美亚洲专区| 亚洲欧美亚洲| 亚洲综合三区|