C++ 運算符重載.ppt_第1頁
C++ 運算符重載.ppt_第2頁
C++ 運算符重載.ppt_第3頁
C++ 運算符重載.ppt_第4頁
C++ 運算符重載.ppt_第5頁
已閱讀5頁,還剩45頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第九章 運算符重載,C+語言程序設(shè)計教程,本章主要內(nèi)容,運算符重載概述 重載單目運算符 重載雙目運算符 重載比較運算符 重載賦值運算符,重載下標(biāo)運算符 重載運算符new與delete 重載逗號運算符 重載類型轉(zhuǎn)換運算符,9.1運算符重載概述,運算符重載是對已有的運算符賦予多重含義,使同一個運算符作用于不同類型的數(shù)據(jù)導(dǎo)致不同類型的行為。 主要優(yōu)點之一就是用戶自定義的數(shù)據(jù)類型可使用編譯系統(tǒng)預(yù)定義的運算符。 必要性 C+中預(yù)定義的運算符其運算對象只能是基本數(shù)據(jù)類型,而不適用于用戶自定義類型(如類) 實現(xiàn)機制 將指定的運算表達式轉(zhuǎn)化為對運算符函數(shù)的調(diào)用,運算對象轉(zhuǎn)化為運算符函數(shù)的實參。 編譯系統(tǒng)對重載

2、運算符的選擇,遵循函數(shù)重載的選擇原則。,注意:運算符重載的實質(zhì)就是函數(shù)重載,在實現(xiàn)過程中,首先把指定的運算表達式轉(zhuǎn)化為對運算符函數(shù)的調(diào)用,運算對象轉(zhuǎn)化為運算符函數(shù)的實參,然后根據(jù)實參的類型來確定需要調(diào)用的函數(shù),這個過程是在編譯過程中完成的.,運算符重載的規(guī)則與限制: (1)可以重載C+中除下列運算符外的所有運算符:. .* : ?: (2)只能重載C+語言中已有的運算符,不可臆造新的。 (3)不改變原運算符的優(yōu)先級和結(jié)合性。 (4)不能改變操作數(shù)個數(shù)。 (5)經(jīng)重載的運算符,其操作數(shù)中至少應(yīng)該有一個是自定義類型。,運算符重載有兩種形式: (1)重載為類成員函數(shù)。一般形式為: 函數(shù)類型 oper

3、ator 運算符(形參表) 函數(shù)體; 參數(shù)個數(shù)=原操作數(shù)個數(shù)-1(后置+、-除外) (2)重載為友元函數(shù)。一般格式為: friend 函數(shù)類型 operator 運算符(形參表) 函數(shù)體; 參數(shù)個數(shù)=原操作數(shù)個數(shù),且至少應(yīng)該有一個自定義類型的形參。,例 復(fù)數(shù)類運算符重載,class Complex public: / 構(gòu)造函數(shù) Complex()realpart=0.0;imagpart=0.0; Complex(double r1,double i1)realpart=r1;imagpart=i1; Complex(const Complex,/ 取復(fù)數(shù)的實部和虛部 double real(

4、)return realpart; double imag()return imagpart; / 算術(shù)運算符重載為成員函數(shù) Complex operator + (const Complex,/ 關(guān)系運算符重載為成員函數(shù) bool operator=(const Complex #endif 這個復(fù)數(shù)類定義了復(fù)數(shù)的+、-、*、/、=、!=等各項操作。,/算術(shù)運算符重載為友元函數(shù) friend Complex operator + (const Complex 對于成員函數(shù),一元運算符的參數(shù)為0;二元運算符的參數(shù)個數(shù)為1,如復(fù)數(shù)類中的=運算符,參數(shù)個數(shù)為2。對于友元函數(shù),參數(shù)的個數(shù)與操作數(shù)個數(shù)

5、相同。,9.2重載單目運算符,前置單目運算符 U 如果要重載 U 為類成員函數(shù),使之能夠?qū)崿F(xiàn)表達式 U oprd,其中 oprd 為A類對象,則 U 應(yīng)被重載為 A 類的成員函數(shù),無形參。 經(jīng)重載后,表達式 U oprd 相當(dāng)于 oprd.operator U( ),后置單目運算符 +和- 如果要重載 +或-為類成員函數(shù),使之能夠?qū)崿F(xiàn)表達式 oprd+ 或 oprd- ,其中 oprd 為A類對象,則 +或- 應(yīng)被重載為 A 類的成員函數(shù),且具有一個 int 類型形參。 經(jīng)重載后,表達式 oprd+ 相當(dāng)于 oprd.operator +(0),例,運算符前置+和后置+重載為時鐘類的成員函數(shù)。

6、 前置單目運算符,重載函數(shù)沒有形參,對于后置單目運算符,重載函數(shù)需要有一個整型形參。 操作數(shù)是時鐘類的對象。 實現(xiàn)時間增加1秒鐘。,#include class Clock/時鐘類聲明 public:/外部接口 Clock(int NewH=0, int NewM=0, int NewS=0); void ShowTime( ); void operator +( ); /前置單目運算符重載 void operator +(int); /后置單目運算符重載 private:/私有數(shù)據(jù)成員 int Hour, Minute, Second; ;,void Clock:operator +( )/

7、前置單目運算符重載函數(shù) Second+; if(Second=60) Second=Second-60; Minute+; if(Minute=60) Minute=Minute-60; Hour+; Hour=Hour%24; cout+Clock: ; ,void Clock:operator +(int) /后置單目運算符重載 Second+; if(Second=60) Second=Second-60; Minute+; if(Minute=60) Minute=Minute-60; Hour+; Hour=Hour%24; coutClock+: ; ,/其它成員函數(shù)的實現(xiàn)略 vo

8、id main( ) Clock myClock(23,59,59); coutFirst time output:; myClock.ShowTime( ); myClock+; myClock.ShowTime( ); +myClock; myClock.ShowTime( ); ,程序運行結(jié)果為: First time output:23:59:59 Clock+: 0:0:0 +Clock: 0:0:1 重載運算符也可以具有返回值,其使用格式如同一般成員函數(shù)一樣.,9.3 重載雙目運算符,對于雙目運算符,一個運算數(shù)是對象本身的數(shù)據(jù),由this指針給出,另一個運算數(shù)則需要通過運算符重載函

9、數(shù)的參數(shù)表來傳遞.,對雙目運算符 B 如果要重載 B 為類成員函數(shù),使之能夠?qū)崿F(xiàn)表達式 oprd1 B oprd2,其中 oprd1 為A 類對象,則 B 應(yīng)被重載為 A 類的成員函數(shù),形參類型應(yīng)該是 oprd2 所屬的類型。 經(jīng)重載后,表達式 oprd1 B oprd2 相當(dāng)于 oprd1.operator B(oprd2),例: 將“+”、“-”運算重載為復(fù)數(shù)類的成員函數(shù)。 規(guī)則: 實部和虛部分別相加減。 操作數(shù): 兩個操作數(shù)都是復(fù)數(shù)類的對象。,#include class complex/復(fù)數(shù)類聲明 public:/外部接口 complex(double r=0.0,double i=0

10、.0)real=r;imag=i; /構(gòu)造函數(shù) complex operator + (complex c2); /+重載為成員函數(shù) complex operator - (complex c2); /-重載為成員函數(shù) void display( );/輸出復(fù)數(shù) private:/私有數(shù)據(jù)成員 double real;/復(fù)數(shù)實部 double imag;/復(fù)數(shù)虛部 ;,complex complex:operator +(complex c2) /重載函數(shù)實現(xiàn) complex c; c.real=c2.real+real; c.imag=c2.imag+imag; return complex

11、(c.real,c.imag); ,complex complex:operator -(complex c2) /重載函數(shù)實現(xiàn) complex c; c.real=real-c2.real; c.imag=imag-c2.imag; return complex(c.real,c.imag); ,void complex:display( ) cout(real,imag)endl; void main( ) /主函數(shù) complex c1(5,4),c2(2,10),c3; /聲明復(fù)數(shù)類的對象 coutc1=; c1.display( ); coutc2=; c2.display( );

12、c3=c1-c2;/使用重載運算符完成復(fù)數(shù)減法 coutc3=c1-c2=; c3.display( ); c3=c1+c2;/使用重載運算符完成復(fù)數(shù)加法 coutc3=c1+c2=; c3.display( ); ,程序輸出的結(jié)果為: c1=(5,4) c2=(2,10) c3=c1-c2=(3,-6) c3=c1+c2=(7,14) 運算符也可以重載為類的友元函數(shù),這樣可以自由地訪問該類的任何數(shù)據(jù)成員.這時,運算符所需要的運算數(shù)都需要通過函數(shù)的形參表來傳遞,在參數(shù)表中形參從左到右的順序就是運算符運算數(shù)的順序.,9.4 重載比較運算符,可以設(shè)計比較運算符、或=的重載函數(shù). 比較運算符重載函數(shù)

13、必須返回真或假. 例:編寫一個程序,測試輸入的3條邊的長度能否構(gòu)成一個三角形.,#include class line int len; Public: line(int n)len=n; line operator+(line l) /”+”運算符重載 int x=len+l.len; return line(x); bool operator(line l) /”運算符重載 return(lenl.len) ? 1:0; ;,Void main() line a(10),b(5),c(14); if(a+bc ,9.5 重載賦值運算符,有兩種類型的賦值運算符: (1)”+=”和”- =”等

14、先計算后賦值的運算符; (2)”=”,即直接賦值的運算符.,一、重載運算符”+=”和”- =”,對于標(biāo)準(zhǔn)數(shù)據(jù)類型, ”+=”和”- =”的作用是將一個數(shù)據(jù)與另一個數(shù)據(jù)進行加法或減法運算后,再將結(jié)果回送給賦值號左邊的變量中。 重載后,使其實現(xiàn)其他相關(guān)的功能。,例子:分析以下程序,#include Class vector int x,y; public: vector() ; vector(int x1,int y1) x=x1;y=y1; friend vector operator +=(vectir v1,vector v2) /友元方式實現(xiàn) v1.x+=v2.x; v1.y+=v2.y;

15、 return v1; ,vector operator- =(vector v) /成員函數(shù)方式實現(xiàn) vector tmp; tmp.x=x-v.x; tmp.y-y-v.y; return tmp; /返回tmp對象 void display() cout“(”x“,”y“)”endl; ;,Void main() vector v1(6,8),v2(3,6),v3,v4; cout“v1=”;v1.display(); cout“v2=”;v2.display(); v3=v1+=v2; cout“v3=v1+=v2后,v3=”;v3.display(); v4=v1+=v2; cout

16、“v4=v1+=v2后,v4=”;v4.display(); 注意:程序中的重載運算符“+=”和“- =”與標(biāo)準(zhǔn)數(shù)據(jù)類型的“+=”和“- =”不完全相同。調(diào)用重載運算符時,例如v1+=v2,并不改變v1的值,而后者回改變運算符左邊變量的值。,“=”原有含義:將賦值號右邊表達式的結(jié)果拷貝給賦值號左邊的變量. “=”的重載:將賦值號右邊對象的私有數(shù)據(jù)依次復(fù)制到賦值號左邊對象的私有數(shù)據(jù)中. 如果一個類包含指針成員,且采用這種默認的按成員賦值,那么當(dāng)這些成員撤消后,內(nèi)存的使用將變得不可靠.,二、重載運算符”=”,例: 有一個sample類 sample inst1,inst2; inst2=inst1

17、;(使用默認的賦值運算符) 則賦值之前,這兩個對象內(nèi)存分配如圖1;賦值之后如圖2,只復(fù)制了指針而沒有復(fù)制指針?biāo)赶虻膬?nèi)存,現(xiàn)在他們都指向同一內(nèi)存區(qū).當(dāng)不需要inst1,inst2對象后,調(diào)用析構(gòu)函數(shù)(兩次)來撤消同一內(nèi)存,會產(chǎn)生運行錯誤.,圖1,圖2,可以重載運算符”=”來解決這個問題. 重載該運算符的成員函數(shù)如下: 方式1: Operator=(sample /返回inst2對象 ,上述”=”運算符重載成員函數(shù)中,都把s.p的內(nèi)容復(fù)制到this.p中.這樣,在執(zhí)行inst2=inst1后,內(nèi)存分配結(jié)果如圖所示:,9.6 重載下標(biāo)運算符,下標(biāo)運算符” ”通常用于取數(shù)組的某個元素. 下標(biāo)運算符重

18、載可以實現(xiàn)數(shù)組下標(biāo)的越界檢測等. 下標(biāo)運算符重載函數(shù)只能作為類的成員函數(shù),不能作為類的友元函數(shù). 例:分析以下程序,#include #include Class words int len; char *str; public:,words(char *s) str=new charstrlen(s)+1; strcpy(str,s); len=strlen(s); char operator (int n) /下標(biāo)運算符重載的成員函數(shù) if (nlen-1) /數(shù)組越界判斷 cout“數(shù)組下標(biāo)越界”; return /返回一個特殊字符 else return *(str+n); void

19、disp() coutstrendl; ;,Void main() words word(“this is c+ book”); word.disp(); cout“位置0:”; coutword0endl; /顯示T cout“位置15”; coutword15endl; /顯示K cout“位置25”; coutword25endl; /越界 ,9.7 重載運算符new與delete,C+提供了new和delete這兩個運算符用于內(nèi)存管理,在大多情況下,他們是非常有效的.但有些情況下需要自己管理內(nèi)存,以克服new和delete的不足.這就要重載運算符new和delete,使其按照要求完成對

20、內(nèi)存的管理. 格式如下: void *operator new(size_t size) /分配內(nèi)存的算法 return pointer_to_memory; /pointer_to_memory為指向分配的內(nèi)存的指針 void operator delete(void *p) /釋放內(nèi)存的算法 ,例:分析以下程序的執(zhí)行 #include #include Class rect int length,width; Public: rect(int l,int w) length=l;width=w; void disp() cout“面積:”length*widthendl; ,Void *o

21、perator new(size_t size) /重載new運算符成員函數(shù) coutdisp(); delete p; ,9.8 重載逗號運算符,逗號運算符表達式:”左運算數(shù),右運算數(shù)”,該表達式返回右運算數(shù)的值. 用類的成員函數(shù)來重載逗號運算符,則只帶一個右運算數(shù),左運算數(shù)由指針this提供. 例:分析以下程序,#include #include Class point int x,y; public: point();,point(int l,int w) x=l;y=w; void disp()cout“面積”x*yendl; point operator,(point r) /逗號運算符重載成員函數(shù) point temp; temp.x=r.x; temp.y=r.y; return temp; point operator+(point r) point temp; temp.

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論