計算機編程PPT課件_第1頁
計算機編程PPT課件_第2頁
計算機編程PPT課件_第3頁
計算機編程PPT課件_第4頁
計算機編程PPT課件_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 信息管理與工程學院信息管理與工程學院 2014年年9月月 計計 算算 機機 編編 程程第第14章章 運算符重載運算符重載14.1 引言引言14.2 運算符重載方法運算符重載方法14.3 運算符重載的規(guī)則運算符重載的規(guī)則14.4 運算符函數(shù)運算符函數(shù)14.5 雙目運算符的重載現(xiàn)雙目運算符的重載現(xiàn)14.6 單目運算符的重載單目運算符的重載14.7 重載流插入運算符和流提取運算符重載流插入運算符和流提取運算符14. 8 不同類型數(shù)據(jù)間的轉換不同類型數(shù)據(jù)間的轉換 14.1 引言引言 C+用戶希望能在自己創(chuàng)建的新的類型用戶希望能在自己創(chuàng)建的新的類型(類類)上上也能使用這類也能使用這類C+本身已經存在的

2、運算符本身已經存在的運算符, 例如例如: 復數(shù)和矩陣這些概念,也希望用熟知的算術運復數(shù)和矩陣這些概念,也希望用熟知的算術運算符算符: +, *等進行類似的算術運算等進行類似的算術運算; C+中解決類似問題的技術叫做運算符重載。中解決類似問題的技術叫做運算符重載。14.2 運算符重載方法運算符重載方法 實際上實際上, 在前面的加法例子中在前面的加法例子中, 我們已經不知不我們已經不知不覺地使用了重載的運算。在這個程序里覺地使用了重載的運算。在這個程序里+既既完成兩個整形數(shù)的加法運算,又完成了雙精度完成兩個整形數(shù)的加法運算,又完成了雙精度型的加法運算。型的加法運算。 為什么同一個運算符為什么同一個

3、運算符+可以用于完成不同類可以用于完成不同類型的數(shù)據(jù)的加法運算?這是因為型的數(shù)據(jù)的加法運算?這是因為C+針對預定針對預定義基本數(shù)據(jù)類型已經對義基本數(shù)據(jù)類型已經對+運算符做了適當?shù)倪\算符做了適當?shù)闹剌d。在編譯不同類型數(shù)據(jù)的加法表達式時,重載。在編譯不同類型數(shù)據(jù)的加法表達式時,會自動調用相應類型的加法運算符重載函數(shù)。會自動調用相應類型的加法運算符重載函數(shù)。 實際上我們已經不知不覺地使用了重載的運算。實際上我們已經不知不覺地使用了重載的運算。 (例(例14-1):): / program14_1.cpp #include using namespace std; int main() int i1=

4、10, i2=10, i;i=i1+i2;couti1+i2=iendl;double d1=20, d2=20, d;d=d1+d2;coutd1+d2=dendl;return 0; 在這個程序里+既完成兩個整形數(shù)的加法運算,又完成了雙精度型的加法運算。為什么同一個運算符+可以用于完成不同類型的數(shù)據(jù)的加法運算?這是因為C+針對預定義基本數(shù)據(jù)類型已經對+運算符做了適當?shù)闹剌d。復數(shù)的加法運算復數(shù)的加法運算 用用c+處理數(shù)學里所提到的復數(shù),我們可以聲處理數(shù)學里所提到的復數(shù),我們可以聲明一個復數(shù)類,并定義一個類成員函數(shù)明一個復數(shù)類,并定義一個類成員函數(shù): operator+(Complex t )

5、來實現(xiàn)復數(shù)的加法運算。來實現(xiàn)復數(shù)的加法運算。 成員函數(shù)成員函數(shù)operator+(Complex t)的函數(shù)名稱為的函數(shù)名稱為operator+,參數(shù)類型為,參數(shù)類型為Complex類。類。 operator+稱為稱為“加運載符函數(shù)加運載符函數(shù)”。 當程序執(zhí)行到當程序執(zhí)行到sum=com1+com2時,編譯器就將時,編譯器就將此式編譯成此式編譯成sum= com1 .operator(com2)。/ program14_2.cpp#include using namespace std; class Complex /復數(shù)類聲明復數(shù)類聲明public: double real; /實數(shù)實數(shù) d

6、ouble imag; /虛數(shù)虛數(shù) Complex(double a, double b) /構造函數(shù)定義構造函數(shù)定義this-real=a; this-imag=b; Complex() /默認構造函數(shù)定義默認構造函數(shù)定義Complex operator+(Complex t) /成員函數(shù)成員函數(shù)operator+定義定義Complex r; r.real = this-real+t.real; r.imag = this-imag+t.imag; return r; ; int main()Complex com1(13, 10), com2(20, 44), sum; /創(chuàng)建三個創(chuàng)建三個

7、Complex類對象類對象/sum=com1.operator + (com2); /對象對象com1執(zhí)行成員函數(shù)執(zhí)行成員函數(shù)operator+sum=com1+ com2; coutsum的實數(shù)部分為的實數(shù)部分為sum.realendl; coutsum的虛數(shù)部分為的虛數(shù)部分為sum.imagiendl; return 0; 在main()函數(shù)中sum=com1.operator + (com2)可以改寫為sum=com1+com2,當程序執(zhí)行到sum=com1+com2時,編譯器就將此式編譯成sum= com1 .operator(com2)。這樣就實現(xiàn)了“+”運算符的重載,也就是用“+”

8、實現(xiàn)了復數(shù)的相加。14.3 運算符重載的規(guī)則運算符重載的規(guī)則(1)C+中預定義的運算符其運算對象只能是中預定義的運算符其運算對象只能是基本數(shù)據(jù)類型,而不適用于用戶自定義類型。基本數(shù)據(jù)類型,而不適用于用戶自定義類型。(2)C+不允許用戶自己定義新的運算符,只不允許用戶自己定義新的運算符,只能對已有的能對已有的C+運算符進行重載。運算符進行重載。(3)C+允許重載的運算符允許重載的運算符C+中絕大部分的運中絕大部分的運算符允許重載。算符允許重載。(4)重載不能改變運算符運算對象(即操作數(shù))重載不能改變運算符運算對象(即操作數(shù))的個數(shù)。)的個數(shù)。14.3 運算符重載的規(guī)則運算符重載的規(guī)則(5)重載不

9、能改變運算符的優(yōu)先級別。)重載不能改變運算符的優(yōu)先級別。(6)重載運算符的函數(shù)不能有默認的參數(shù)。)重載運算符的函數(shù)不能有默認的參數(shù)。(7)重載的運算符必須和用戶定義的自定義類)重載的運算符必須和用戶定義的自定義類型的對象一起使用,其參數(shù)至少應有一個是類型的對象一起使用,其參數(shù)至少應有一個是類對象對象(或類對象的引用或類對象的引用)。(8)用于類對象的運算符一般必須重載,但有)用于類對象的運算符一般必須重載,但有兩個例外,運算符兩個例外,運算符“=”和和“&”不必用戶重載。不必用戶重載。14.4 運算符函數(shù)運算符函數(shù)14.4.1 重載為類的成員函數(shù)重載為類的成員函數(shù)14.4.2 重載為類

10、的友員函數(shù)重載為類的友員函數(shù)14.4.1 重載為類的成員函數(shù)重載為類的成員函數(shù) 運算符重載為類的成員函數(shù)的語法形式如下:運算符重載為類的成員函數(shù)的語法形式如下:類名類名 operator 運算符(形參列表)運算符(形參列表)函數(shù)體;函數(shù)體;和其它函數(shù)一樣,運算符函數(shù)具有返回類型、函數(shù)名稱、形參列表和函數(shù)體。這里類名相當于其它函數(shù)的返回類型。14.4.2 重載為類的友員函數(shù)重載為類的友員函數(shù)(以復數(shù)為例以復數(shù)為例) Complex operator+(Complex t1, Complex t2) /成員函數(shù)成員函數(shù)operator+定義定義Complex r; r.real = t1.real

11、+t2.real; r.imag = t1.imag+t2.imag; return r; friend Complex operator+(Complex t1, Complex t2); /成員函數(shù)成員函數(shù)operator+聲明聲明14.5 雙目運算符的重載雙目運算符的重載 雙目運算符(或稱二元運算符)是雙目運算符(或稱二元運算符)是C+中最常中最常用的運算符。用的運算符。 雙目運算符有兩個操作數(shù),通常在運算符的左雙目運算符有兩個操作數(shù),通常在運算符的左右兩側,如右兩側,如3+5, a=b, i10等。等。 在重載雙目運算符時,不言而喻在函數(shù)中應該在重載雙目運算符時,不言而喻在函數(shù)中應該有

12、兩個參數(shù)。有兩個參數(shù)。 前面的例子就是雙目運算符重載。前面的例子就是雙目運算符重載。14.6 單目運算符的重載單目運算符的重載 在在C+語言中,單目運算符是指該運算符只具語言中,單目運算符是指該運算符只具有一個操作數(shù),如最常用的有一個操作數(shù),如最常用的+i和和-i等。等。 單目運算符只有一個操作數(shù),重載單目運算符單目運算符只有一個操作數(shù),重載單目運算符的方法與重載雙目運算符的方法是類似的。的方法與重載雙目運算符的方法是類似的。 由于單目運算符只有一個操作數(shù),因此如果運由于單目運算符只有一個操作數(shù),因此如果運算符重載函數(shù)作為友元函數(shù),運算符重載函數(shù)算符重載函數(shù)作為友元函數(shù),運算符重載函數(shù)只有一個

13、參數(shù)。只有一個參數(shù)。 如果運算符重載函數(shù)作為成員函數(shù),則還可省如果運算符重載函數(shù)作為成員函數(shù),則還可省略此參數(shù)。略此參數(shù)。14.7 重載流插入運算符和流提取運重載流插入運算符和流提取運算符算符 如果想直接用如果想直接用“”輸出和輸入自己聲輸出和輸入自己聲明的類型的數(shù)據(jù),必須對它們重載。明的類型的數(shù)據(jù),必須對它們重載。 對對“”重載的函數(shù)形式如下:重載的函數(shù)形式如下: istream & operator (istream &, 自定義類自定義類 &); ostream & operator (ostream &, 自定義類自定義類 &);14.

14、8 不同類型數(shù)據(jù)間的轉換不同類型數(shù)據(jù)間的轉換 以前我們接觸的是標準類型之間的轉換,現(xiàn)在以前我們接觸的是標準類型之間的轉換,現(xiàn)在用戶自己定義了類,就提出了以下問題:一個用戶自己定義了類,就提出了以下問題:一個自定義類的對象能否轉換成標準類型的,譬如自定義類的對象能否轉換成標準類型的,譬如,將一個復數(shù)類數(shù)據(jù)轉換成整數(shù)或雙精度數(shù)。,將一個復數(shù)類數(shù)據(jù)轉換成整數(shù)或雙精度數(shù)。 解決問題的關鍵是讓編譯系統(tǒng)知道怎樣去進行解決問題的關鍵是讓編譯系統(tǒng)知道怎樣去進行這些轉換,需要定義專門的函數(shù)來處理。轉換這些轉換,需要定義專門的函數(shù)來處理。轉換構造函數(shù)構造函數(shù)(conversion constructor func

15、tion)的作的作用是將一個其他類型的數(shù)據(jù)轉換成一個指定的用是將一個其他類型的數(shù)據(jù)轉換成一個指定的類的對象。類的對象。14. 8 不同類型數(shù)據(jù)間的轉換不同類型數(shù)據(jù)間的轉換14.8.1 轉換構造函數(shù)轉換構造函數(shù)-數(shù)轉換成類對象數(shù)轉換成類對象14.8.2 類型轉換函數(shù)類型轉換函數(shù)-類對象轉數(shù)據(jù)類對象轉數(shù)據(jù)14.8.1 轉換構造函數(shù)轉換構造函數(shù)-數(shù)轉換成類對象數(shù)轉換成類對象 數(shù)轉換成類對象轉換構造函數(shù)只有一個形參。數(shù)轉換成類對象轉換構造函數(shù)只有一個形參。對象名對象名=類名類名(類型類型 數(shù)據(jù)數(shù)據(jù))構造函數(shù)定義構造函數(shù)定義 例:例:Complex(double r)real=r; image=0; 其

16、作用是將其作用是將double型的參數(shù)型的參數(shù)r轉換成轉換成Complex類類的對象,將的對象,將r作為復數(shù)的實部,虛部為作為復數(shù)的實部,虛部為0。用戶。用戶可以根據(jù)需要定義轉換構造函數(shù),在函數(shù)體中可以根據(jù)需要定義轉換構造函數(shù),在函數(shù)體中告訴編譯系統(tǒng)怎樣去進行轉換。告訴編譯系統(tǒng)怎樣去進行轉換。將指定的數(shù)據(jù)轉換為類對象的方法將指定的數(shù)據(jù)轉換為類對象的方法(1)先聲明一個類)先聲明一個類(如上面的如上面的Complex)。(2)在這個類中定義一個只有一個參數(shù)的構造)在這個類中定義一個只有一個參數(shù)的構造函數(shù),參數(shù)的類型是需要轉換的類型,函數(shù)體函數(shù),參數(shù)的類型是需要轉換的類型,函數(shù)體中指定轉換的方法。

17、中指定轉換的方法。(3)在該類的作用域內可以用以下形式進行類)在該類的作用域內可以用以下形式進行類型轉換:型轉換:類名(指定類型的數(shù)據(jù))類名(指定類型的數(shù)據(jù))14.8.2 類型轉換函數(shù)類型轉換函數(shù)-類對象轉數(shù)據(jù)類對象轉數(shù)據(jù) 類型轉換函數(shù)類型轉換函數(shù)(type conversion function)的作用的作用是將一個類的對象轉換成另一類型的數(shù)據(jù)。是將一個類的對象轉換成另一類型的數(shù)據(jù)。 類型轉換函數(shù)的一般形式為類型轉換函數(shù)的一般形式為:operator 類型名類型名( ) 實現(xiàn)轉換的語句實現(xiàn)轉換的語句 例如,已聲明了一個例如,已聲明了一個Complex類,可以在類,可以在Complex類中這樣定義類型轉換函數(shù):類中這樣定義類型轉換函數(shù):operator double()return real;類型轉換函數(shù)應該注意以下幾點類型轉換函數(shù)應該注意以下幾點(1)函數(shù)名是)函數(shù)名是operator double。(2)從函數(shù)形式可以看到,它與運算符重載函數(shù)相似,)從函數(shù)形式可以看到,它與運算符重載函數(shù)相似,都是用關鍵字都是

溫馨提示

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

評論

0/150

提交評論