• <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>

            隨感而發(fā)

            雜七雜八

            統(tǒng)計(jì)

            留言簿(13)

            閱讀排行榜

            評論排行榜

            c++操作符重載

            今天我學(xué)習(xí)的是C++操作符重載。C++的操作符重載給C++帶來很大的方便和靈活性??梢灾剌d里面大部分操作符。這樣在調(diào)用的時(shí)候就會(huì)相對的自然和簡單。廢話少說,直接奉上源代碼(有部分相關(guān)的資料的注釋都已經(jīng)寫在源代碼上了):
              1 //一位是學(xué)習(xí)代碼,所以寫的相對叫亂,如果是其他的就應(yīng)該規(guī)范些
              2 #include<stdio.h>
              3 #include <stdlib.h>
              4 
              5 //總結(jié):重載操作符可以寫成成員函數(shù)和友員函數(shù)。成員函數(shù)是類內(nèi)部的
              6 //函數(shù),而友員函數(shù)是外部的函數(shù),例如全局函數(shù),甚至其他類里面的函數(shù),我的習(xí)慣是
              7 //寫成成員函數(shù),因?yàn)槲矣X得這樣感覺要好一點(diǎn),而且在成員函數(shù)中參數(shù)還可以少一個(gè)。
              8 //哈哈,不過問題就是他不能重載左二元操作符(符號在他的左邊),也就是操作符是在他的左邊,所以在
              9 //重載一個(gè)整數(shù)和這個(gè)類相加的情況就只能寫友員函數(shù)了。
             10 //重載操作符的參數(shù)個(gè)數(shù)一定要跟默認(rèn)參數(shù)個(gè)數(shù)的一樣,除了()這樣的可以自己定義以外,
             11 //例如operator+();這是錯(cuò)誤的,還有operator(int a, int b,int c);這也是錯(cuò)誤的
             12 //我下面之所以只有一個(gè),是因?yàn)樗浅蓡T函數(shù)。自己已經(jīng)包括在里面了,而友員就必須兩個(gè)都寫。
             13 //重載的返回類型沒有規(guī)定,C++也不是用返回來判斷是否重載的,
             14 //他是根據(jù)函數(shù)名和參數(shù)列表來判斷的。成員函數(shù)加const也是重載的一種,但是如果其他都一樣只有
             15 //返回類型不一致,就認(rèn)為是錯(cuò)誤的重載。例如:
             16 //int operator+(int nAdd) const;和 
             17 //CBaseOperator operator+(const CBaseOperator& cAdd) const;就會(huì)認(rèn)為是錯(cuò)誤的重載
             18 //而int operator+(int nAdd) const;和int operator+(int nAdd);就是正確的,他們是兩個(gè)不同的函數(shù)
             19 //在調(diào)用上,在未指明為const的類調(diào)用時(shí),使用的是非const的函數(shù)。如果沒有非const的函數(shù),
             20 //他才會(huì)調(diào)用const的函數(shù)。而如果const的類去調(diào)用非const的函數(shù),會(huì)直接報(bào)錯(cuò)。所以
             21 //在寫代碼時(shí),可以考慮是不是可能會(huì)修改成員,如果希望是不修改的,那么請用const,這樣強(qiáng)制性的
             22 //會(huì)提高你的編碼能力的。(扯遠(yuǎn)了,呵呵。)
             23 //都說友員是一個(gè)強(qiáng)大的東東,可以訪問內(nèi)部的private函數(shù)和變量,但是,如果把拷貝構(gòu)造函數(shù)和
             24 //=重載為私有的話,他是不能訪問的。。哈哈。設(shè)計(jì)語言的人真厲害。。
             25 
             26 //百度百科找的資料:
             27 //什么時(shí)候定義類成員操作符重載,什么時(shí)候定義非類成員操作符重載?
             28 //答:(1)如果一個(gè)重載操作符是類成員,那么只有當(dāng)跟它一起使用的左操作數(shù)是該類對象時(shí),
             29 //它才會(huì)被調(diào)用,如果該操作符的左操作數(shù)必須是其他類型,那么重載操作符必須是非類成員操作符重載。
             30 //(2)C++要求,賦值(=),下標(biāo)([ ]),調(diào)用(())和成員訪問箭頭(->)操作符必須被指定為類成員操作符,否則錯(cuò)誤。
             31 
             32 //http://www.examda.com/ncre2/cpp/fudao/20080312/092830274-2.html 網(wǎng)站的資料
             33 //不能重載的操作符號:
             34 //. .* :: ?: new delete sizeof typeid static_cast dynamic_cast const_cast reintERPret_cast
             35 //可以重載的操作符:
             36 //operator new operator delete operator new[] operator delete[] 
             37 // + - * / % ^ & | ~ ! = < > += -= *= /= %=  ^= &= |= << >> >>= <<= == !=
             38 // <= >= && || ++ -- , ->* -> () []
             39 //貌似這里可以重載new
             40 
             41 //重載簡單的+-*/%等
             42 class CBaseOperator
             43 {
             44 
             45 public:
             46     int nData;        //測試的變量
             47 
             48 public:
             49     CBaseOperator(int nData = 0):nData(nData)
             50     {
             51         nData++;
             52         --nData;
             53     }
             54 
             55     
             56     CBaseOperator(const CBaseOperator& cBO)
             57     {
             58         nData = cBO.nData;
             59     }
             60     //重載=操作符,一般=操作符和拷貝構(gòu)造函數(shù)是成對出現(xiàn)的。
             61     const CBaseOperator& operator=(const CBaseOperator& cBO)
             62     {
             63         nData = cBO.nData;
             64         return *this;
             65     }
             66 
             67 public:
             68 
             69     //重載+操作符,簡單的二元操作符重載是最常見也是比較簡單的?;舅悸范际沁@樣,注意如果
             70     //操作符出現(xiàn)在左邊,則只能用友員了。這里了有幾個(gè)返回類型是CBaseOperator,return
             71     //語句中卻是兩個(gè)int相加,這種情況是可以通過的,編譯器會(huì)自動(dòng)構(gòu)建一個(gè)相應(yīng)的對象返回,
             72     //前提是你的構(gòu)造函數(shù)要有相應(yīng)的參數(shù),這里是int作為參數(shù)
             73     int operator+(int nAdd) const
             74     {
             75         return nData + nAdd;
             76     }
             77 
             78     int operator+(int nAdd)
             79     {
             80         return nData + nAdd;
             81     }
             82     
             83     friend int operator+(int nAdd,const CBaseOperator& cAdd)
             84     {
             85         return nAdd + cAdd.nData;
             86     }
             87     
             88     CBaseOperator operator+(const CBaseOperator& cAdd) const
             89     {
             90         return nData + cAdd.nData;
             91     }
             92 
             93     //重載減法什么的也是一樣。就不寫了。哈哈
             94 
             95     //比較操作符重載==,!=,>, >=, <, <=總結(jié):這里都是配套的操作一般來說如果寫一個(gè)
             96     //都會(huì)重載其他幾個(gè),特別是==,!=。當(dāng)然也有例外。哈哈。。
             97     bool operator==(const CBaseOperator& cEqual) const
             98     {
             99         return nData == cEqual.nData;
            100     }
            101     bool operator == (int nEqual) const
            102     {
            103         return nData == nEqual;
            104     }
            105     friend bool operator ==(int nEqual, const CBaseOperator& cEqual)
            106     {
            107         return cEqual.nData == nEqual;
            108     }
            109     bool operator!=(const CBaseOperator& cEqual) const
            110     {
            111         return nData != cEqual.nData;
            112     }
            113 
            114     //其他的也就不寫了,基本一樣。哈哈
            115 
            116     //重載++,--操作符,因?yàn)?+,--有兩種方式,一種是前增量(++XXX先改變自己,返回),
            117     //一種是后增量(改變自己,返回改變前的狀態(tài))
            118     //因?yàn)橹剌d是判斷參數(shù)的,為了能區(qū)別前增量和后增量,C++的設(shè)計(jì)者做了這樣的考慮。
            119     //就是重載后增量的時(shí)候在參數(shù)列表中加一個(gè)int類型參數(shù),這樣就避免的重載的重復(fù)了。
            120     //在調(diào)用上,如果都重載,那么用int參數(shù)的是后增量++,沒有參數(shù)的是前增量++,
            121     //(注:我在這里說的是成員函數(shù),當(dāng)然友員的重載參數(shù)個(gè)數(shù)要多一個(gè),以后的我可別說我無知啊。)
            122     //如果都重載,那么前增量和后增量都會(huì)調(diào)用相應(yīng)的函數(shù),如果只重載了后增量,那么前增量會(huì)失敗
            123     //如果只重載了前增量,就會(huì)無論是前增量和后增量都會(huì)調(diào)用這個(gè)函數(shù)。所以一般他們也是成對
            124     //出現(xiàn)的,除非你懶,只寫前增量,可惜如果人家要調(diào)用后增量呢?結(jié)果會(huì)錯(cuò)的哦。哈哈。
            125 
            126     //重載后增量.
            127     CBaseOperator operator++(int)
            128     {
            129         CBaseOperator cTemp = *this;
            130         ++nData;
            131         return cTemp;
            132     }
            133 
            134     //重載前增量
            135     CBaseOperator& operator++()
            136     {
            137         ++nData;
            138         return *this;
            139     }
            140 
            141     //重載--操作符是一樣的,也不寫了。
            142 
            143     //重載[],()等操作符號,同樣[]的參數(shù)個(gè)數(shù)是確定的。
            144     //我之說以把他們寫一起,是因?yàn)槲义e(cuò)誤的以為[]的參數(shù)個(gè)數(shù)是可以自己定義。錯(cuò)了錯(cuò)了。
            145     //知錯(cuò)能改是好的,對了,()的參數(shù)個(gè)數(shù)是可以自己定義的。這個(gè)就給我們很大的發(fā)揮空間了。
            146     //都忘了[],() = 等操作符必須是成員函數(shù),上面有寫。不能用友員和靜態(tài)成員函數(shù)
            147 
            148     //重載[]
            149     int operator[](int nIndex) const
            150     {
            151         return nIndex;
            152     }
            153 
            154     //重載()
            155     int operator()(int a) const
            156     {
            157         return a;
            158     }
            159 
            160     bool operator()(int a, int b) const
            161     {
            162         return a > b;
            163     }
            164 
            165     CBaseOperator operator()(int a, int b, int c)
            166     {
            167         return CBaseOperator(a+b+c+*this);
            168     }
            169 
            170     //重載*,->的操作符,*操作符就是相當(dāng)于指針的*p;不過這里已經(jīng)失去了原來的意義,他不是一個(gè)指針了。
            171     //但如果是想通過他來得到一些東西,也是可以的,特別在迭代器中常用這種方法。->也是和*配對出現(xiàn)的。
            172     //不過->操作符比較有意思,貌似和(*p).dddd真的差不多,所以返回的應(yīng)該是一個(gè)結(jié)構(gòu)的指針,我們這里
            173     //就返回了本身,當(dāng)然可以返回任何結(jié)構(gòu)的指針的。(并不是只能返回本身)。
            174 
            175     //重載*,這里參數(shù)個(gè)數(shù)是固定的,多寫一個(gè)就成了乘法的操作了。哈哈
            176     int operator*() const
            177     {
            178         return nData;
            179     }
            180 
            181     //重載->
            182     CBaseOperator* operator->()
            183     {
            184         return this;
            185     }
            186 
            187     //其他的例如&& || 這樣的操作符還是不重載的好。利用其原有的本性
            188 
            189     //重載new delete,這里編譯器做了一個(gè)限制,new必須返回void*類型, delete必須
            190     //返回void類型。(上面說過函數(shù)重載是不檢查返回類型的,和這里并沒有沖突,他只是限定了返回
            191     //類型,而不是只有返回類型不同的函數(shù)能重載,這個(gè)是編譯器做的工作,一定上確保new能更好的工作吧)
            192     //還有就是他們的參數(shù)個(gè)數(shù)都是可以自定義的。new 和 new[] 是兩個(gè)不同的操作符,所以還是要分別重載一下。
            193     //delete 和 delete[] 也是兩個(gè)不同的操作符。這里只重載了一個(gè)。
            194     void* operator new(size_t size)
            195     {
            196         
            197         return  malloc(size);
            198     }
            199 
            200     void* operator new[](size_t size)
            201     {
            202         return  malloc(size);
            203     }
            204 
            205     void operator delete(void* P, unsigned int size)
            206     {
            207         size = 0;
            208         free(P);
            209     }
            210 };
            211 
            212 int main()
            213 {
            214     const CBaseOperator cCo1(100);
            215 
            216     //判斷+重載符
            217     int nSum = cCo1 + 50;
            218     printf("%d\n", nSum);
            219     nSum = 50 + cCo1;
            220     printf("%d\n", nSum);
            221 
            222     //這里順便檢測一下拷貝構(gòu)造函數(shù)
            223     CBaseOperator co2(20);
            224     CBaseOperator co3 = co2 + cCo1;
            225     nSum = co3.nData;
            226     printf("%d\n", nSum);
            227 
            228     nSum = co3 + 60;
            229     printf("%d\n", nSum);
            230 
            231     //檢測+,和=操作符
            232     co3 = 10 + cCo1 + co2 + 20;
            233     nSum = co3.nData;
            234     printf("%d\n", nSum);
            235 
            236     //查看比較操作符
            237     if (cCo1 == cCo1 && cCo1 == 100 && 100 == cCo1)
            238     {
            239         printf("True\n");
            240     }
            241     co3 = co2;
            242     if (!(co3 != co2))
            243     {
            244         printf("True\n");
            245     }
            246 
            247     //增量操作符,cCo1是不能做這個(gè)操作的,因?yàn)樗浅A?/span>
            248     nSum = co2.nData;
            249     printf("%d\n", nSum);
            250     nSum = (co2++).nData;
            251     printf("%d\n", nSum);
            252     nSum = (++co2).nData;
            253     printf("%d\n", nSum);
            254 
            255     //測試[],
            256     nSum = cCo1[45];
            257     printf("%d\n", nSum);
            258 
            259     //測試()
            260     nSum = cCo1(50);
            261     printf("%d\n", nSum);
            262     
            263     if (cCo1(4523))
            264     {
            265         printf("True\n");
            266     }
            267 
            268     co2 = co3(10,20,30);
            269     nSum = co2.nData;
            270     printf("%d\n", nSum);
            271 
            272     //測試*,這里co2并不是指針哦。只是重載了*的操作符
            273     nSum = *co2;
            274     printf("%d\n", nSum);
            275 
            276     //測試->,這里也一樣。
            277     nSum = co2->nData;
            278     printf("%d\n", nSum);
            279 
            280     //測試new new[] delete,
            281     //這里沒有測試輸出。單步就知道了。
            282     CBaseOperator* pCb1 = new CBaseOperator();
            283     CBaseOperator* pCb2 = new CBaseOperator[10];
            284     delete pCb1;
            285     delete pCb2;
            286 
            287     system("pause");
            288     return 0;
            289 }
            290 

            posted on 2009-04-01 13:10 shongbee2 閱讀(19697) 評論(8)  編輯 收藏 引用 所屬分類: c/c++

            評論

            # re: c++操作符重載 2009-04-01 22:52 Herb

            如果理解了,可能就幾句就說清了,如果不理解,可能就是長篇大論。  回復(fù)  更多評論   

            # re: c++操作符重載 2009-04-01 23:59 shongbee2

            @Herb
            貌似我沒有懂大俠的話!您的意思是我寫的啰嗦了是吧!呵呵,謝謝啦。
            我語文很爛,不過我會(huì)努力改正的。呵呵。耽誤了您的時(shí)間,抱歉哈。  回復(fù)  更多評論   

            # re: c++操作符重載 2009-04-15 16:04 yatou

            哈~看完了,學(xué)到不少東西了~謝謝啦~  回復(fù)  更多評論   

            # re: c++操作符重載 2009-04-17 01:16 shongbee2

            @yatou
            呵呵,能給你帶來幫助是對我最大的獎(jiǎng)賞。加油。  回復(fù)  更多評論   

            # re: c++操作符重載 2009-05-14 12:08 tw

            感謝你與大家分享  回復(fù)  更多評論   

            # re: c++操作符重載 2010-03-11 09:48

            很好,呵呵  回復(fù)  更多評論   

            # re: c++操作符重載 2012-03-20 16:10 wenxin

            收益了  回復(fù)  更多評論   

            # re: c++操作符重載 2012-04-19 22:45 張永昌

            其實(shí),c++標(biāo)準(zhǔn)庫有內(nèi)建的工具幫你生成其它的所有大小的操作符,只需要重載其中的兩個(gè)比較操作符就可以了,根據(jù)你的語義可以采用,沒必要寫這么多的代碼。  回復(fù)  更多評論   

            久久久久国色AV免费看图片| 久久精品中文字幕大胸| 伊人久久精品无码av一区| 久久无码AV中文出轨人妻| 国内精品久久久久久久久| 97久久精品人人澡人人爽| 一本伊大人香蕉久久网手机| 久久精品国产亚洲av日韩| 麻豆亚洲AV永久无码精品久久| 国内精品九九久久精品| 97久久婷婷五月综合色d啪蜜芽| 精品久久久无码21p发布| 伊人久久大香线蕉综合影院首页| 久久99精品久久久大学生| 伊人久久大香线蕉av不卡| 麻豆AV一区二区三区久久| 久久发布国产伦子伦精品| 国产成人综合久久综合| 欧美伊香蕉久久综合类网站| 久久91这里精品国产2020| 久久青青草原亚洲av无码| 久久精品青青草原伊人| 精品久久久久久成人AV| 99久久精品免费国产大片| 久久久久无码精品国产app| 2021国产精品午夜久久| 日本人妻丰满熟妇久久久久久| 99久久精品日本一区二区免费| 国产日韩欧美久久| 久久亚洲AV无码精品色午夜| avtt天堂网久久精品| 久久久精品国产亚洲成人满18免费网站| 午夜福利91久久福利| 亚洲AV无码1区2区久久| 国产精品成人久久久久久久| yy6080久久| 99久久成人国产精品免费| 亚洲精品国产综合久久一线| 国内精品久久久久影院免费| 无码乱码观看精品久久| 国产精品久久亚洲不卡动漫|