第9章友元函數(shù)與運(yùn)算符重載_第1頁
第9章友元函數(shù)與運(yùn)算符重載_第2頁
第9章友元函數(shù)與運(yùn)算符重載_第3頁
第9章友元函數(shù)與運(yùn)算符重載_第4頁
第9章友元函數(shù)與運(yùn)算符重載_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、1 1第第9章章 友元函數(shù)與運(yùn)算符重載友元函數(shù)與運(yùn)算符重載 2 29.1 友元函數(shù)友元函數(shù)9.2 運(yùn)算符重載概述運(yùn)算符重載概述 9.3 一元運(yùn)算符重載一元運(yùn)算符重載9.4 二元運(yùn)算符重載二元運(yùn)算符重載3 39.1 友元函數(shù)友元函數(shù)v為了強(qiáng)調(diào)類的數(shù)據(jù)封裝性,常將一些關(guān)鍵成員設(shè)為私有訪問為了強(qiáng)調(diào)類的數(shù)據(jù)封裝性,常將一些關(guān)鍵成員設(shè)為私有訪問特性特性-為什么引入友元?為什么引入友元?v友元可以是一個函數(shù),該函數(shù)被稱為友元可以是一個函數(shù),該函數(shù)被稱為友元函數(shù)友元函數(shù);友元可以是;友元可以是一個類,該類被稱為一個類,該類被稱為友元類友元類。v友元函數(shù)是一種普通函數(shù),不是類的成員函數(shù),說明時在函友元函數(shù)是一

2、種普通函數(shù),不是類的成員函數(shù),說明時在函數(shù)前面加以關(guān)鍵字?jǐn)?shù)前面加以關(guān)鍵字friend,它可以象成員函數(shù)一樣不受限制,它可以象成員函數(shù)一樣不受限制地訪問該類的任何成員。地訪問該類的任何成員。 4 4友元函數(shù)的定義格式:友元函數(shù)的定義格式:(1)類中定義)類中定義friend 類型類型 函數(shù)名(函數(shù)名( 形參形參 ) 函數(shù)體函數(shù)體 (2)類中說明,類外定義)類中說明,類外定義類中原型說明:類中原型說明:friend 類型類型 函數(shù)名(形參);函數(shù)名(形參);類外定義:類外定義:類型類型 函數(shù)名(形參)函數(shù)名(形參) 函數(shù)體函數(shù)體 5【例例9-1】求圓柱體的體積。求圓柱體的體積。 #includec

3、onst float PI=3.1415 ;class A float r,h; public: A(float a,float b)r=a;h=b; friend float v1(A &); /友元函數(shù)友元函數(shù)v1的原型說明的原型說明float v2( ) return PI*r*r*h; /定義成員函數(shù)定義成員函數(shù)v2float getr()return r; float geth()return h;友元函數(shù)的形參為友元函數(shù)的形參為類的對象的引用類的對象的引用6float v1(A &a) /友元函數(shù)友元函數(shù)v2在類體外的定義在類體外的定義 return PI*a.r*

4、a.r*a.h;float v3(A b) /全局函數(shù)全局函數(shù) return PI*b.getr()*b.getr()*b.geth();void main() A a1(25,40);A a2(25,40); coutv1(a1)“n”; /調(diào)用友元函數(shù)調(diào)用友元函數(shù)v1cout a2.v2( )“n”; /調(diào)用成員函數(shù)調(diào)用成員函數(shù)v2cout”。13(3)不能用成員函數(shù)重載的運(yùn)算符)不能用成員函數(shù)重載的運(yùn)算符 插入運(yùn)算符插入運(yùn)算符“”。(4)運(yùn)算符重載不能改變運(yùn)算符的優(yōu)先級、操作數(shù))運(yùn)算符重載不能改變運(yùn)算符的優(yōu)先級、操作數(shù) 的個數(shù)和結(jié)合性等基本性質(zhì)。的個數(shù)和結(jié)合性等基本性質(zhì)。(5)重載運(yùn)算符

5、限制在)重載運(yùn)算符限制在C+中已有的運(yùn)算符范圍內(nèi),中已有的運(yùn)算符范圍內(nèi), 不能創(chuàng)建新的運(yùn)算符。不能創(chuàng)建新的運(yùn)算符。14【例例9-2】負(fù)號運(yùn)算符重載。負(fù)號運(yùn)算符重載。#include class Com float real,image; public: Com(float r=0,float i=0) real=r; image=i; Com operator-( ); void print() coutreal=realnimage=imageendl; ;15Com Com:operator-() Com t; t.real=-real; /At.image=-image; /B retu

6、rn t;void main() Com c1(25,50),c2; c2=-c1; /編譯器解釋為編譯器解釋為c1.operator-();c1.print();c2.print();169.3 一元運(yùn)算符重載一元運(yùn)算符重載 C+中允許重載的一元運(yùn)算符有中允許重載的一元運(yùn)算符有: 自增運(yùn)算符自增運(yùn)算符“+”、自減運(yùn)算符、自減運(yùn)算符“-”、 負(fù)號運(yùn)算符負(fù)號運(yùn)算符“-”、邏輯非運(yùn)算符、邏輯非運(yùn)算符“!”等。等。 179.3.1 用成員函數(shù)重載一元運(yùn)算符用成員函數(shù)重載一元運(yùn)算符用成員函數(shù)重載用成員函數(shù)重載“+”運(yùn)算符的格式為:運(yùn)算符的格式為:(1)+為前綴形式為前綴形式函數(shù)類型函數(shù)類型 opera

7、tor+(void) 函數(shù)體函數(shù)體(2)+為后綴形式為后綴形式函數(shù)類型函數(shù)類型 operator+(int) 函數(shù)體函數(shù)體 重載自減運(yùn)算符重載自減運(yùn)算符“-”的格式與重載的格式與重載“+”運(yùn)算符類似。運(yùn)算符類似。 18【例例9-3】自增運(yùn)算符的重載。自增運(yùn)算符的重載。#include class Aint m,n;public:A(int x=0,int y=0) m=x; n=y; A operator+( )/成員函數(shù)重載前置成員函數(shù)重載前置+,類中定義,類中定義+m; +n; /Areturn *this; /B A operator+(int);/成員函數(shù)重載后置成員函數(shù)重載后置+,類

8、中說明,類外定義,類中說明,類外定義void print( ) coutm=mtn=nn; ; 19A A:operator+(int) A t=*this; /C+m; +n; /也可以調(diào)用已定義的前置也可以調(diào)用已定義的前置+重載函數(shù),寫成重載函數(shù),寫成+(*this);return t;void main( )A a1(1,2),a2(10,20),a3,a4;a3=+a1;/Da4=a2+;couta1:t;a1.print( );couta3:t;a3.print( );couta2:t;a2.print( );couta4:t;a4.print( );編譯器解釋為編譯器解釋為a1.o

9、perator+(); 程序解讀:程序解讀: 前置和后置的實(shí)現(xiàn)方法:前置和后置的實(shí)現(xiàn)方法:v通過函數(shù)的重載區(qū)別,后置通過函數(shù)的重載區(qū)別,后置增加一個整型參數(shù)。增加一個整型參數(shù)。v前置時,數(shù)據(jù)成員直接自增前置時,數(shù)據(jù)成員直接自增或自減,然后返回變化后的對或自減,然后返回變化后的對象;后置時,先保存自增或自象;后置時,先保存自增或自減前的對象,然后再進(jìn)行自增減前的對象,然后再進(jìn)行自增或自減,最后返回變化前的對或自減,最后返回變化前的對象。象。v為了區(qū)別自增和自減運(yùn)算符為了區(qū)別自增和自減運(yùn)算符的前置和后置,在重載后置運(yùn)的前置和后置,在重載后置運(yùn)算符時,增加一個形式參數(shù)算符時,增加一個形式參數(shù)“int

10、”,由于該參數(shù)無論是在,由于該參數(shù)無論是在重載函數(shù)的定義中,還是在重重載函數(shù)的定義中,還是在重載函數(shù)的調(diào)用中均不涉及,所載函數(shù)的調(diào)用中均不涉及,所以可以只列出其類型而不給出以可以只列出其類型而不給出名稱。名稱。209.3.2 用友元函數(shù)重載一元運(yùn)算符用友元函數(shù)重載一元運(yùn)算符 用友元函數(shù)重載運(yùn)算符,其函數(shù)名仍然是關(guān)鍵字用友元函數(shù)重載運(yùn)算符,其函數(shù)名仍然是關(guān)鍵字operator加上所要重載的運(yùn)算符。重載一元運(yùn)算符時,由于友元函數(shù)加上所要重載的運(yùn)算符。重載一元運(yùn)算符時,由于友元函數(shù)不同于成員函數(shù),沒有不同于成員函數(shù),沒有this指針,所以重載函數(shù)用一個對象指針,所以重載函數(shù)用一個對象作為形參,通過實(shí)

11、參和形參的結(jié)合,完成對對象的操作。作為形參,通過實(shí)參和形參的結(jié)合,完成對對象的操作。 21【例例9-4】自減運(yùn)算符的重載。自減運(yùn)算符的重載。#include class Aint m,n;public:A(int x=0,int y=0) m=x; n=y; friend A operator-(A &t)/友元函數(shù)重載前置友元函數(shù)重載前置-,類中定義,類中定義 -t.m; -t.n; return t; friend A operator-(A &t, int); )/友元函數(shù)重載后置友元函數(shù)重載后置-,類中說明,類中說明void print( ) coutm=mtn=nn;

12、 ; 22A operator-(A &t,int)A temp=t; /A-t.m; -t.n; /Breturn temp;void main( )A a1(1,2),a2(10,20),a3,a4;a3=-a1;/Ca4=a2-;couta1:t;a1.print( );couta3:t;a3.print( );couta2:t;a2.print( );couta4:t;a4.print( );編譯器解釋為編譯器解釋為operator-(a1);23v用成員函數(shù)重載一元運(yùn)算符時,因?yàn)橛贸蓡T函數(shù)重載一元運(yùn)算符時,因?yàn)閠his指針的存在指針的存在,重載函數(shù)的參數(shù)個數(shù)為,重載函數(shù)的參數(shù)

13、個數(shù)為0。當(dāng)前哪個對象調(diào)用該運(yùn)算。當(dāng)前哪個對象調(diào)用該運(yùn)算符重載函數(shù),就是對該對象的操作。符重載函數(shù),就是對該對象的操作。v用友元函數(shù)重載一元運(yùn)算符時,由于友元函數(shù)沒有用友元函數(shù)重載一元運(yùn)算符時,由于友元函數(shù)沒有this指針,重載函數(shù)的參數(shù)個數(shù)為指針,重載函數(shù)的參數(shù)個數(shù)為1。被操作的對象作。被操作的對象作為實(shí)參傳遞給重載函數(shù)的形參。形參一般為對象或?qū)閷?shí)參傳遞給重載函數(shù)的形參。形參一般為對象或?qū)ο蟮囊谩O蟮囊谩?49.4 二元運(yùn)算符重載二元運(yùn)算符重載 C+中允許重載的二元運(yùn)算符有:中允許重載的二元運(yùn)算符有: 賦值運(yùn)算符、復(fù)合的賦值運(yùn)算符、賦值運(yùn)算符、復(fù)合的賦值運(yùn)算符、 關(guān)系運(yùn)算符、邏輯運(yùn)算符

14、等。關(guān)系運(yùn)算符、邏輯運(yùn)算符等。 259.4.1 用成員函數(shù)重載二元運(yùn)算符用成員函數(shù)重載二元運(yùn)算符 用成員函數(shù)重載二元運(yùn)算符時,運(yùn)算符的左操用成員函數(shù)重載二元運(yùn)算符時,運(yùn)算符的左操作數(shù)一定是對象,因?yàn)橐獙⑵渥鳛楫?dāng)前對象,調(diào)用作數(shù)一定是對象,因?yàn)橐獙⑵渥鳛楫?dāng)前對象,調(diào)用重載函數(shù)。右操作數(shù)作為重載函數(shù)的實(shí)參,可以是重載函數(shù)。右操作數(shù)作為重載函數(shù)的實(shí)參,可以是對象、對象的引用,也可以是其它數(shù)據(jù)類型,如整對象、對象的引用,也可以是其它數(shù)據(jù)類型,如整型、實(shí)型。成員函數(shù)重載二元運(yùn)算符,重載函數(shù)的型、實(shí)型。成員函數(shù)重載二元運(yùn)算符,重載函數(shù)的參數(shù)個數(shù)為參數(shù)個數(shù)為1個。個。26【例例9-6】加法運(yùn)算符和復(fù)合的賦值

15、運(yùn)算符的重載。加法運(yùn)算符和復(fù)合的賦值運(yùn)算符的重載。#include class Aint a,b,c;public:A(int x=0,int y=0,int z=0) a=x; b=y; c=z; A operator+(A t) A temp=*this; /Atemp.a+=t.a; temp.b+=t.b; temp.c+=t.c; return temp; /B27A operator+(int); void operator+=(A t) a+=t.a;b+=t.b; c+=t.c; void print( ) coutatb; couttcn; ; A A:operator+(i

16、nt s) A temp=*this;temp.a+=s; temp.b=b; temp.c=c; return temp;void main( )A a1(1,2,3),a2(4,5,6),a3,a4;a3=a1+a2; a4=a2+100; a1+=a3; a3.print( );a4.print( );a1.print( );編譯器解釋為編譯器解釋為a1.operator+(a2); 編譯器解釋為編譯器解釋為a2.operator+(100); 289.4.2 用友元函數(shù)重載二元運(yùn)算符用友元函數(shù)重載二元運(yùn)算符 用友元函數(shù)重載二元運(yùn)算符時,重載函數(shù)的參數(shù)用友元函數(shù)重載二元運(yùn)算符時,重載函數(shù)

17、的參數(shù) 個數(shù)為個數(shù)為2,運(yùn)算符的兩個操作數(shù)都作為函數(shù)的實(shí)參。,運(yùn)算符的兩個操作數(shù)都作為函數(shù)的實(shí)參。 其中一個操作數(shù)是對象或?qū)ο蟮囊?。其中一個操作數(shù)是對象或?qū)ο蟮囊谩?9【例例9-8】加法運(yùn)算符和復(fù)合的賦值運(yùn)算符的重載。加法運(yùn)算符和復(fù)合的賦值運(yùn)算符的重載。#include class A int a,b,c; public: A(int x=0 , int y=0 , int z=0) a=x; b=y; c=z; friend void operator+=(A &t1, A t2); friend A operator+(A t1 , A t2 ); void print( )

18、coutatbt; coutcn; ; 30void operator+=(A &t1 , A t2) t1.a+=t2.a; t1.b+=t2.b; t1.c+=t2.c; A operator+(A t1 , A t2 ) A t; t.a=t1.a+t2.a; t.b=t1.b+t2.b; t.c=t1.c+t2.c; return t; void main( ) A a1 , a2(1,2,3) , a3; a1.print( ); a3=a1+a2; a3.print( ); a3+=a2; a3.print( ); 編譯器解釋為編譯器解釋為operator+(a1,a2); 編譯器解釋為編譯器解釋為operator+=(a3,a2);31練習(xí)練習(xí)1:下面關(guān)于運(yùn)算符重載的描述錯誤的是(下面關(guān)于運(yùn)算符重載的描述錯誤的是( )。)。A. 運(yùn)算符重載不能改變操作數(shù)的個數(shù)、運(yùn)算符的優(yōu)先級、結(jié)合運(yùn)算符重載不能改變操作數(shù)的個數(shù)、運(yùn)算符的優(yōu)先級、結(jié)合性和運(yùn)算符的語法結(jié)構(gòu)性和運(yùn)算符的語法結(jié)構(gòu)B. 不是所有的運(yùn)算符都可以進(jìn)行重載不是所有的運(yùn)算符都可以進(jìn)行重載C. 運(yùn)

溫馨提示

  • 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

提交評論