C++語(yǔ)言PPT:運(yùn)算符重載_第1頁(yè)
C++語(yǔ)言PPT:運(yùn)算符重載_第2頁(yè)
C++語(yǔ)言PPT:運(yùn)算符重載_第3頁(yè)
C++語(yǔ)言PPT:運(yùn)算符重載_第4頁(yè)
C++語(yǔ)言PPT:運(yùn)算符重載_第5頁(yè)
已閱讀5頁(yè),還剩22頁(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)介

運(yùn)算符重載Complex

Complex::Add(Complex&c){Complextemp;temp.real=real+c.real;temp.imag=imag+c.imag;returntemp;}classComplex{private:doublereal;doubleimag;public:Complex(){real=0;imag=0;}Complex(doubler,doublei){real=r;imag=i;}voidPrint(){cout<<"("<<real<<","<<imag<<")"<<endl;}ComplexAdd(Complex&c);};

intmain(){Complexa(1,2),b(3,4),c;c=a.Add(b);cout<<"c=";c.Print();}復(fù)數(shù)加減法只能調(diào)用成員函數(shù)實(shí)現(xiàn),不能使用符號(hào)“+”和“-”,可以通過(guò)重載“+”、“-”運(yùn)算符,實(shí)現(xiàn)如c=a+b這樣的調(diào)用方式運(yùn)算符重載:運(yùn)算符重載的實(shí)質(zhì)就是對(duì)已有的運(yùn)算符賦予多重含義,使同一個(gè)運(yùn)算符作用于不同類型的數(shù)據(jù)時(shí),產(chǎn)生不同的行為。運(yùn)算符重載的方法是定義一個(gè)重載運(yùn)算符的函數(shù),在需要執(zhí)行被重載的運(yùn)算符時(shí),系統(tǒng)就自動(dòng)調(diào)用該函數(shù),以實(shí)現(xiàn)相應(yīng)的運(yùn)算。也就是說(shuō),運(yùn)算符重載是通過(guò)定義函數(shù)實(shí)現(xiàn)的。運(yùn)算符重載實(shí)質(zhì)上是函數(shù)的重載。例:用運(yùn)算符實(shí)現(xiàn)復(fù)數(shù)的加法運(yùn)算Complex

Complex::operator+(Complex&c){Complextemp;temp.real=real+c.real;temp.imag=imag+c.imag;returntemp;}intmain(){Complexa(1,2),b(3.0,4.0),c;c=a+b;cout<<"c=";c.Print();}程序運(yùn)行結(jié)果為:c=(4,6)該語(yǔ)句相當(dāng)于調(diào)用函數(shù)operator+(Complex&c)c=a.operator+(b),實(shí)現(xiàn)兩個(gè)復(fù)數(shù)的加法運(yùn)算。classComplex{private:doublereal;doubleimag;public:Complex(){real=0;imag=0;}Complex(doubler,doublei){real=r;imag=i;}voidPrint(){cout<<"("<<real<<","<<imag<<")"<<endl;}

Complexoperator+(Complex&c);};

運(yùn)算符重載的格式運(yùn)算符重載為類的成員函數(shù)運(yùn)算符重載為類的友元函數(shù)運(yùn)算符重載的規(guī)則除“.”、“*”、“::”、“?:”和“sizeof”等幾個(gè)運(yùn)算符不能重載外,C++中幾乎所有的運(yùn)算符都可以重載。運(yùn)算符被重載后,其優(yōu)先級(jí)和結(jié)合性不會(huì)改變。不能改變運(yùn)算符操作對(duì)象的個(gè)數(shù)。運(yùn)算符的意義應(yīng)不變。用于類對(duì)象的運(yùn)算符一般必須重載,但有兩個(gè)例外,運(yùn)算符“=”和“&”不必用戶重載。運(yùn)算符重載為類的成員函數(shù)在類中聲明的格式為:函數(shù)類型operator運(yùn)算符(參數(shù)表)定義該函數(shù)的格式:

函數(shù)類型類名::operator運(yùn)算符(參數(shù)表){

函數(shù)體;}注意:也可以將重載運(yùn)算符函數(shù)的定義直接寫在類中。雙目運(yùn)算符重載雙目運(yùn)算符,如果重載為類的成員函數(shù),其參數(shù)為一個(gè),即比運(yùn)算對(duì)象少一個(gè)。(附加例)復(fù)數(shù)的減法運(yùn)算,在上例的基礎(chǔ)上添加減法運(yùn)算符重載函數(shù)。復(fù)數(shù)類減法運(yùn)算的定義:(a+bi)-(x+yi)=(a-x)+(b-y)iComplex

Complex::operator-(Complex&c){Complextemp;temp.real=real-c.real;temp.imag=imag-c.imag;returntemp;}#include<iostream>classComplex{private:doublereal;doubleimag;public:Complex();Complex(doubler,doublei);voidPrint();Complexoperator+(Complex&c);Complexoperator-(Complex&c);};

intmain(){Complexa(1,2),b(3.0,4.0),c,d;c=a+b;d=a-b;cout<<"c=";c.Print();cout<<“d=";d.Print();}程序運(yùn)行結(jié)果為:c=(4,6)d=(-2,-2)總結(jié):

設(shè)有雙目運(yùn)算符B,如果要重載B為類的成員函數(shù),使之能夠?qū)崿F(xiàn)表達(dá)式oprd1Boprd2,其中oprd1為A類對(duì)象,則B應(yīng)被重載為A類的成員函數(shù),形參類型應(yīng)該是oprd2所屬的類型。經(jīng)重載后,表達(dá)式oprd1Boprd2相當(dāng)于oprd1.operatorB(oprd2),注意重載雙目運(yùn)算符只需要一個(gè)參數(shù)。單目運(yùn)算符重載單目運(yùn)算符,如果重載為類的成員函數(shù),為區(qū)分前置和后置運(yùn)算符,C++規(guī)定:對(duì)于前置單目運(yùn)算符,重載函數(shù)沒(méi)有參數(shù)。對(duì)于后置單目運(yùn)算符,重載函數(shù)有一個(gè)整型參數(shù),這個(gè)整型參數(shù)沒(méi)有其他用途,只是用于區(qū)分前置運(yùn)算與后置運(yùn)算。(附加例):定義一個(gè)CInt類,類中只有一個(gè)數(shù)據(jù)成員i,兩個(gè)運(yùn)算符“++”的重載函數(shù),一個(gè)沒(méi)有參數(shù),實(shí)現(xiàn)的是前置運(yùn)算符重載,另一個(gè)有一個(gè)整型參數(shù),實(shí)現(xiàn)后置運(yùn)算符重載。classCInt{private: inti;public: CInt(inta=0); voidPrint(); CIntoperator++(); CIntoperator++(int);};CInt::CInt(inta){ i=a;}voidCInt::Print(){ cout<<"i="<<i<<endl;}CIntCInt::operator++(){ CInttemp; temp.i=++i; returntemp;}CIntCInt::operator++(int){ CInttemp; temp.i=i++; returntemp;}intmain(){ CInta(5),b(5),c,d; c=a++; d=++b; cout<<"a:“<<a.Print(); cout<<"b:“<<b.Print(); cout<<"c:“<<c.Print(); cout<<"d:“<<d.Print();}結(jié)果:a:i=6b:i=6c:i=5d:i=6運(yùn)算符重載為類的友元函數(shù)類中的聲明:

friend

函數(shù)類型operator運(yùn)算符(參數(shù)表);運(yùn)算符重載函數(shù)的定義形式:

函數(shù)類型operator運(yùn)算符(參數(shù)表)

{

函數(shù)體;

}(附加例)用友元函數(shù)實(shí)現(xiàn)復(fù)數(shù)的加法運(yùn)算符的重載。Complexoperator+(Complex&x,Complex&y){Complextemp;temp.real=x.real+y.real;temp.imag=x.imag+y.imag;returntemp;}#include<iostream>classComplex{private:doublereal;doubleimag;public:Complex();Complex(doubler,doublei);voidPrint();friendComplexoperator+(Complex&x,Complex&y);};

intmain(){Complexa(1,2),b(3.0,4.0),c;c=a+b;cout<<"c=";c.Print();}相當(dāng)于函數(shù)調(diào)用c=operator+(a,b)總結(jié):設(shè)有雙目運(yùn)算符B,如果要重載B為類的友元函數(shù),則該友元函數(shù)也有兩個(gè)參數(shù),分別為運(yùn)算符的兩個(gè)運(yùn)算對(duì)象。重載后,表達(dá)式oprd1Boprd2等同于調(diào)用函數(shù)operatorB(oprd1,oprd2)。

單目運(yùn)算符也可以重載為類的友元函數(shù),該友元函數(shù)有一個(gè)參數(shù)。有的C++編譯系統(tǒng)(如VisualC++6.0)沒(méi)有完全實(shí)現(xiàn)C++標(biāo)準(zhǔn),它所提供不帶后綴.h的頭文件不支持把成員函數(shù)重載為友元函數(shù)。但是VisualC++所提供的老形式的帶后綴.h的頭文件可以支持此項(xiàng)功能,因此可以將程序頭兩行修改如下,即可順利運(yùn)行:

#include<iostream.h>成員函數(shù)方式和友元函數(shù)方式有何區(qū)別呢?如果將運(yùn)算符重載函數(shù)作為成員函數(shù),它可以通過(guò)this指針自由地訪問(wèn)本類的數(shù)據(jù)成員,因此可以少寫一個(gè)函數(shù)的參數(shù)。但必須要求運(yùn)算表達(dá)式第一個(gè)參數(shù)(即運(yùn)算符左側(cè)的操作數(shù))是一個(gè)類對(duì)象,而且與運(yùn)算符函數(shù)的類型相同。因?yàn)楸仨毻ㄟ^(guò)類的對(duì)象去調(diào)用該類的成員函數(shù),而且只有運(yùn)算符重載函數(shù)返回值與該對(duì)象同類型,運(yùn)算結(jié)果才有意義。將雙目運(yùn)算符重載為友元函數(shù)時(shí),在函數(shù)的形參表列中必須有兩個(gè)參數(shù),不能省略,形參的順序任意,不要求第一個(gè)參數(shù)必須為類對(duì)象。但在使用運(yùn)算符的表達(dá)式中,要求運(yùn)算符左側(cè)的操作數(shù)與函數(shù)第一個(gè)參數(shù)對(duì)應(yīng),運(yùn)算符右側(cè)的操作數(shù)與函數(shù)的第二個(gè)參數(shù)對(duì)應(yīng)。數(shù)據(jù)類型轉(zhuǎn)換標(biāo)準(zhǔn)數(shù)據(jù)類型轉(zhuǎn)換隱式轉(zhuǎn)換:7.5+2(將2自動(dòng)轉(zhuǎn)成double型)顯式轉(zhuǎn)換:int(89.5)(將89.5轉(zhuǎn)成整型)涉及到類類型的轉(zhuǎn)換對(duì)于用戶自己聲明的類型,編譯系統(tǒng)并不知道怎樣進(jìn)行轉(zhuǎn)換。解決這個(gè)問(wèn)題的關(guān)鍵是讓編譯系統(tǒng)知道怎樣去進(jìn)行轉(zhuǎn)換,需要定義專門的處理函數(shù)。將一個(gè)其他類型的數(shù)據(jù)轉(zhuǎn)換成一個(gè)類類型:轉(zhuǎn)換構(gòu)造函數(shù)將一個(gè)類的對(duì)象轉(zhuǎn)換成另一類型的數(shù)據(jù):類型轉(zhuǎn)換函數(shù)Complexoperator+(Complexx,Complexy){Complextemp;temp.real=x.real+y.real;temp.imag=x.imag+y.imag;returntemp;}#include<iostream>classComplex{private:doublereal;doubleimag;public:Complex();Complex(doubler,doublei);voidPrint();friendComplexoperator+(Complexx,Complexy);};

intmain(){Complexa(1,2),c;c=a+2.5;cout<<"c=";c.Print();}錯(cuò)誤。a是復(fù)數(shù),2.5是實(shí)數(shù)而加法運(yùn)算符重載函數(shù)的兩個(gè)加數(shù)都是復(fù)數(shù)。Complexoperter+(Complexx,Complexy){Complextemp;temp.real=x.real+y.real;temp.imag=x.imag+y.imag;returntemp;}#include<iostream.h>classComplex{private:doublereal;doubleimag;public:Complex();Complex(doubler,doublei);voidPrint();friendComplexoperter+(Complexx,Complexy);

Complex(doubler);};

intmain(){Complexa(1,2),c;c=a+2.5;//2.5+a也可以

cout<<"c=";c.Print();}Complex::Complex(doubler){real=r;imag=0;}正確。在類中定義了轉(zhuǎn)換構(gòu)造函數(shù)。在處理表達(dá)式a+2.5時(shí),編譯系統(tǒng)針對(duì)2.5調(diào)用轉(zhuǎn)換構(gòu)造函數(shù)Complex(2.5),建立了一個(gè)臨時(shí)的Complex對(duì)象(2.5+0i)此時(shí)加法運(yùn)算符兩側(cè)都為復(fù)數(shù),能參與運(yùn)算用轉(zhuǎn)換構(gòu)造函數(shù)進(jìn)行類型轉(zhuǎn)換轉(zhuǎn)換構(gòu)造函數(shù)——一種新的構(gòu)造函數(shù)。轉(zhuǎn)換構(gòu)造函數(shù)只有一個(gè)形參,如:

Complex(doubler){real=r;imag=0;}其作用是將double型的參數(shù)r轉(zhuǎn)換成Complex類的對(duì)象,將r作為復(fù)數(shù)的實(shí)部,虛部為0。用戶可以根據(jù)需要定義轉(zhuǎn)換構(gòu)造函數(shù),在函數(shù)體中告訴編譯系統(tǒng)怎樣去進(jìn)行轉(zhuǎn)換。注意:在類中,可以有轉(zhuǎn)換構(gòu)造函數(shù),也可以沒(méi)有轉(zhuǎn)換構(gòu)造函數(shù),視需要而定。編譯系統(tǒng)會(huì)根據(jù)建立對(duì)象時(shí)給出的實(shí)參的個(gè)數(shù)與類型選擇形參與之匹配的構(gòu)造函數(shù)。使用轉(zhuǎn)換構(gòu)造函數(shù)將一個(gè)指定的數(shù)據(jù)轉(zhuǎn)換為類對(duì)象的方法:(1)在類中定義一個(gè)只有一個(gè)參數(shù)的構(gòu)造函數(shù),參數(shù)類型是需要轉(zhuǎn)換的類型,在函數(shù)體中指定轉(zhuǎn)換方法。(2)在程序中可以用以下形式的語(yǔ)句進(jìn)行類型轉(zhuǎn)換:

類名(指定類型的數(shù)據(jù))

就可以將指定類型的數(shù)據(jù)轉(zhuǎn)換為此類的對(duì)象。程序中調(diào)用轉(zhuǎn)換構(gòu)造函數(shù)的語(yǔ)句,有以下情況:(1)定義語(yǔ)句Complexb(2.5)建立對(duì)象b,同時(shí)調(diào)用轉(zhuǎn)換構(gòu)造函數(shù),使b的real為2.5,imag為0,b相當(dāng)于2.5+0i(2)b=Complex(2.5)建立臨時(shí)對(duì)象,同時(shí)調(diào)用轉(zhuǎn)換構(gòu)造函數(shù),使該對(duì)象的real為2.5,imag為0,臨時(shí)對(duì)象相當(dāng)于2.5+0i。并將該對(duì)象的值賦給b。b在賦值后為2.5+0i(3)b=a+2.5

如果存在轉(zhuǎn)換構(gòu)造函數(shù),且已對(duì)加法運(yùn)算符進(jìn)行了重載(兩個(gè)加數(shù)都是Complex類對(duì)象),則b=a+2.5相當(dāng)于b=a+Complex(2.5),運(yùn)算后,b為2.5+0i不僅可以將一個(gè)標(biāo)準(zhǔn)類型數(shù)據(jù)轉(zhuǎn)換成類對(duì)象,也可以將另一個(gè)類的對(duì)象轉(zhuǎn)換成轉(zhuǎn)換構(gòu)造函數(shù)所在的類對(duì)象。如可以將一個(gè)學(xué)生類對(duì)象轉(zhuǎn)換為教師類對(duì)象,可以在Teacher類中寫出下面的轉(zhuǎn)換構(gòu)造函數(shù):

Teacher(Student&s){num=s.num;strcpy(name,);sex=s.sex;}但應(yīng)注意:對(duì)象s中的num,name,sex必須是公用成員,否則不能被類外引用。用類型轉(zhuǎn)換函數(shù)進(jìn)行類型轉(zhuǎn)換用轉(zhuǎn)換構(gòu)造函數(shù)可以將一個(gè)指定類型的數(shù)據(jù)轉(zhuǎn)換為類的對(duì)象。但是不能反過(guò)來(lái)將一個(gè)類的對(duì)象轉(zhuǎn)換為一個(gè)其他類型的數(shù)據(jù)。C++提供類型轉(zhuǎn)換函數(shù)來(lái)解決這個(gè)問(wèn)題。類型轉(zhuǎn)換函數(shù)的作用是將一個(gè)類的對(duì)象轉(zhuǎn)換成另一類型的數(shù)據(jù)。例10.9使用類型轉(zhuǎn)換函數(shù)的簡(jiǎn)單范例。#include<iostream>usingnamespacestd;classComplex{public:Complex(){real=0;imag=0;}Complex(doubler,doublei){real=r;imag=i;}

operatordouble(){returnreal;}

//類型轉(zhuǎn)換函數(shù)private:doublereal;doubleimag;};intmain(){Complexc1(3,4),c2(5,-10),c3;doubled1,d2;d1=2.5+c1;cout<<d1<<endl;return0;}編譯系統(tǒng)在處理表達(dá)式2.5+c1時(shí),加號(hào)兩側(cè)是double型數(shù)據(jù)和Complex類對(duì)象,無(wú)對(duì)應(yīng)的加號(hào)運(yùn)算符重載函數(shù),不能直接相加。而系統(tǒng)中有類型轉(zhuǎn)換函數(shù)(Complex轉(zhuǎn)為double),所以系統(tǒng)會(huì)自動(dòng)調(diào)用double(c1),得到一個(gè)double數(shù)據(jù),然后與2.5相加。上例中的類型轉(zhuǎn)換函數(shù)是:

溫馨提示

  • 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)論