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

隨感而發(fā)

雜七雜八

統(tǒng)計(jì)

留言簿(13)

閱讀排行榜

評(píng)論排行榜

c++操作符重載

今天我學(xué)習(xí)的是C++操作符重載。C++的操作符重載給C++帶來(lái)很大的方便和靈活性。可以重載里面大部分操作符。這樣在調(diào)用的時(shí)候就會(huì)相對(duì)的自然和簡(jiǎn)單。廢話少說(shuō),直接奉上源代碼(有部分相關(guān)的資料的注釋都已經(jīng)寫(xiě)在源代碼上了):
  1 //一位是學(xué)習(xí)代碼,所以寫(xiě)的相對(duì)叫亂,如果是其他的就應(yīng)該規(guī)范些
  2 #include<stdio.h>
  3 #include <stdlib.h>
  4 
  5 //總結(jié):重載操作符可以寫(xiě)成成員函數(shù)和友員函數(shù)。成員函數(shù)是類內(nèi)部的
  6 //函數(shù),而友員函數(shù)是外部的函數(shù),例如全局函數(shù),甚至其他類里面的函數(shù),我的習(xí)慣是
  7 //寫(xiě)成成員函數(shù),因?yàn)槲矣X(jué)得這樣感覺(jué)要好一點(diǎn),而且在成員函數(shù)中參數(shù)還可以少一個(gè)。
  8 //哈哈,不過(guò)問(wèn)題就是他不能重載左二元操作符(符號(hào)在他的左邊),也就是操作符是在他的左邊,所以在
  9 //重載一個(gè)整數(shù)和這個(gè)類相加的情況就只能寫(xiě)友員函數(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è)都寫(xiě)。
 13 //重載的返回類型沒(méi)有規(guī)定,C++也不是用返回來(lái)判斷是否重載的,
 14 //他是根據(jù)函數(shù)名和參數(shù)列表來(lái)判斷的。成員函數(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ù)。如果沒(méi)有非const的函數(shù),
 20 //他才會(huì)調(diào)用const的函數(shù)。而如果const的類去調(diào)用非const的函數(shù),會(huì)直接報(bào)錯(cuò)。所以
 21 //在寫(xiě)代碼時(shí),可以考慮是不是可能會(huì)修改成員,如果希望是不修改的,那么請(qǐng)用const,這樣強(qiáng)制性的
 22 //會(huì)提高你的編碼能力的。(扯遠(yuǎn)了,呵呵。)
 23 //都說(shuō)友員是一個(gè)強(qiáng)大的東東,可以訪問(wèn)內(nèi)部的private函數(shù)和變量,但是,如果把拷貝構(gòu)造函數(shù)和
 24 //=重載為私有的話,他是不能訪問(wèn)的。。哈哈。設(shè)計(jì)語(yǔ)言的人真厲害。。
 25 
 26 //百度百科找的資料:
 27 //什么時(shí)候定義類成員操作符重載,什么時(shí)候定義非類成員操作符重載?
 28 //答:(1)如果一個(gè)重載操作符是類成員,那么只有當(dāng)跟它一起使用的左操作數(shù)是該類對(duì)象時(shí),
 29 //它才會(huì)被調(diào)用,如果該操作符的左操作數(shù)必須是其他類型,那么重載操作符必須是非類成員操作符重載。
 30 //(2)C++要求,賦值(=),下標(biāo)([ ]),調(diào)用(())和成員訪問(wèn)箭頭(->)操作符必須被指定為類成員操作符,否則錯(cuò)誤。
 31 
 32 //http://www.examda.com/ncre2/cpp/fudao/20080312/092830274-2.html 網(wǎng)站的資料
 33 //不能重載的操作符號(hào):
 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 //重載簡(jiǎn)單的+-*/%等
 42 class CBaseOperator
 43 {
 44 
 45 public:
 46     int nData;        //測(cè)試的變量
 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ù)是成對(duì)出現(xiàn)的。
 61     const CBaseOperator& operator=(const CBaseOperator& cBO)
 62     {
 63         nData = cBO.nData;
 64         return *this;
 65     }
 66 
 67 public:
 68 
 69     //重載+操作符,簡(jiǎn)單的二元操作符重載是最常見(jiàn)也是比較簡(jiǎn)單的。基本思路都是這樣,注意如果
 70     //操作符出現(xiàn)在左邊,則只能用友員了。這里了有幾個(gè)返回類型是CBaseOperator,return
 71     //語(yǔ)句中卻是兩個(gè)int相加,這種情況是可以通過(guò)的,編譯器會(huì)自動(dòng)構(gòu)建一個(gè)相應(yīng)的對(duì)象返回,
 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     //重載減法什么的也是一樣。就不寫(xiě)了。哈哈
 94 
 95     //比較操作符重載==,!=,>, >=, <, <=總結(jié):這里都是配套的操作一般來(lái)說(shuō)如果寫(xiě)一個(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     //其他的也就不寫(xiě)了,基本一樣。哈哈
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ù)的是后增量++,沒(méi)有參數(shù)的是前增量++,
121     //(注:我在這里說(shuō)的是成員函數(shù),當(dāng)然友員的重載參數(shù)個(gè)數(shù)要多一個(gè),以后的我可別說(shuō)我無(wú)知啊。)
122     //如果都重載,那么前增量和后增量都會(huì)調(diào)用相應(yīng)的函數(shù),如果只重載了后增量,那么前增量會(huì)失敗
123     //如果只重載了前增量,就會(huì)無(wú)論是前增量和后增量都會(huì)調(diào)用這個(gè)函數(shù)。所以一般他們也是成對(duì)
124     //出現(xiàn)的,除非你懶,只寫(xiě)前增量,可惜如果人家要調(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     //重載--操作符是一樣的,也不寫(xiě)了。
142 
143     //重載[],()等操作符號(hào),同樣[]的參數(shù)個(gè)數(shù)是確定的。
144     //我之說(shuō)以把他們寫(xiě)一起,是因?yàn)槲义e(cuò)誤的以為[]的參數(shù)個(gè)數(shù)是可以自己定義。錯(cuò)了錯(cuò)了。
145     //知錯(cuò)能改是好的,對(duì)了,()的參數(shù)個(gè)數(shù)是可以自己定義的。這個(gè)就給我們很大的發(fā)揮空間了。
146     //都忘了[],() = 等操作符必須是成員函數(shù),上面有寫(xiě)。不能用友員和靜態(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;不過(guò)這里已經(jīng)失去了原來(lái)的意義,他不是一個(gè)指針了。
171     //但如果是想通過(guò)他來(lái)得到一些東西,也是可以的,特別在迭代器中常用這種方法。->也是和*配對(duì)出現(xiàn)的。
172     //不過(guò)->操作符比較有意思,貌似和(*p).dddd真的差不多,所以返回的應(yīng)該是一個(gè)結(jié)構(gòu)的指針,我們這里
173     //就返回了本身,當(dāng)然可以返回任何結(jié)構(gòu)的指針的。(并不是只能返回本身)。
174 
175     //重載*,這里參數(shù)個(gè)數(shù)是固定的,多寫(xiě)一個(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類型。(上面說(shuō)過(guò)函數(shù)重載是不檢查返回類型的,和這里并沒(méi)有沖突,他只是限定了返回
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     //這里順便檢測(cè)一下拷貝構(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     //檢測(cè)+,和=操作符
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     //測(cè)試[],
256     nSum = cCo1[45];
257     printf("%d\n", nSum);
258 
259     //測(cè)試()
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     //測(cè)試*,這里co2并不是指針哦。只是重載了*的操作符
273     nSum = *co2;
274     printf("%d\n", nSum);
275 
276     //測(cè)試->,這里也一樣。
277     nSum = co2->nData;
278     printf("%d\n", nSum);
279 
280     //測(cè)試new new[] delete,
281     //這里沒(méi)有測(cè)試輸出。單步就知道了。
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 閱讀(19724) 評(píng)論(8)  編輯 收藏 引用 所屬分類: c/c++

評(píng)論

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久国产精品99久久久久久老狼| 一本久道久久综合狠狠爱| 午夜精品久久久久久久99水蜜桃| 国产精品一二三| 久久国产精品亚洲77777| 欧美一区二区三区男人的天堂| 国产欧美一区二区精品秋霞影院 | 国产午夜精品一区二区三区视频 | 亚洲精品精选| 亚洲美女黄网| 国产精品一二三四区| 久久婷婷国产综合尤物精品| 久久综合伊人77777麻豆| 日韩视频在线一区二区三区| 国产精品99久久不卡二区| 国产一区二区三区黄| 欧美黄色aaaa| 国产精品任我爽爆在线播放 | 国产精品一二一区| 久久久亚洲人| 欧美成人免费小视频| 亚洲欧美日韩视频一区| 久久久国产91| 亚洲一区二区精品在线| 久久九九免费视频| 在线亚洲自拍| 久久视频精品在线| 日韩午夜在线电影| 国产亚洲一区在线播放| 亚洲国产小视频在线观看| 国产精品一区二区黑丝| 亚洲国产高清自拍| 国产主播喷水一区二区| 日韩视频一区二区三区在线播放免费观看 | 国产精品久久影院| 亚洲国产精品久久久久久女王| 国产精品久久久久久模特| 欧美第一黄网免费网站| 国产亚洲成人一区| 一区二区av| 亚洲人www| 久久精品国产欧美激情| 午夜精品久久久久久99热| 模特精品裸拍一区| 蜜桃视频一区| 国产视频一区免费看| 一区二区三区三区在线| 99精品久久| 麻豆精品传媒视频| 浪潮色综合久久天堂| 国产麻豆综合| 亚洲制服av| 亚洲男女自偷自拍| 欧美亚洲成人网| 99国产欧美久久久精品| 日韩视频一区二区在线观看| 快she精品国产999| 欧美成人69av| 亚洲国产欧美日韩精品| 久久伊人免费视频| 欧美国产日韩精品免费观看| 一区二区三区中文在线观看| 久久国产欧美日韩精品| 欧美在线free| 国内成+人亚洲+欧美+综合在线| 一区二区高清在线观看| 亚洲欧美成人一区二区在线电影 | 久久一区二区三区四区| 免费成人美女女| 91久久国产综合久久蜜月精品 | 国产毛片精品视频| 欧美中文字幕精品| 美女黄色成人网| 国产区精品在线观看| 久久国产乱子精品免费女| 欧美高清视频www夜色资源网| 欧美寡妇偷汉性猛交| 亚洲电影免费观看高清完整版在线观看| 久久国产综合精品| 欧美国产在线观看| 亚洲最新在线| 国产精品一级在线| 久久先锋影音| 亚洲人成人一区二区在线观看| 在线一区视频| 国产亚洲精品aa| 麻豆久久久9性大片| 99精品国产高清一区二区| 先锋影音久久久| 亚洲成人在线| 欧美亚韩一区| 久久久精品日韩欧美| 亚洲精品美女| 久久精品欧美| 99re6这里只有精品| 国产精品无码永久免费888| 久久久久久电影| 亚洲人成网站777色婷婷| 欧美一区二区三区日韩| 亚洲高清视频一区二区| 国产精品视频一| 亚洲国产精品传媒在线观看| 欧美日韩中文字幕| 久久久久久穴| 亚洲午夜免费福利视频| 亚洲第一二三四五区| 欧美在线免费视屏| 99re热这里只有精品免费视频| 国产日韩欧美另类| 欧美日韩成人综合| 久久综合中文色婷婷| 亚洲欧美久久| 一区二区三区四区五区视频| 免费成人黄色| 久久视频国产精品免费视频在线 | 国产农村妇女精品一二区| 欧美大片在线看| 久久久国产成人精品| 在线视频免费在线观看一区二区| 欧美成年人视频网站| 久久激情五月婷婷| 亚洲资源av| 99精品视频网| 亚洲精品久久久久久久久久久| 国产有码在线一区二区视频| 国产精品国产三级欧美二区| 欧美电影免费观看| 美女任你摸久久| 久久久久久9| 久久久久成人精品| 久久国产精品亚洲va麻豆| 亚洲欧美精品在线| 亚洲在线观看| 亚洲自拍偷拍网址| 亚洲欧美另类在线观看| 亚洲色图综合久久| 一本色道久久综合亚洲精品高清| 最新亚洲一区| 91久久中文字幕| 亚洲精品乱码久久久久久按摩观| 亚洲第一色在线| 亚洲国产日韩一区| 亚洲国产精品一区二区www在线| 欧美大片在线观看一区二区| 欧美福利视频| 亚洲国产你懂的| 亚洲电影成人| 日韩一二三区视频| 农村妇女精品| 亚洲尤物影院| 午夜欧美精品| 久久成人亚洲| 免费91麻豆精品国产自产在线观看| 久久久女女女女999久久| 久久综合中文| 欧美日韩和欧美的一区二区| 欧美视频第二页| 国产日产欧美精品| 亚洲成人原创| 亚洲无人区一区| 欧美亚洲免费电影| 久久在线免费观看| 亚洲黄色一区| 亚洲欧美激情四射在线日 | 亚洲大胆人体视频| 在线播放国产一区中文字幕剧情欧美| 国产精品久久久久久久久免费樱桃| 国产精品久久久久久久久久免费看 | 中文欧美字幕免费| 午夜欧美精品久久久久久久| 久久久中精品2020中文| 欧美激情 亚洲a∨综合| 欧美午夜精品久久久久久超碰| 国产精品一区亚洲| 另类亚洲自拍| 亚洲免费av观看| 久久精品欧美| 欧美色精品天天在线观看视频| 国内偷自视频区视频综合| 亚洲免费av片| 久久久精品五月天| 亚洲精品一区二区三区樱花| 亚洲欧美日韩爽爽影院| 欧美aⅴ一区二区三区视频| 国产精品免费一区二区三区在线观看 | 午夜在线播放视频欧美| 亚洲成色www久久网站| 午夜精品福利在线| 欧美精品在线视频| 在线精品观看| 久久成人免费网| 亚洲精品日韩欧美| 久久天天躁夜夜躁狠狠躁2022| 欧美午夜不卡| 亚洲毛片av| 免费成人av在线看| 欧美一区二区性| 国产精品美女在线| 亚洲视频久久| 亚洲电影免费观看高清完整版在线 |