




已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
一、 運(yùn)算符重載的規(guī)則 運(yùn)算符重載規(guī)則如下: 、 C+中的運(yùn)算符除了少數(shù)幾個(gè)之外,全部可以重載,而且只能重載C+中已有的運(yùn)算符。 、 重載之后運(yùn)算符的優(yōu)先級和結(jié)合性都不會改變。 、 運(yùn)算符重載是針對新類型數(shù)據(jù)的實(shí)際需要,對原有運(yùn)算符進(jìn)行適當(dāng)?shù)母脑?。一般來說,重載的功能應(yīng)當(dāng)與原有功能相類似,不能改變原運(yùn)算符的操作對象個(gè)數(shù),同時(shí)至少要有一個(gè)操作對象是自定義類型。 不能重載的運(yùn)算符只有五個(gè),它們是:成員運(yùn)算符“.”、指針運(yùn)算符“*”、作用域運(yùn)算符“:”、“sizeof”、條件運(yùn)算符“?:”。 運(yùn)算符重載形式有兩種,重載為類的成員函數(shù)和重載為類的友元函數(shù)。 運(yùn)算符重載為類的成員函數(shù)的一般語法形式為: 函數(shù)類型operator運(yùn)算符(形參表) 函數(shù)體; 運(yùn)算符重載為類的友元函數(shù)的一般語法形式為: friend函數(shù)類型operator運(yùn)算符(形參表) 函數(shù)體; 其中,函數(shù)類型就是運(yùn)算結(jié)果類型;operator是定義運(yùn)算符重載函數(shù)的關(guān)鍵字;運(yùn)算符是重載的運(yùn)算符名稱。 當(dāng)運(yùn)算符重載為類的成員函數(shù)時(shí),函數(shù)的參數(shù)個(gè)數(shù)比原來的操作個(gè)數(shù)要少一個(gè);當(dāng)重載為類的友元函數(shù)時(shí),參數(shù)個(gè)數(shù)與原操作數(shù)個(gè)數(shù)相同。原因是重載為類的成員函數(shù)時(shí),如果某個(gè)對象使用重載了的成員函數(shù),自身的數(shù)據(jù)可以直接訪問,就不需要再放在參數(shù)表中進(jìn)行傳遞,少了的操作數(shù)就是該對象本身。而重載為友元函數(shù)時(shí),友元函數(shù)對某個(gè)對象的數(shù)據(jù)進(jìn)行操作,就必須通過該對象的名稱來進(jìn)行,因此使用到的參數(shù)都要進(jìn)行傳遞,操作數(shù)的個(gè)數(shù)就不會有變化。 運(yùn)算符重載的主要優(yōu)點(diǎn)就是允許改變使用于系統(tǒng)內(nèi)部的運(yùn)算符的操作方式,以適應(yīng)用戶自定義類型的類似運(yùn)算。 一般說來,單目運(yùn)算符最好被重載為成員;對雙目運(yùn)算符最好被重載為友元函數(shù),雙目運(yùn)算符重載為友元函數(shù)比重載為成員函數(shù)更方便此,但是,有的雙目運(yùn)算符還是重載為成員函數(shù)為好,例如,賦值運(yùn)算符。二、 運(yùn)算符重載為成員函數(shù) 對于雙目運(yùn)算符B,如果要重載B為類的成員函數(shù),使之能夠?qū)崿F(xiàn)表達(dá)式oprd1Boprd2,其中oprd1為類A的對象,則應(yīng)當(dāng)把B重載為A類的成員函數(shù),該函數(shù)只有一個(gè)形參,形參的類型是oprd2所屬的類型。經(jīng)過重載后,表達(dá)式oprd1Boprd2就相當(dāng)于函數(shù)調(diào)用oprd1.operatorB(oprd2). 對于前置單目運(yùn)算符U,如“-”(負(fù)號)等,如果要重載U為類的成員函數(shù),用來實(shí)現(xiàn)表達(dá)式Uoprd,其中oprd為A類的對象,則U應(yīng)當(dāng)重載為A類的成員函數(shù),函數(shù)沒有形參。經(jīng)過重載之后,表達(dá)式Uoprd相當(dāng)于函數(shù)調(diào)用oprd.operatorU(). 對于后置運(yùn)算符“+”和“-”,如果要將它們重載為類的成員函數(shù),用來實(shí)現(xiàn)表達(dá)式oprd+或oprd-,其中oprd為A類的對象,那么運(yùn)算符就應(yīng)當(dāng)重載為A類的成員函數(shù),這時(shí)函數(shù)要帶有一個(gè)整型形參。重載之后,表達(dá)式oprd+和oprd就想當(dāng)于函數(shù)調(diào)用oprd.operator+(0)和oprd.operator(0); 運(yùn)算符重載就是賦予已有的運(yùn)算符多重含義。通過重新定義運(yùn)算符,使它能夠用于特定類的對象執(zhí)行特定的功能,這便增強(qiáng)了C+語言的擴(kuò)充能力。1. 運(yùn)算符重載的作用:運(yùn)算符重載允許C/C+的運(yùn)算符在用戶定義類型(類)上擁有一個(gè)用戶定義的意義。重載的運(yùn)算符是函數(shù)調(diào)用的語法修飾:class Fredpublic:/ .;#if 0/ 沒有算符重載:Fred add(Fred, Fred);Fred mul(Fred, Fred);Fred f(Fred a, Fred b, Fred c)return add(add(mul(a,b), mul(b,c), mul(c,a); / 哈哈,多可笑.#else/ 有算符重載:Fred operator+ (Fred, Fred);Fred operator* (Fred, Fred);Fred f(Fred a, Fred b, Fred c)return a*b + b*c + c*a;#endif 2. 可以用作重載的運(yùn)算符:算術(shù)運(yùn)算符:+,-,*,/,%,+,-;位操作運(yùn)算符:&,|,邏輯運(yùn)算符:!,&,|;比較運(yùn)算符:,=,=,=,!=;賦值運(yùn)算符:=,+=,-=,*=,/=,%=,&=,|=,=,=,=;其他運(yùn)算符:,(),-,(逗號運(yùn)算符),new,delete,new,delete,-*。下列運(yùn)算符不允許重載:.,.*,:,?:3. 運(yùn)算符重載后,優(yōu)先級和結(jié)合性:用戶重載新定義運(yùn)算符,不改變原運(yùn)算符的優(yōu)先級和結(jié)合性。這就是說,對運(yùn)算符重載不改變運(yùn)算符的優(yōu)先級和結(jié)合性,并且運(yùn)算符重載后,也不改變運(yùn)算符的語法結(jié)構(gòu),即單目運(yùn)算符只能重載為單目運(yùn)算符,雙目運(yùn)算符只能重載雙目運(yùn)算符。4. 編譯程序如何選用哪一個(gè)運(yùn)算符函數(shù):運(yùn)算符重載實(shí)際是一個(gè)函數(shù),所以運(yùn)算符的重載實(shí)際上是函數(shù)的重載。編譯程序?qū)\(yùn)算符重載的選擇,遵循著函數(shù)重載的選擇原則。當(dāng)遇到不很明顯的運(yùn)算時(shí),編譯程序?qū)⑷ふ覅?shù)相匹配的運(yùn)算符函數(shù)。5. 重載運(yùn)算符有哪些限制:(1) 不可臆造新的運(yùn)算符。必須把重載運(yùn)算符限制在C+語言中已有的運(yùn)算符范圍內(nèi)的允許重載的運(yùn)算符之中。(2) 重載運(yùn)算符堅(jiān)持4個(gè)“不能改變”。不能改變運(yùn)算符操作數(shù)的個(gè)數(shù);不能改變運(yùn)算符原有的優(yōu)先級;不能改變運(yùn)算符原有的結(jié)合性;不能改變運(yùn)算符原有的語法結(jié)構(gòu)。6. 運(yùn)算符重載時(shí)必須遵循哪些原則:運(yùn)算符重載可以使程序更加簡潔,使表達(dá)式更加直觀,增加可讀性。但是,運(yùn)算符重載使用不宜過多,否則會帶來一定的麻煩。(1) 重載運(yùn)算符含義必須清楚。(2) 重載運(yùn)算符不能有二義性。 運(yùn)算符重載函數(shù)的兩種形式運(yùn)算符重載的函數(shù)一般地采用如下兩種形式:成員函數(shù)形式和友元函數(shù)形式。這兩種形式都可訪問類中的私有成員。1. 重載為類的成員函數(shù)這里先舉一個(gè)關(guān)于給復(fù)數(shù)運(yùn)算重載復(fù)數(shù)的四則運(yùn)算符的例子。復(fù)數(shù)由實(shí)部和虛部構(gòu)造,可以定義一個(gè)復(fù)數(shù)類,然后再在類中重載復(fù)數(shù)四則運(yùn)算的運(yùn)算符。先看以下源代碼:#include iostream.hclass complexpublic:complex() real=imag=0; complex(double r, double i)real = r, imag = i;complex operator +(const complex &c);complex operator -(const complex &c);complex operator *(const complex &c);complex operator /(const complex &c);friend void print(const complex &c);private:double real, imag;inline complex complex:operator +(const complex &c)return complex(real + c.real, imag + c.imag);inline complex complex:operator -(const complex &c)return complex(real - c.real, imag - c.imag);inline complex complex:operator *(const complex &c)return complex(real * c.real - imag * c.imag, real * c.imag + imag * c.real);inline complex complex:operator /(const complex &c)return complex(real * c.real + imag + c.imag) / (c.real * c.real + c.imag * c.imag),(imag * c.real - real * c.imag) / (c.real * c.real + c.imag * c.imag);void print(const complex &c)if(c.imag0)coutc.realc.imagi;elsecoutc.real+c.imagi;void main()complex c1(2.0, 3.0), c2(4.0, -2.0), c3;c3 = c1 + c2;coutnc1+c2=;print(c3);c3 = c1 - c2;coutnc1-c2=;print(c3);c3 = c1 * c2;coutnc1*c2=;print(c3);c3 = c1 / c2;coutnc1/c2=;print(c3);c3 = (c1+c2) * (c1-c2) * c2/c1;coutn(c1+c2)*(c1-c2)*c2/c1=;print(c3);coutendl; 該程序的運(yùn)行結(jié)果為:c1+c2=6+1ic1-c2=-2+5ic1*c2=14+8ic1/c2=0.45+0.8i(c1+c2)*(c1-c2)*c2/c1=9.61538+25.2308i 在程序中,類complex定義了4個(gè)成員函數(shù)作為運(yùn)算符重載函數(shù)。將運(yùn)算符重載函數(shù)說明為類的成員函數(shù)格式如下:類名 operator 運(yùn)算符(參數(shù)表)其中,operator是定義運(yùn)算符重載函數(shù)的關(guān)鍵字。程序中出現(xiàn)的表達(dá)式: c1+c2編譯程序?qū)⒔o解釋為: c1.operator+(c2)其中,c1和c2是complex類的對象。operator+()是運(yùn)算+的重載函數(shù)。該運(yùn)算符重載函數(shù)僅有一個(gè)參數(shù)c2??梢?,當(dāng)重載為成員函數(shù)時(shí),雙目運(yùn)算符僅有一個(gè)參數(shù)。對單目運(yùn)算符,重載為成員函數(shù)時(shí),不能再顯式說明參數(shù)。重載為成員函數(shù)時(shí),總時(shí)隱含了一個(gè)參數(shù),該參數(shù)是this指針。this指針是指向調(diào)用該成員函數(shù)對象的指針。2. 重載為友元函數(shù):運(yùn)算符重載函數(shù)還可以為友元函數(shù)。當(dāng)重載友元函數(shù)時(shí),將沒有隱含的參數(shù)this指針。這樣,對雙目運(yùn)算符,友元函數(shù)有2個(gè)參數(shù),對單目運(yùn)算符,友元函數(shù)有一個(gè)參數(shù)。但是,有些運(yùn)行符不能重載為友元函數(shù),它們是:=,(),和-。重載為友元函數(shù)的運(yùn)算符重載函數(shù)的定義格式如下: friend 類型說明符 operator 運(yùn)算符(參數(shù)表) 下面用友元函數(shù)代碼成員函數(shù),重載編寫上述的例子,程序如下:#include iostream.hclass complexpublic:complex() real=imag=0; complex(double r, double i)real = r, imag = i;friend complex operator +(const complex &c1, const complex &c2);friend complex operator -(const complex &c1, const complex &c2);friend complex operator *(const complex &c1, const complex &c2);friend complex operator /(const complex &c1, const complex &c2);friendvoid print(const complex &c);private:double real, imag;complex operator +(const complex &c1, const complex &c2)return complex(c1.real + c2.real, c1.imag + c2.imag);complex operator -(const complex &c1, const complex &c2)return complex(c1.real - c2.real, c1.imag - c2.imag);complex operator *(const complex &c1, const complex &c2)return complex(c1.real * c2.real - c1.imag * c2.imag, c1.real * c2.imag + c1.imag * c2.real);complex operator /(const complex &c1, const complex &c2)return complex(c1.real * c2.real + c1.imag * c2.imag) / (c2.real * c2.real + c2.imag * c2.imag),(c1.imag * c2.real - c1.real * c2.imag) / (c2.real * c2.real + c2.imag * c2.imag);void print(const complex &c)if(c.imag0)coutc.realc.imagi;elsecoutc.real+c.imagi;void main()complex c1(2.0, 3.0), c2(4.0, -2.0), c3;c3 = c1 + c2;coutnc1+c2=;print(c3);c3 = c1 - c2;coutnc1-c2=;print(c3);c3 = c1 * c2;coutnc1*c2=;print(c3);c3 = c1 / c2;coutnc1/c2=;print(c3);c3 = (c1+c2) * (c1-c2) * c2/c1;coutn(c1+c2)*(c1-c2)*c2/c1=;print(c3);coutendl; 該程序的運(yùn)行結(jié)果與上例相同。前面已講過,對又目運(yùn)算符,重載為成員函數(shù)時(shí),僅一個(gè)參數(shù),另一個(gè)被隱含;重載為友元函數(shù)時(shí),有兩個(gè)參數(shù),沒有隱含參數(shù)。因此,程序中出現(xiàn)的 c1+c2編譯程序解釋為: operator+(c1, c2)調(diào)用如下函數(shù),進(jìn)行求值, complex operator +(const coplex &c1, const complex &c2) 3. 兩種重載形式的比較一般說來,單目運(yùn)算符最好被重載為成員;對雙目運(yùn)算符最好被重載為友元函數(shù),雙目運(yùn)算符重載為友元函數(shù)比重載為成員函數(shù)更方便此,但是,有的雙目運(yùn)算符還是重載為成員函數(shù)為好,例如,賦值運(yùn)算符。因?yàn)?,它如果被重載為友元函數(shù),將會出現(xiàn)與賦值語義不一致的地方。 其他運(yùn)算符的重載舉例1).下標(biāo)運(yùn)算符重載由于C語言的數(shù)組中并沒有保存其大小,因此,不能對數(shù)組元素進(jìn)行存取范圍的檢查,無法保證給數(shù)組動(dòng)態(tài)賦值不會越界。利用C+的類可以定義一種更安全、功能強(qiáng)的數(shù)組類型。為此,為該類定義重載運(yùn)算符。下面一個(gè)例子:#include iostream.hclass CharArraypublic:CharArray(int l)Length = l;Buff = new charLength;CharArray() delete Buff; int GetLength() return Length; char & operator (int i);private:int Length;char * Buff;char & CharArray:operator (int i)static char ch = 0;if(iLength&i=0)return Buffi;elsecoutnIndex out of range.;return ch;void main()int cnt;CharArray string1(6);char * string2 = string;for(cnt=0; cnt8; cnt+)string1cnt = string2cnt;coutn;for(cnt=0; cnt8; cnt+)coutstring1cnt;coutn;coutstring1.GetLength()endl; 該數(shù)組類的優(yōu)點(diǎn)如下:(1) 其大小不一定是一個(gè)常量。(2) 運(yùn)行時(shí)動(dòng)態(tài)指定大小可以不用運(yùn)算符new和delete。(3) 當(dāng)使用該類數(shù)組作函數(shù)參數(shù)時(shí),不心分別傳遞數(shù)組變量本身及其大小,因?yàn)樵搶ο笾幸呀?jīng)保存大小。在重載下標(biāo)運(yùn)算符函數(shù)時(shí)應(yīng)該注意:(1) 該函數(shù)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 兩部門要求做好“三區(qū)”人才支持計(jì)劃教師專項(xiàng)計(jì)劃工作
- 醫(yī)美運(yùn)營合同范本
- 仁懷酒廠收購合同范本
- 廚師勞務(wù)合同范本單位
- 出售恒安小區(qū)房子合同范本
- 個(gè)人買賣狗狗合同范本
- 廠區(qū)門面房租賃合同范例
- 《荷葉圓圓》說課稿
- 叉車 吊車合同范本
- 農(nóng)村私房承建合同范本
- 院前急救技術(shù)-止血包扎固定搬運(yùn)課件
- 中國煤炭地質(zhì)總局公開招聘報(bào)名表
- 電子商務(wù)數(shù)據(jù)分析基礎(chǔ)(第二版) 課件 模塊1、2 電子商務(wù)數(shù)據(jù)分析概述、基礎(chǔ)數(shù)據(jù)采集
- YB-T+4190-2018工程用機(jī)編鋼絲網(wǎng)及組合體
- 高大模板安全施工施工安全保證措施
- 地連墻鋼筋籠吊裝安全施工T及T吊裝驗(yàn)算及設(shè)備選定
- 委托辦理報(bào)廢汽車協(xié)議書
- 蘇教版(SJ)《四年級下冊數(shù)學(xué)》補(bǔ)充習(xí)題
- 體育足球籃球排球體操教案
- 保管錢財(cái)協(xié)議書的范本
- 湖北省武漢市二月調(diào)考讀后續(xù)寫解析+課件
評論
0/150
提交評論