版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025企業(yè)管理資料范本附件應(yīng)屆畢業(yè)生聘用合同
- 2025年出口合同范本
- 2025國有土地使用權(quán)出讓合同(宗地)
- 挖掘少數(shù)民族醫(yī)藥資源促進(jìn)健康產(chǎn)業(yè)發(fā)展
- 課題申報參考:空間視角下當(dāng)代德國的家國反思及啟示
- 安全知識普及類APP的內(nèi)容策劃與制作研究
- 激發(fā)員工創(chuàng)造力提升企業(yè)競爭力
- 智慧辦公在農(nóng)業(yè)科技園區(qū)的應(yīng)用及趨勢
- 2025年人教五四新版九年級科學(xué)下冊月考試卷含答案
- 2024 四川公務(wù)員考試行測真題(綜合管理崗)
- 四川省成都市武侯區(qū)2023-2024學(xué)年九年級上學(xué)期期末考試化學(xué)試題
- 2024年秋季人教版七年級上冊生物全冊教學(xué)課件(2024年秋季新版教材)
- 環(huán)境衛(wèi)生學(xué)及消毒滅菌效果監(jiān)測
- 2024年共青團(tuán)入團(tuán)積極分子考試題庫(含答案)
- 碎屑巖油藏注水水質(zhì)指標(biāo)及分析方法
- 【S洲際酒店婚禮策劃方案設(shè)計(jì)6800字(論文)】
- 鐵路項(xiàng)目征地拆遷工作體會課件
- 醫(yī)院死亡報告年終分析報告
- 中國教育史(第四版)全套教學(xué)課件
- 2023年11月英語二級筆譯真題及答案(筆譯實(shí)務(wù))
- 上海民辦楊浦實(shí)驗(yàn)學(xué)校初一新生分班(摸底)語文考試模擬試卷(10套試卷帶答案解析)
評論
0/150
提交評論