第6章 運算符重載_第1頁
第6章 運算符重載_第2頁
第6章 運算符重載_第3頁
第6章 運算符重載_第4頁
第6章 運算符重載_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

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

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

3、加的運算符重載實現(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#()。在一個類中,重載二元運算符的一般形式為: 類型 類名:operator#(參數(shù)) /相對于該類而定義的操作 由于類中的成員函數(shù)帶有一個this參數(shù),所以在類中重載二元運算符時,只能指定一個參數(shù)。若有某類的兩個對象obj1和obj2,則表達(dá)式obj1#obj2

4、被編譯器解釋成obj.operator#(obj2)或this-operator#(obj2)。例例 6.2 對例對例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+對運算符重載也有一些限制。首先,不能更改任何運算符的優(yōu)先級;其次,不

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

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

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

9、運算的友元函數(shù)重載形式復(fù)數(shù)運算的友元函數(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ù)只能定義為一個類的成員函數(shù)而不能定義為類的友元函數(shù)。 4. 若一個運算符的操作需要修改對象的狀態(tài),選擇重載為成員函數(shù)較好。 5. 若運算符所需的操作數(shù)(尤其是第一個操作數(shù))希望有隱式類型轉(zhuǎn)換,則只能選用友元函數(shù)。 6. 當(dāng)運算符函數(shù)是一個成員函數(shù)時,最左邊的操作數(shù)(或者只有最左邊

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

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

12、te &, int );再次重申,編譯程序使用0這個參數(shù),這樣,用于算后增量的operator+的參數(shù)列表可以和算前增量的參數(shù)列表區(qū)分。例例 6.4 +運算符重載的例子運算符重載的例子/例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)于+和-運算符的重載的一點說明如下:對于“+” 和“-”這兩個一元運算符,存在前置和后置的問題,在定義時必須有所區(qū)分。(1)用成員函數(shù)的形式來進(jìn)行重載如果+為前增量運算符時,重載函數(shù)的一般格式為: ClassName : operator + ( )/如果+為后增量運算符時,重載函數(shù)的一般格式為: ClassName : operator + ( int )/(2)非成員函數(shù)形式

溫馨提示

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

最新文檔

評論

0/150

提交評論