4 基本操作符重載_第1頁
4 基本操作符重載_第2頁
4 基本操作符重載_第3頁
4 基本操作符重載_第4頁
4 基本操作符重載_第5頁
已閱讀5頁,還剩17頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

操作符重載基本做法主要內容操作符重載概述雙目操作符重載單目操作符重載操作符++和--的重載操作符重載的需要性

C++語言本身沒有提供復數(shù)類型,可通過定義一個類來實現(xiàn):classComplex //復數(shù)類定義{public: Complex(doubler=0.0,doublei=0.0)

{real=r;imag=i;}

voiddisplay()const{cout<<real<<'+'<<imag<<'i';}......private: doublereal; doubleimag;}; Complexa(1.0,2.0),b(3.0,4.0);如何實現(xiàn)兩個復數(shù)(類型為Complex)相加?

一種方案:為Complex類定義一個成員函數(shù)add,例如:classComplex{ public:

……

Complexadd(constComplex&x)const { Complextemp; temp.real=real+x.real; temp.imag=imag+x.imag; returntemp; }

private:

doublereal;

doubleimag;};……Complexa(1.0,2.0),b(3.0,4.0),c;c=a.add(b);用函數(shù)實現(xiàn)

另一種方案:定義一個全局函數(shù)(聲明成Complex類的友元),例如:classComplex //復數(shù)類定義{......friend

Complexadd(constComplex&x1,constComplex&x2);private:

doublereal;

doubleimag;};

Complexadd(constComplex&x1,constComplex&x2){ Complextemp; temp.real=x1.real+x2.real; temp.imag=x1.imag+x2.imag; returntemp;}……Complexa(1.0,2.0),b(3.0,4.0),c;c=add(a,b);用函數(shù)來實現(xiàn)復數(shù)的加法操作不符合數(shù)學上的使用習慣:c=a+bC++允許對已有的操作符進行重載,使得用它們能對自定義類型(類)的對象進行操作。與函數(shù)名重載一樣,操作符重載也是實現(xiàn)多態(tài)性的一種語言機制。用操作符重載實現(xiàn)

C++操作符重載的實現(xiàn)途徑操作符重載可通過定義一個函數(shù)名為“operator

#”(“#”代表某個可重載的操作符)的函數(shù)來實現(xiàn),該函數(shù)可以作為:一個類的非靜態(tài)的成員函數(shù)(操作符new和delete除外)。一個全局(友元)函數(shù)。例如,以成員函數(shù)重載復數(shù)的“+”:classComplex{ public: Complexoperator+(constComplex&x)const { Complextemp; temp.real=real+x.real; temp.imag=imag+x.imag; returntemp; }......};……Complexa(1.0,2.0),b(3.0,4.0),c;c=a+b;再例如,以全局函數(shù)重載復數(shù)的“+”:classComplex{ ......

friendComplexoperator+(constComplex&c1,

constComplex&c2);};Complexoperator+(constComplex&c1,

constComplex&c2){ Complextemp; temp.real=c1.real+c2.real; temp.imag=c1.imag+c2.imag; returntemp;}……Complexa(1.0,2.0),b(3.0,4.0),c;c=a+b;一般情況下,操作符既可以作為全局函數(shù),也可以作為成員函數(shù)來重載。在有些情況下,操作符只能作為全局函數(shù)或只能作為成員函數(shù)來重載!操作符重載的基本原則

只能重載C++語言中已有的操作符,不可臆造新的操作符??梢灾剌dC++中除下列操作符外的所有操作符:“.”,“.*”,“?:”,“::”,“sizeof”需要遵循已有操作符的語法:不能改變操作數(shù)個數(shù)。原操作符的優(yōu)先級和結合性不變。盡量遵循已有操作符原來的語義:語言本身沒有對此做任何規(guī)定,使用者自己把握!雙目操作符重載作為成員函數(shù)重載只需要提供一個參數(shù),其類型為第二個操作數(shù)的類型定義格式class<類名>{ ...... <返回值類型>operator#(<類型>);//#代表可重載的操作符};<返回值類型><類名>::operator#(<類型><參數(shù)>){......}使用格式<類名>a;<類型>b;a#b或a.operator#(b)例、實現(xiàn)復數(shù)的“等于”和“不等于”操作classComplex{ doublereal,imag; public: ...... booloperator==(constComplex&x)const { return(real==x.real)&&(imag==x.imag); } booloperator!=(constComplex&x)const { return(real!=x.real)||(imag!=x.imag); }};......Complexc1,c2;......if(c1==c2)//或if(c1!=c2)......booloperator!=(constComplex&x)const//更好!{ return!(*this==x);}雙目操作符重載(續(xù)1)作為全局(友元)函數(shù)重載需要提供兩個參數(shù),其中至少應該有一個是類、結構、枚舉或它們的引用類型。定義格式<返回值類型>operator#(<類型1><參數(shù)1>, <類型2><參數(shù)2>){…...}使用格式<類型1>a;<類型2>b;a#b或operator#(a,b)例:重載操作符+,使其能夠實現(xiàn)實數(shù)與復數(shù)的混合運算。

classComplex{ doublereal,imag; public: Complex(){real=0;imag=0;} Complex(doubler,doublei){real=r;imag=i;} ...... friendComplexoperator+(constComplex&c1, constComplex&c2); friendComplexoperator+(constComplex&c, doubled); friendComplexoperator+(doubled, constComplex&c);};Complexoperator+(constComplex&c1, constComplex&c2){ returnComplex(c1.real+c2.real,c1.imag+c2.imag);}Complexoperator+(constComplex&c,doubled){ returnComplex(c.real+d,c.imag);}Complexoperator+(doubled,constComplex&c)//“實數(shù)+復數(shù)”只能作為全局函數(shù)重載。為什么?{ returnComplex(d+c.real,c.imag);}......Complexa(1,2),b(3,4),c1,c2,c3;c1=a+b;c2=b+21.5;c3=10.2+a;作為成員函數(shù)重載不需要提供參數(shù)定義格式class<類名>{ ...... <返回值類型>operator#();};<返回值類型><類名>::operator#(){......}使用格式<類名>a;#a或,a.operator#()單目操作符重載例:實現(xiàn)復數(shù)的取負操作classComplex{ ...... public: ...... Complexoperator-()const { returnComplex(-real,-imag); }};......Complexa(1,2),b;b=-a;//把a的負數(shù)賦值給b單目操作符重載(續(xù)1)作為全局(友元)函數(shù)重載只需要提供一個參數(shù),其類型必須是類、結構、枚舉或它們的引用類型定義格式<返回值類型>operator#(<類型><參數(shù)>){…...}使用格式為:<類型>a;#a或operator#(a)例:實現(xiàn)判斷復數(shù)是否為“零”的操作classComplex{ ...... public: ......

friendbooloperator!(constComplex&c);};booloperator!(constComplex&c){

return(c.real==0.0)&&(c.imag==0.0);}......Complexa(1,2);......if(!a)//a為0

............操作符++和--

的重載單目操作符++(--):intx,y;++x;或

x++;//x的值加1x=0;y=++x;//x的值為1,y的值為1x=0;y=x++;//x的值為1,y的值為0++(++x);或(++x)++;//?++(x++);或(x++)++;//?重載++(--)時,如果沒有特殊處理,它們的后置用法和前置用法共用同一個重載函數(shù)。為了能夠區(qū)分++(--)的前置與后置用法,可以為后置用法再寫一個重載函數(shù),該重載函數(shù)應有一個額外的int型參數(shù)(函數(shù)體中可以不使用該參數(shù)的值)。Error。x++為右值表達式OK,x的值加2。++x為左值表達式classCounter{ intvalue; public: Counter(){value=0;}

Counter&operator++()//前置的++重載函數(shù)

{ value++; return*this; }

constCounteroperator++(int)//后置的++重載函數(shù)

{ Countertemp=*this;//保存原來的對象

value++;//寫成:++(*t

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論