第6章 運(yùn)算符重載_第1頁(yè)
第6章 運(yùn)算符重載_第2頁(yè)
第6章 運(yùn)算符重載_第3頁(yè)
第6章 運(yùn)算符重載_第4頁(yè)
第6章 運(yùn)算符重載_第5頁(yè)
已閱讀5頁(yè),還剩19頁(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、第第6章章 運(yùn)算符重載運(yùn)算符重載第第1章章 基本數(shù)據(jù)與表達(dá)式基本數(shù)據(jù)與表達(dá)式 6.1 運(yùn)算符重載的實(shí)質(zhì) 6.2 用友元函數(shù)和成員函數(shù)重載運(yùn)算符的異同 6.3 +和- - 運(yùn)算符的重載本章主要內(nèi)容運(yùn)算符重載的概念、規(guī)則以及兩種重要的重載形式。幾種特殊的運(yùn)算符重載方法與應(yīng)用實(shí)例。 問(wèn)題的引入 C+編程中,程序員可以使用內(nèi)置類型,也可以定義新類型。內(nèi)置類型可以和C+的豐富運(yùn)算符集合一起使用。運(yùn)算符為程序員提供了表達(dá)內(nèi)置類型對(duì)象操作的準(zhǔn)確概念。對(duì)于表達(dá)式5+7來(lái)說(shuō),編譯器在處理它時(shí),并不需要知道符號(hào)“+”表示什么意思,它可以將這個(gè)表達(dá)式解釋成函數(shù)調(diào)用的形式: operator+(5,7)在C+中,op

2、erator是關(guān)鍵字,它經(jīng)常和C+中的一個(gè)運(yùn)算符聯(lián)用,表示一個(gè)運(yùn)算符函數(shù)名,也稱重載運(yùn)算符函數(shù)。重載運(yùn)算符函數(shù)可以完成和運(yùn)算符同樣的功能,但功能更強(qiáng)。可見,運(yùn)算符重載是通過(guò)重載函數(shù)來(lái)完成的。運(yùn)算符重載的目的在于可以使用現(xiàn)有的運(yùn)算符去作用于更為復(fù)雜的運(yùn)算對(duì)象。例如,對(duì)于兩個(gè)浮點(diǎn)數(shù)的加法可以用普通運(yùn)算符完成: float x=2.0,y=3.0,z;z=x+y;下面的程序用于說(shuō)明重載函數(shù)下面的程序用于說(shuō)明重載函數(shù)operator+(),以使它可以按對(duì)復(fù)數(shù)進(jìn)行加操,以使它可以按對(duì)復(fù)數(shù)進(jìn)行加操作的語(yǔ)義執(zhí)行兩個(gè)復(fù)數(shù)的加操作作的語(yǔ)義執(zhí)行兩個(gè)復(fù)數(shù)的加操作。例例 6.1 兩個(gè)復(fù)數(shù)相加的運(yùn)算符重載實(shí)現(xiàn)兩個(gè)復(fù)數(shù)相

3、加的運(yùn)算符重載實(shí)現(xiàn)/例6-1.cpp#includeclass complexfloat real;float imag; public:complex(float r=0,float i=0) real=r; imag=i; void show() coutreal+ imag”j”operator#()或obj.operator#()。在一個(gè)類中,重載二元運(yùn)算符的一般形式為: 類型 類名:operator#(參數(shù)) /相對(duì)于該類而定義的操作 由于類中的成員函數(shù)帶有一個(gè)this參數(shù),所以在類中重載二元運(yùn)算符時(shí),只能指定一個(gè)參數(shù)。若有某類的兩個(gè)對(duì)象obj1和obj2,則表達(dá)式obj1#obj2

4、被編譯器解釋成obj.operator#(obj2)或this-operator#(obj2)。例例 6.2 對(duì)例對(duì)例6.1的擴(kuò)展的擴(kuò)展/例6-2.cpp#includeclass complexfloat real;float imag;public:complex(float r=0,float i=0) real=r; imag=i; complex operator+(complex &c) float r=real+c.real; float i=imag+c.imag; return complex(r,i);complex operator-(complex &c) float

5、r=real-c.real; float i=imag-c.imag; return complex(r,i);complex operator-() return complex(-real,-imag); void show() cout(real,imag)endl; ;void main() complex c1(2.5,3.7),c2(4.2,6.5); complex c; c=c1-c2; c.show(); c=c1+c2; c.show(); c=-c1; c.show();6.1.3 規(guī)則限制規(guī)則限制 C+對(duì)運(yùn)算符重載也有一些限制。首先,不能更改任何運(yùn)算符的優(yōu)先級(jí);其次,不

6、可改變此運(yùn)算符所需要的操作數(shù)的數(shù)目。最后,除了“=”以外,重載運(yùn)算符都可以為任何派生類所繼承。多數(shù)C+運(yùn)算符都可以重載。這些運(yùn)算符如圖6.1所示。圖6.2列出了不能重載的運(yùn)算符。表 6.1 可以重載的運(yùn)算符可以重載的運(yùn)算可以重載的運(yùn)算符符+ */%&|!=+= =*=/=%=&=|=!=&|+ *()newdeletenewdelete不能重載的運(yùn)算符.*:?:sizeof表 6.2 不能重載的運(yùn)算符6.2 6.2 用友元函數(shù)和成員函數(shù)重載運(yùn)算符的異同用友元函數(shù)和成員函數(shù)重載運(yùn)算符的異同 當(dāng)運(yùn)算符重載為類的成員函數(shù)時(shí),函數(shù)的參數(shù)個(gè)數(shù)比原來(lái)的操作數(shù)要少一個(gè)(后置單目運(yùn)算符除外),這是因?yàn)槌蓡T函數(shù)

7、用this指針隱式地訪問(wèn)了類的一個(gè)對(duì)象,它充當(dāng)了運(yùn)算符函數(shù)最左邊的操作數(shù)。因此:1. 雙目運(yùn)算符重載為類的成員函數(shù)時(shí),函數(shù)只顯式說(shuō)明一個(gè)參數(shù),該形參是運(yùn)算符的右操作數(shù)。如a + b = a.Add(b)2. 前置單目運(yùn)算符重載為類的成員函數(shù)時(shí),不需要顯式說(shuō)明參數(shù),即函數(shù)沒(méi)有形參。如+i= i.prePlus()3. 后置單目運(yùn)算符重載為類的成員函數(shù)時(shí),函數(shù)要帶有一個(gè)整型形參。如 i+=i.sufPlus(int )調(diào)用成員函數(shù)運(yùn)算符的格式如下:.operator () 它等價(jià)于 一個(gè)運(yùn)算符函數(shù)可能是一類的友元而不是成員。友元函數(shù)沒(méi)有隱含的this指針,因此,當(dāng)一友元被用來(lái)重載一運(yùn)算符時(shí),如果該

8、運(yùn)算符是雙目的,則兩個(gè)操作數(shù)都被明確地傳遞給運(yùn)算符;如果該操作符是單目的,那么就傳遞單個(gè)操作數(shù)。僅有的不能使用友元函數(shù)來(lái)進(jìn)行運(yùn)算符重載的運(yùn)算符是“=”、“()”、“”、“-”,其余的運(yùn)算符可以使用成員或友元函數(shù)來(lái)實(shí)現(xiàn)運(yùn)算符的重載。運(yùn)算符重載為類的友元函數(shù)的一般格式為:friend operator ()當(dāng)運(yùn)算符重載為類的友元函數(shù)時(shí),由于沒(méi)有隱含的this指針,因此操作數(shù)的個(gè)數(shù)沒(méi)有變化,所有的操作數(shù)都必須通過(guò)函數(shù)的形參進(jìn)行傳遞,函數(shù)的參數(shù)與操作數(shù)自左至右一一對(duì)應(yīng)。調(diào)用友元函數(shù)運(yùn)算符的格式如下:operator (,) 它等價(jià)于 例如:a+b等價(jià)于operator +(a,b)。例例 6.3 復(fù)數(shù)

9、運(yùn)算的友元函數(shù)重載形式復(fù)數(shù)運(yùn)算的友元函數(shù)重載形式/例6-3.cpp#includeclass complexfloat real,imag; public:complex(float r=0,float i=0) real=r; imag=i; void show() cout(real,imag) 3. 類型轉(zhuǎn)換函數(shù)只能定義為一個(gè)類的成員函數(shù)而不能定義為類的友元函數(shù)。 4. 若一個(gè)運(yùn)算符的操作需要修改對(duì)象的狀態(tài),選擇重載為成員函數(shù)較好。 5. 若運(yùn)算符所需的操作數(shù)(尤其是第一個(gè)操作數(shù))希望有隱式類型轉(zhuǎn)換,則只能選用友元函數(shù)。 6. 當(dāng)運(yùn)算符函數(shù)是一個(gè)成員函數(shù)時(shí),最左邊的操作數(shù)(或者只有最左邊

10、的操作數(shù))必須是運(yùn)算符類的一個(gè)類對(duì)象(或者是對(duì)該類對(duì)象的引用)。如果左邊的操作數(shù)必須是一個(gè)不同類的對(duì)象,或者是一個(gè)內(nèi)部類型的對(duì)象,該運(yùn)算符函數(shù)必須作為一個(gè)友元函數(shù)來(lái)實(shí)現(xiàn)。 7. 當(dāng)需要重載運(yùn)算符具有可交換性時(shí),選擇重載為友元函數(shù)。 增量和減量運(yùn)算符(算前增量、算后增量、算前減量和算后減量)都可以重載。 例如,假設(shè)我們希望在用戶定義Date對(duì)象d1的天數(shù)中加1。當(dāng)編譯程序看見算前增量表達(dá)式 +d1 時(shí),編譯程序產(chǎn)生成員函數(shù)調(diào)用:d1.operator+() 它的原型是:Date &operator+(); 如果算前增量作為非成員函數(shù)實(shí)現(xiàn),則當(dāng)編譯程序看見表達(dá)式 +d1 時(shí),編譯程序產(chǎn)生函數(shù)調(diào)用:

11、operator+( d1 )其原型可以在Date類中聲明如下:friend Date &operator+( Date & );當(dāng)編譯程序看見算后增量運(yùn)算符表達(dá)式d1+ ,便產(chǎn)生成員函數(shù)調(diào)用:d1.operator+( 0 )它的原型是:Date operator+( int )其中,0是嚴(yán)格的“啞元值”,使用于算后增量的operator+的參數(shù)列表可以和用于算前增量的operator+參數(shù)列表相區(qū)別。如果算后增量作為非成員函數(shù)實(shí)現(xiàn),則當(dāng)編譯程序看見表達(dá)式 d1+ 時(shí),編譯程序?qū)a(chǎn)生函數(shù)調(diào)用:operator+( d1, 0 )它的原型將是:friend Date operator+( Da

12、te &, int );再次重申,編譯程序使用0這個(gè)參數(shù),這樣,用于算后增量的operator+的參數(shù)列表可以和算前增量的參數(shù)列表區(qū)分。例例 6.4 +運(yùn)算符重載的例子運(yùn)算符重載的例子/例6-4.cpp#include class Date int mo, da, yr; static int dys;public: Date(int m=0, int d=0, int y=0) mo = m; da = d; yr = y; void display() const cout n mo / da / dysdt.mo-1) n -= dysdt.mo-1; if (+dt.mo = 13) dt.mo = 1; dt.yr+; dt.da = n; return dt;關(guān)于+和-運(yùn)算符的重載的一點(diǎn)說(shuō)明如下:對(duì)于“+” 和“-”這兩個(gè)一元運(yùn)算符,存在前置和后置的問(wèn)題,在定義時(shí)必須有所區(qū)分。(1)用成員函數(shù)的形式來(lái)進(jìn)行重載如果+為前增量運(yùn)算符時(shí),重載函數(shù)的一般格式為: ClassName : operator + ( )/如果+為后增量運(yùn)算符時(shí),重載函數(shù)的一般格式為: ClassName : operator + ( int )/(2)非成員函數(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)論