C--課件-第十三章-運(yùn)算符重載_第1頁(yè)
C--課件-第十三章-運(yùn)算符重載_第2頁(yè)
C--課件-第十三章-運(yùn)算符重載_第3頁(yè)
C--課件-第十三章-運(yùn)算符重載_第4頁(yè)
C--課件-第十三章-運(yùn)算符重載_第5頁(yè)
已閱讀5頁(yè),還剩30頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論