




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第十三章 運(yùn)算符重載運(yùn)算符一種函數(shù);對(duì)于類對(duì)象,用戶可重新定義運(yùn)算符函數(shù)。 class C private: double x; public: C( ) x=0.0; C(double a) x=a; C add(const C m) C temp; temp.x=m.x+x; return temp; ;引子 C a(10), b(3); C c=a.add(b); 希望c=a+b; C a(10), b(3), c; c=a+b; 賦值運(yùn)算符一般用預(yù)定義的a.operator+(b)加法運(yùn)算符重載函數(shù)(利用成員函數(shù)重載) class C / public: C operator+(C m
2、) C temp(x+m.x); return temp; / ;/定義方式1. 負(fù)號(hào)“-” (利用成員函數(shù)重載) C C: operator - ( ) C temp; temp.x=-x; return temp; 一.單目運(yùn)算符重載 C c=-a; a.operator-( )1. 負(fù)號(hào)“-” (利用友元函數(shù)重載) class C / public: friend C operator-(const C); / ; C operator- (const C m ) C temp; temp.x=-m.x; return temp; C c=-a; operator-(a) 單目運(yùn)算符重載
3、中成員函數(shù)重載與友元函數(shù)重載之間的區(qū)別: 用成員函數(shù)重載單目運(yùn)算符,由于此時(shí)運(yùn)算符的操作數(shù)為當(dāng)前對(duì)象,因此用成員函數(shù)重載單目運(yùn)算符時(shí)無(wú)參數(shù)。 由于友元函數(shù)非成員函數(shù),不能使用this指針,因此用友元函數(shù)重載單目運(yùn)算符時(shí)必須帶有一個(gè)參數(shù)作為該運(yùn)算符的操作數(shù)。2. 前置運(yùn)算符+ (利用成員函數(shù)重載) class C private: double x; public: C( ) x=0.0; C(double a) x=a; C operator+() x+; return *this; ;C A(1);+A;2. 前置運(yùn)算符+ (利用友元函數(shù)重載) class C private: double
4、 x; public: C( ) x=0.0; C(double a) x=a; friend C operator+(C &); ; C operator+(C &t) t.x+; return t; C A(1);+A; 對(duì)于要改變操作數(shù)的運(yùn)算符(比如+、-等),參數(shù)必須是引用類型或指針類型。3. 后置運(yùn)算符- (利用成員函數(shù)重載) class C private: double x; public: C( ) x=0.0; C(double a) x=a; C operator-(int) x-; return *this; ;C A(1);A-; 整型參數(shù)沒(méi)有特別的意義,只是標(biāo)識(shí)重載的
5、是后置運(yùn)算符。 3. 后置運(yùn)算符- (利用友元函數(shù)重載) class C private: double x; public: C( ) x=0.0; C(double a) x=a; friend C operator-(C &,int); ; C operator-(C &t,int) t.x-; return t; C A(1);A-; 整型參數(shù)沒(méi)有特別的意義,只是標(biāo)識(shí)重載的是后置運(yùn)算符。 class C private: double x; public: C( ) x=0.0; C(double a) x=a; friend C operator-(C t) t.x-; return
6、 t; void show()coutxendl; ;void main()C c(5.6); (-c).show(); c.show(); 例:程序輸出結(jié)果?4.65.61. 加號(hào)+ (利用成員函數(shù)重載) C C: operator+(C m ) C temp; temp.x=x+m.x; return temp; 二.雙目運(yùn)算符重載C a,b; C c=a+b; a.operator+(b)1. 加號(hào)+ (利用友元函數(shù)重載) 先在類中聲明: friend C operator+(C ,C); 再在類外定義: C operator+(C m1, C m2 ) C temp; temp.x=m
7、1.x+m2.x; return temp; C a,b; C c=a+b; operator+(a,b)2. 乘號(hào)* (利用成員函數(shù)重載) C C: operator*(C m ) C temp; temp.x=x*m.x; return temp; C a,b; C c=a*b; a.operator*(b)2. 乘號(hào)*(利用友元函數(shù)重載) 先在類中聲明: friend C operator*(C ,C); 再在類外定義: C operator*(C m1, C m2 ) C temp; temp.x=m1.x*m2.x; return temp; C a,b; C c=a*b; Oper
8、ator*(a,b)3. 復(fù)合運(yùn)算符+= (利用成員函數(shù)重載) C C: operator+=(C m ) x+=m.x; return *this; C a,b; a+=b; a.operator+=(b)3. 復(fù)合運(yùn)算符+= (利用友元函數(shù)重載) 先在類中聲明: friend C operator+=(C & ,C); 再在類外定義: C operator+=(C &m1, C m2 ) m1.x+=m2.x; return m1; C a,b; a+=b; Operator+=(a,b)4. 賦值運(yùn)算符= (利用成員函數(shù)重載) C C: operator=(C m ) x=m.x; re
9、turn *this; 實(shí)際上,系統(tǒng)為每一個(gè)類都生成了一個(gè)缺省的賦值運(yùn)算符,在相同類型的實(shí)例之間可以直接相互賦值,甚至派生類的實(shí)例可以賦給基類實(shí)例。 但對(duì)某些特殊的情形,該缺省的賦值運(yùn)算符會(huì)出現(xiàn)一些問(wèn)題,如指針懸掛問(wèn)題。 【例】利用類的缺省賦值運(yùn)算符產(chǎn)生的指針懸掛問(wèn)題 class CA char *ps; public: CA()ps=0; CA(char *s) ps=new charstrlen(s)+1; strcpy(ps,s); CA()if(ps) deleteps; char *GetS()return ps; ;void main(void)CA s1(China!),s2(C
10、omputer!);couts1=s1.GetS()t;couts2=s2.GetS()n;s1=s2; /A產(chǎn)生指針懸掛couts1=s1.GetS()t;couts2=s2.GetS()n;程序編譯沒(méi)有問(wèn)題,但運(yùn)行時(shí)出錯(cuò)!缺省賦值語(yǔ)句產(chǎn)生指針懸掛問(wèn)題示意圖。s1=s2撤消s2撤消s1出錯(cuò)s1s2“China!”“Computer!”指針懸掛s1“China!”“Computer!”已不存在s1s2“China!”“Computer!”無(wú)法撤消此時(shí)在類CA中可以對(duì)賦值運(yùn)算符進(jìn)行如下重載。CA & CA:operator=(CA &b)if(ps) deleteps; if(b.ps) ps=
11、new char strlen(b.ps)+1; strcpy(ps,b.ps); else ps=0;return *this;對(duì)賦值運(yùn)算符進(jìn)行重載時(shí)要注意以下三點(diǎn): 一是只能利用成員函數(shù)重載,不能用友元函數(shù)重載; 二是重載的賦值運(yùn)算符不能被繼承; 三是不能將賦值運(yùn)算符重載函數(shù)聲明為虛函數(shù)。 5. 數(shù)組下標(biāo)運(yùn)算符 重載下標(biāo)運(yùn)算符的一般格式為: operator () /函數(shù)體 其中為一個(gè)參數(shù),且僅有一個(gè)參數(shù),該參數(shù)設(shè)定了下標(biāo)值,通常為整型。 下標(biāo)運(yùn)算符必須利用類的成員函數(shù)來(lái)實(shí)現(xiàn),而不能使用友元函數(shù)。 class ainteger int *a; int sz; public: aintege
12、r( int size) sz=size; a=new intsize; int & operator (int i ) if(i=sz) cout“error”0)arp=new intn;memset(arp,0,sizeof(int)*n);/string.hlen=n;else len=0;arp=0;int & CArray:operator(int index) /下標(biāo)運(yùn) 算符的實(shí)現(xiàn) if(index=len|index0) /如果參數(shù) index超出規(guī)定的范圍,則輸出越界信息 coutnError:下標(biāo)index出界!n;exit(2); /stdlib.h return arp
13、index; /如果不越界,則返回 相應(yīng)的數(shù)據(jù) void main(void)CArray m1(10),m2(3);int i;for(i=0;i10;i+) m1i=i; / 重載數(shù)組下標(biāo)的使用for(i=1;i11;i+) /Bcoutm1i ;/Ccoutn;m22=26;coutm22=m22n;6. 相等運(yùn)算符=【例】判斷兩個(gè)復(fù)數(shù)是否相等 class comp float real,ima; public: comp(float r=0,float i=0)real=r;ima=i; bool operator=(comp m) if(real=m.real & ima=m.ima
14、) return true; else return false; ;void main()comp c1(5,6),c2(3,6); if(c1=c2) cout兩復(fù)數(shù)相等endl; else cout兩復(fù)數(shù)不相等endl;7 重載函數(shù)調(diào)用運(yùn)算符 x(arg1, arg2,arg3) class myclass int i; float j; public: myclass(int x=0, float y=0.0) i=x; j=y; myclass operator( ) (int k, float m); void display( ) couti“ “jendl; ; myclass myclass:operator( ) (int k, float m) i=k+10; j=m+10.5; return *this; void main( ) myclass obj1(10, 11.5); obj1.display( ); obj1(100, 6.9); obj1.display( ); 10 11.511
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 單位購(gòu)買機(jī)器合同范本
- fidic合同范本匯編
- 合伙經(jīng)營(yíng)公司協(xié)議合同范本
- 科技助力下的現(xiàn)代人營(yíng)養(yǎng)與運(yùn)動(dòng)平衡研究
- 句容碧桂園合同范例
- 單位銷售家具合同范本
- 雙層股權(quán)合同范本
- 醫(yī)院法人轉(zhuǎn)讓合同范本
- 二手空調(diào)設(shè)備回收合同范本
- 專利獨(dú)家使用合同范本
- 2024年蘇州市職業(yè)大學(xué)單招職業(yè)適應(yīng)性測(cè)試題庫(kù)完整版
- 2024年廣州港集團(tuán)有限公司招聘筆試沖刺題(帶答案解析)
- 【特級(jí)教師上優(yōu)課】《黃河頌》名師課件
- 鋁合金門窗安裝施工工藝詳解
- 《包裝設(shè)計(jì)》課件-包裝設(shè)計(jì)發(fā)展的歷史
- 全國(guó)保密宣傳教育月課件
- 醫(yī)療器械經(jīng)營(yíng)企業(yè)GSP培訓(xùn)
- 語(yǔ)言藝術(shù)訓(xùn)練智慧樹(shù)知到期末考試答案2024年
- 報(bào)價(jià)單(產(chǎn)品報(bào)價(jià)單)
- 內(nèi)鏡逆行闌尾炎治療術(shù)
- JJG 633-2024 氣體容積式流量計(jì)
評(píng)論
0/150
提交評(píng)論