3C++面向?qū)ο蟪绦蛟O(shè)計(jì)_第1頁(yè)
3C++面向?qū)ο蟪绦蛟O(shè)計(jì)_第2頁(yè)
3C++面向?qū)ο蟪绦蛟O(shè)計(jì)_第3頁(yè)
3C++面向?qū)ο蟪绦蛟O(shè)計(jì)_第4頁(yè)
3C++面向?qū)ο蟪绦蛟O(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩99頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、Visual C+面向?qū)ο缶幊陶Z(yǔ)言第三章 C+面向?qū)ο蟪绦蛟O(shè)計(jì)第三章 C+面向?qū)ο蟪绦蛟O(shè)計(jì)3.1 面向?qū)ο蟪绦蛟O(shè)計(jì)概述3.1.1 傳統(tǒng)的結(jié)構(gòu)化程序設(shè)計(jì)3.1.2 面向?qū)ο蟪绦蛟O(shè)計(jì)方法及特征3.2 C+類3.2.1 類的定義與實(shí)現(xiàn)3.2.2 構(gòu)造函數(shù)和析構(gòu)函數(shù)3.2.3 this指針3.2.4 靜態(tài)成員3.2.5 友元3.3 類的繼承3.3.1 基類和派生類3.3.2 基類和派生類的構(gòu)造函數(shù)3.3.3 多重繼承3.3.4 虛基類3.4 多態(tài)性和虛函數(shù)3.4.1 用基類指針指向派生類對(duì)象3.4.2 虛函數(shù)3.4.3 抽象類和純虛函數(shù)3.5 重載3.5.1 函數(shù)重載3.5.2 運(yùn)算符重載3.6 C+

2、模板3.6.1 函數(shù)模板3.6.2 類模板3.7 Microsoft Visual C+的語(yǔ)法擴(kuò)充3.7.1 Visual C+自定義數(shù)據(jù)類型3.7.2 Visual C+運(yùn)行庫(kù)3.7.3 運(yùn)行時(shí)類型識(shí)別3.7.4 編程規(guī)范結(jié)構(gòu)化程序設(shè)計(jì):將系統(tǒng)分解為若干模塊(即函數(shù));缺點(diǎn):維護(hù)困難,特別是數(shù)據(jù)結(jié)構(gòu)的修改;3.1.1 傳統(tǒng)的結(jié)構(gòu)化程序設(shè)計(jì)3.1.2 面向?qū)ο蟪绦蛟O(shè)計(jì)方法及特征對(duì)象數(shù)據(jù)作用于這些數(shù)據(jù)上的操作;類是具有相同數(shù)據(jù)結(jié)構(gòu)和相同操作功能的對(duì)象的集合,對(duì)象是類的實(shí)例;對(duì)象與類的關(guān)系類似于鞋和生產(chǎn)鞋的模具;面向?qū)ο蟪绦蛟O(shè)計(jì)把一個(gè)復(fù)雜的問(wèn)題分解為多個(gè)能完成獨(dú)立功能的對(duì)象,分開(kāi)獨(dú)立設(shè)計(jì),再將其整

3、合完成復(fù)雜問(wèn)題;其理想目標(biāo)是希望編寫(xiě)程序就像搭積木;面向過(guò)程和面向?qū)ο蟮膮^(qū)別 面向過(guò)程就是分析出解決問(wèn)題所需要的步驟,然后用函數(shù)把這些步驟一步一步實(shí)現(xiàn),使用的時(shí)候一個(gè)一個(gè)依次調(diào)用就可以了。面向?qū)ο笫前褬?gòu)成問(wèn)題事務(wù)分解成各個(gè)對(duì)象,建立對(duì)象的目的不是為了完成一個(gè)步驟,而是為了描敘某個(gè)事物在整個(gè)解決問(wèn)題的步驟中的行為。 例如五子棋,面向過(guò)程的設(shè)計(jì)思路就是首先分析問(wèn)題的步驟: 1、開(kāi)始游戲,2、黑子先走,3、繪制畫(huà)面,4、判斷輸贏,5、輪到白子,6、繪制畫(huà)面,7、判斷輸贏,8、返回步驟2,9、輸出最后結(jié)果。 把上面每個(gè)步驟用分別的函數(shù)來(lái)實(shí)現(xiàn),問(wèn)題就解決了。而面向?qū)ο蟮脑O(shè)計(jì)則是從另外的思路來(lái)解決問(wèn)題。整

4、個(gè)五子棋可以分為: 1、黑白雙方,這兩方的行為是一模一樣的,2、棋盤(pán)系統(tǒng),負(fù)責(zé)繪制畫(huà)面,3、規(guī)則系統(tǒng),負(fù)責(zé)判定諸如犯規(guī)、輸贏等。 第一類對(duì)象(玩家對(duì)象)負(fù)責(zé)接受用戶輸入,并告知第二類對(duì)象(棋盤(pán)對(duì)象)棋子布局的變化,棋盤(pán)對(duì)象接收到了棋子的變化就要負(fù)責(zé)在屏幕上面顯示出這種變化,同時(shí)利用第三類對(duì)象(規(guī)則系統(tǒng))來(lái)對(duì)棋局進(jìn)行判定??梢悦黠@地看出,面向?qū)ο笫且怨δ軄?lái)劃分問(wèn)題,而不是步驟。同樣是繪制棋局,這樣的行為在面向過(guò)程的設(shè)計(jì)中分散在了總多步驟中,很可能出現(xiàn)不同的繪制版本,因?yàn)橥ǔTO(shè)計(jì)人員會(huì)考慮到實(shí)際情況進(jìn)行各種各樣的簡(jiǎn)化。而面向?qū)ο蟮脑O(shè)計(jì)中,繪圖只可能在棋盤(pán)對(duì)象中出現(xiàn),從而保證了繪圖的統(tǒng)一。功能上的統(tǒng)

5、一保證了面向?qū)ο笤O(shè)計(jì)的可擴(kuò)展性。比如我要加入悔棋的功能,如果要改動(dòng)面向過(guò)程的設(shè)計(jì),那么從輸入到判斷到顯示這一連串的步驟都要改動(dòng),甚至步驟之間的循序都要進(jìn)行大規(guī)模調(diào)整。如果是面向?qū)ο蟮脑挘挥酶膭?dòng)棋盤(pán)對(duì)象就行了,棋盤(pán)系統(tǒng)保存了黑白雙方的棋譜,簡(jiǎn)單回溯就可以了,而顯示和規(guī)則判斷則不用顧及,同時(shí)整個(gè)對(duì)對(duì)象功能的調(diào)用順序都沒(méi)有變化,改動(dòng)只是局部的。在類的定義中,數(shù)據(jù)稱為成員變量,函數(shù)稱為方法;成員變量按訪問(wèn)控制權(quán)限分為公有和私有;定義的格式:class private: public: protected:3.2.1 類的定義與實(shí)現(xiàn)private屬性的成員只允許被本類的成員函數(shù)訪問(wèn)和調(diào)用;protec

6、ted屬性的成員允許被本類的成員函數(shù)和派生類的成員函數(shù)訪問(wèn)和調(diào)用;例:Time類的定義class Time private: int hour; int minute; int second; public: void setTime( int, int, int ); void showTime();為什么需要這兩個(gè)函數(shù)?對(duì)于成員函數(shù)來(lái)講,成員變量就像全局變量;類的定義和一般函數(shù)定義類似,但必須在成員函數(shù)名前加類名和作用域限定符(:)Time類的實(shí)現(xiàn)(定義)void Time:setTime(int h,int m,int s) hour=(h=0&h=0&m=0&s60)?s:0;void

7、 Time:showTime()couthour:minute:secondendl;對(duì)象的聲明:就像變量的聲明(用模具生產(chǎn)一個(gè)產(chǎn)品);格式: ;例:Time t1,today; Time *pt1=&t1;比較 int i;成員函數(shù)的調(diào)用:t1.setTime(1,2,3);today.showTime();pt1-setTime(1,2,3);思考:t1.hour=10;在面向?qū)ο蟪绦蛟O(shè)計(jì)中,程序設(shè)計(jì)范型變成了:確定你需要哪些類型,為每個(gè)類型提供完整的一組操作。思考:如果對(duì)于Time類,在未調(diào)用setTime前調(diào)用showTime會(huì)怎樣?我們需要對(duì)成員變量初始化;構(gòu)造函數(shù)是一種特殊的成員函

8、數(shù),函數(shù)名和類名相同,提供了對(duì)成員變量初始化的方法,使得聲明對(duì)象時(shí)自動(dòng)初始化對(duì)象,當(dāng)聲明對(duì)象時(shí),自動(dòng)調(diào)用構(gòu)造函數(shù);析構(gòu)函數(shù)也是成員函數(shù),用來(lái)在系統(tǒng)釋放對(duì)象前做一些清理工作,當(dāng)對(duì)象注銷時(shí),自動(dòng)調(diào)用析構(gòu)函數(shù);3.2.2 構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)的名稱與類名相同,而析構(gòu)函數(shù)必須在類名前加“”,都沒(méi)有返回值;構(gòu)造函數(shù)可以有參數(shù),析構(gòu)函數(shù)沒(méi)有參數(shù);系統(tǒng)有默認(rèn)的構(gòu)造函數(shù)和析構(gòu)函數(shù);可以有多個(gè)構(gòu)造函數(shù)(參數(shù)類型不同),使得創(chuàng)建的對(duì)象根據(jù)數(shù)據(jù)類型的不同(整型和實(shí)型)進(jìn)行不同的處理,這就是函數(shù)重載;public:Time(int,int,int);Time();Time:Time(int h,int m,in

9、t s) hour=h; minute=m; second=s;Time:Time()例Void main(void) Time t1(10,20,30); /調(diào)用構(gòu)造函數(shù) /調(diào)用析構(gòu)函數(shù)理解面向?qū)ο笤O(shè)計(jì)的思想例:計(jì)算一個(gè)矩形的面積和周長(zhǎng)計(jì)算一個(gè)矩形的面積和周長(zhǎng)從面向過(guò)程的角度出發(fā)思考這個(gè)問(wèn)題;先確定面積和周長(zhǎng)的算法(這個(gè)很簡(jiǎn)單,小學(xué)知識(shí)) 編寫(xiě)2個(gè)方法分別計(jì)算面積和周長(zhǎng),在一個(gè)類里面 考慮到計(jì)算周長(zhǎng)和面積需要至少2個(gè)參數(shù),長(zhǎng)和寬;程序如下:int perimeter (int length, int width)return 2*(length + width);int area (int

10、length, int width)return length*width;void main()coutperimeter(4,5);cout“n”coutarea (4,5);下面再?gòu)拿嫦驅(qū)ο蟮慕嵌瘸霭l(fā),重新考慮這個(gè)問(wèn)題:一個(gè)長(zhǎng)方形可以看成一個(gè)長(zhǎng)方形對(duì)象。既然是對(duì)象,那么它就有屬性(長(zhǎng)和寬)和行為(周長(zhǎng)和面積) 抽取長(zhǎng)方形的共性,設(shè)計(jì)一個(gè)類 通過(guò)對(duì)象的行為,就可以求出某個(gè)具體的長(zhǎng)方形對(duì)象的周長(zhǎng)和面積class Rectangle()public:int length, width;int perimeter() return 2*(length+width);int area() retu

11、rn length*width; void main()Rectangle rect1=new Rectangle();rect1.length=10;rect1.width=5;coutrect1.perimeter();coutrect1.area();在C方案中擴(kuò)展困難,原因就在于沒(méi)有一個(gè)合適的位置來(lái)存儲(chǔ)輔助的狀態(tài)信息,因?yàn)樵谠瓉?lái)的情況下根本不需要狀態(tài)信息;對(duì)象提供了一個(gè)理想的位置來(lái)放置狀態(tài)信息,并且作為對(duì)象的一部分是顯示可用的,而不是隱藏在幕后的東西;繼續(xù)思考面向?qū)ο蟮奶攸c(diǎn)在面向過(guò)程的思想里,一個(gè)程序一般都是由一個(gè)個(gè)函數(shù)組成的,這些函數(shù)之間相互調(diào)用, 就形成了一個(gè)完整的程序,解決了一個(gè)

12、問(wèn)題。它的基本結(jié)構(gòu)是: 函數(shù)一() ; 函數(shù)二() ; 主函數(shù)() ; 在面向?qū)ο蟮乃枷胫?,是把這些都封裝起來(lái),形成一個(gè)類。class 類名 函數(shù)一() ; 函數(shù)二() ; 然后由這個(gè)類產(chǎn)生一個(gè)對(duì)象,比如:我們把一個(gè)類的類名起為 student 那么產(chǎn)生對(duì)象的方法就是: student s1; 這里s1是一個(gè)對(duì)象,產(chǎn)生了這個(gè)對(duì)象以后,才可以進(jìn)行相關(guān)操作。 操作方法如: s1.函數(shù)一(); 假設(shè)我們要做一個(gè)小游戲,類似于網(wǎng)游里面的打怪,為簡(jiǎn)單起見(jiàn),認(rèn)為怪不打人,只讓人打,他的血不斷減少,直到死亡。 把所有怪物的共同特征抽象出來(lái),于是我們得到一個(gè)類:怪物 class 怪物 char 怪物名; in

13、t 血;怪物:怪物(怪物名n,血n) /*構(gòu)造函數(shù)*/ 怪物名=怪物名n; 血=血n; 怪物:被打函數(shù)() 血減少; 怪物:判斷函數(shù)() if (血=0) cout 0) 被打函數(shù)(); 判斷函數(shù)(); main主函數(shù) void main() /*產(chǎn)生對(duì)象*/ 怪物 怪物1(狼,5000); 怪物 怪物2(虎,8000); 怪物 怪物3(蛇,3000); 怪物1.玩游戲(); 怪物2.玩游戲(); 怪物3.玩游戲(); 指向?qū)ο蟊旧淼闹羔?,作為隱含參數(shù)傳給每個(gè)成員函數(shù);例:void Time:showTime() couthour:minute:secondendl;等同于void Time:

14、showTime(Time *this);couthour:”minute3.2.3 this指針Time:showTime Display(this);Display(Time *pObj)This指針對(duì)于在非本類成員函數(shù)中使用對(duì)象成員變量需要讓多個(gè)對(duì)象共享相同值的成員時(shí)使用;成員變量定義:static int m_ncount;使用和一般成員變量一樣,也有公有、私有之分;初始化必須在類定義的外部:int Person:m_nCount=0;3.2.4 靜態(tài)成員成員函數(shù)也可以是靜態(tài)的;定義static int GetCount();沒(méi)有this指針;可以通過(guò)類調(diào)用:Person:GetCou

15、nt();也可以通過(guò)對(duì)象調(diào)用:e1.GetCount();靜態(tài)成員函數(shù)只能訪問(wèn)類的靜態(tài)成員;如需訪問(wèn)非靜態(tài)成員,需將對(duì)象作為參數(shù)傳入;long Person:GetID(Person x);3.2.5 友元友元函數(shù):訪問(wèn)其他類的私有成員變量的函數(shù);一個(gè)類可以聲明一個(gè)函數(shù)為其友元函數(shù);作用:編程方便;定義: class A friend void display(A); private: int a; void display(A e) coute.avoid main() display(a1);class B public: void fun1(A&) class A friend void

16、 B:fun1(A&); private: int a;void B:fun1(A& e) e.a=10; 一個(gè)類的成員函數(shù)作為另一個(gè)類的友元函數(shù)void main() A a1; B b1; b1.fun1(a1); 友元類:類A可以聲明類B為其友元類,類B的所有成員函數(shù)都可以訪問(wèn)A的所有成員;定義class C public: void fun2(A&); class A friend C; private: int a;void C:fun2(A& e) e.a=10;void main() A a1; C c1; c1.fun2(a1);class B public: void fun

17、1(A&);void B:fun1(A& e) e.a=10;void main() A a1; B b1; b1.fun1(a1);void B:fun1(A e) e.a=10; void main() A a1; B b1; b1.fun1(a1); class B public: void fun1(A) class B public: void fun1(A&);void B:fun1(A& e) e.a=10;void main() A a1; B b1; b1.fun1(a1);a1.ae.avoid B:fun1(A e) e.a=10; void main() A a1; B

18、 b1; b1.fun1(a1); class B public: void fun1(A) a1.ae.a3.3 類的繼承實(shí)現(xiàn)代碼重用和擴(kuò)充;拷貝代碼受到版權(quán)的各方面因素影響;3.3.1 基類和派生類在繼承關(guān)系中,新定義的類稱為被繼承類的派生類或子類,被繼承的類稱為新定義類的基類或父類;格式:class : ;派生方式:public、private和protected(默認(rèn)為private);無(wú)論何種派生方式,基類的私有成員都不能在派生類中使用;例class A private: int a; public: int Geta()return a;class B:public A void

19、main() B b1; b1.Geta(); b1.a:=3;class B private: int a; public: int Geta()return a; 思考:如果不采用繼承定義B類?class B:public A public派生:基類成員訪問(wèn)權(quán)限不變,可以通過(guò)派生類對(duì)象訪問(wèn)基類公有成員;private派生:基類所有成員成為私有成員,只能通過(guò)派生類的成員函數(shù)訪問(wèn)基類非私有成員;protected派生:和private差不多;例class A private: int a; public: int Geta()return a;class B: A void main() B

20、b1; b1.Geta();/非法基類中不適合派生類的成員可以在派生類中重新定義,稱為覆蓋(override);在派生類中定義與基類成員函數(shù)名稱和參數(shù)表相同的函數(shù);例class A public: void show();class B:public A public: void show();B b1;b1.show();若需要在派生類中調(diào)用基類中同名的成員函數(shù),可以使用作用域限定符“:”;class B:public A public: void show(); void display()A:show();B b1;b1.show();b1.display();3.3.2 基類和派生類的

21、構(gòu)造函數(shù)當(dāng)程序創(chuàng)建一個(gè)派生類對(duì)象時(shí),系統(tǒng)首先自動(dòng)創(chuàng)建一個(gè)基類對(duì)象,即在調(diào)用派生類的構(gòu)造函數(shù)構(gòu)建派生類對(duì)象時(shí),系統(tǒng)首先調(diào)用基類的構(gòu)造函數(shù)構(gòu)建基類對(duì)象;當(dāng)派生類對(duì)象的生存期結(jié)束時(shí),首先調(diào)用派生類的析構(gòu)對(duì)象,然后調(diào)用基類的析構(gòu)函數(shù);派生類中必須顯示調(diào)用基類的構(gòu)造函數(shù),除非基類有默認(rèn)的構(gòu)造函數(shù);例:B:B():A() 形參時(shí)指明派生類構(gòu)造函數(shù)形參的名稱和類型,參數(shù)表時(shí)形參說(shuō)明中所給出的部分參數(shù),是要傳遞給基類構(gòu)造函數(shù)的參數(shù);Point(int a,int b)Circle(int a,int b,int r):Point(a,b)Cylinder(int a,int b,int r,int h):Ci

22、rcle(a,b,r)3.3.3 多重繼承單繼承:每個(gè)派生類只有一個(gè)直接基類;多重繼承:一個(gè)派生類可以同時(shí)從多個(gè)基類派生而來(lái);格式:class :,;P86 例3-11 GetAB() return a+b; 3.3.4 虛基類解決二義性問(wèn)題;每個(gè)派生類對(duì)象含有基類的數(shù)據(jù)成員的一個(gè)副本,因此派生類對(duì)象可能存在間接基類的兩份副本。采用虛基類解決;格式(派生類定義)class B:public virtual A基類定義不變;3.4 多態(tài)性和虛函數(shù)多態(tài)性:根據(jù)數(shù)據(jù)不同進(jìn)行不同的運(yùn)算處理,如加法,對(duì)于實(shí)數(shù)或整數(shù)就是將兩數(shù)相加,對(duì)于復(fù)數(shù)就是將對(duì)應(yīng)的實(shí)部和虛部相加;“一種接口、多種方法”;多態(tài)性分為編譯

23、時(shí)多態(tài)性和運(yùn)行時(shí)多態(tài)性;編譯時(shí)多態(tài)性又稱靜態(tài)多態(tài)性,用來(lái)處理函數(shù)名相同,但參數(shù)類型不同的情況,通過(guò)重載機(jī)制來(lái)實(shí)現(xiàn);運(yùn)行時(shí)多態(tài)性:處理函數(shù)名、參數(shù)和返回值都相同的情況,通過(guò)虛函數(shù)機(jī)制實(shí)現(xiàn);派生類的對(duì)象也可以認(rèn)為是其基類的對(duì)象,但基類的對(duì)象不是其派生類的對(duì)象;(兒子像老爸)允許基類對(duì)象的指針指向其派生類的對(duì)象,通過(guò)該指針只能訪問(wèn)派生類中從基類繼承的公有成員;(老爸的東西也是兒子的東西,老爸只能拿老爸自己的東西)可以通過(guò)強(qiáng)制類型轉(zhuǎn)換將基類指針和派生類指針互相轉(zhuǎn)換;3.4.1 用基類指針指向派生類對(duì)象例:class B:public A void setB()A a,*pa;B b,*pb;pa=&b

24、; /基類指針指向派生類對(duì)象pb=(B *)pa; /強(qiáng)制類型轉(zhuǎn)換pa-setB(); /通過(guò)基類指針訪問(wèn)派生類自定義的成員pb=&a /派生類指針指向基類對(duì)象pa=&a;pb=(B*)pa;pb-setB(); /對(duì)象a中不存在setB() 3.4.2 虛函數(shù)派生類成員函數(shù)和基類成員函數(shù)具有相同的函數(shù)名和參數(shù)類型,派生類的成員函數(shù)將覆蓋基類成員函數(shù);例:class A void show()class B:public A void show() B b;b.show();若用基類指針指向派生類對(duì)象,結(jié)果一樣;A *pa;B b;pa=&b;pa-show(); 在基類對(duì)象中使用虛函數(shù),可以

25、使指向派生類對(duì)象的基類指針調(diào)用派生類中的覆蓋函數(shù)(和基類對(duì)象成員函數(shù)同名);派生類對(duì)象的覆蓋函數(shù)各不相同,但基類對(duì)象的虛函數(shù)機(jī)制,使我們可以通過(guò)指向派生類對(duì)象的基類指針調(diào)用同個(gè)函數(shù)名,實(shí)現(xiàn)不同派生類對(duì)象的不同功能,這就是類的多態(tài)性;格式:class A public : virtual void show();class B:public A public: void show();void mainA *pa;B b;pa=&b;pa-show();利用虛函數(shù)機(jī)制,我們可以在基類和派生類中使用相同的函數(shù)名和參數(shù)類型,而定義不同的操作;為同一個(gè)類體系中所有派生類的同一類行為提供了統(tǒng)一的接口;C

26、Shape.showCCircle.showCSquare.showCEllipse.show如果用new運(yùn)算創(chuàng)建派生類對(duì)象;當(dāng)delete運(yùn)算撤銷派生類對(duì)象時(shí),只調(diào)用基類的析構(gòu)函數(shù),沒(méi)有調(diào)用派生類的析構(gòu)函數(shù);定義基類的析構(gòu)函數(shù)為虛函數(shù)可解決問(wèn)題;格式:class A virtual A();class B:public A B(); void main() A *pa=new B; delete pa;開(kāi)發(fā)程序中,常將基類中功能容易變化的成員函數(shù)設(shè)計(jì)成虛函數(shù),然后根據(jù)需要設(shè)計(jì)派生類的虛函數(shù),實(shí)現(xiàn)“一種接口、多種方法”;3.4.3 抽象類和純虛函數(shù)我們可以讓基類的一些成員函數(shù)沒(méi)有具體的定義,這

27、種基類只能用于類的繼承,其本身不能用來(lái)創(chuàng)建對(duì)象,這樣的類稱為抽象類;抽象類只能是基類,它提供了一個(gè)框架,僅僅起著統(tǒng)一接口的作用;不能聲明抽象類的對(duì)象,但可以聲明抽象類的指針;抽象類:1、至少有一個(gè)成員函數(shù)不定義具體實(shí)現(xiàn);2、定義了一個(gè)protected訪問(wèn)屬性的構(gòu)造函數(shù)或析構(gòu)函數(shù);不定義具體實(shí)現(xiàn)的成員函數(shù)稱為純虛函數(shù);純虛函數(shù)不能調(diào)用;格式:virtual()=0;例:class A public: virtual void fun1()=0;class B:public A public: void fun1();3.5 重載C+重載分為函數(shù)重載和運(yùn)算符重載;運(yùn)算可以理解為是調(diào)用一個(gè)函數(shù);使

28、用重載機(jī)制可以對(duì)一個(gè)函數(shù)名(或運(yùn)算符)定義多個(gè)函數(shù)(或運(yùn)算),只不過(guò)函數(shù)的參數(shù)(或運(yùn)算的數(shù))類型不同;如加法,對(duì)于實(shí)數(shù)或整數(shù)就是將兩數(shù)相加,對(duì)于復(fù)數(shù)就是將對(duì)應(yīng)的實(shí)部和虛部相加;3.5.1 函數(shù)重載我們可以通過(guò)函數(shù)重載機(jī)制使一組功能相似但函數(shù)參數(shù)類型不同的函數(shù)共用一個(gè)函數(shù)名;C+編譯器根據(jù)參數(shù)類型和個(gè)數(shù)選擇正確的函數(shù);P95例3-18求絕對(duì)值函數(shù)abs()重載;不能利用函數(shù)返回類型的不同進(jìn)行函數(shù)的重載;不能利用引用來(lái)重載;對(duì)于void fun(int&);和void fun(int);fun(i)無(wú)法選擇調(diào)用哪個(gè)函數(shù);利用重載可以設(shè)計(jì)多個(gè)構(gòu)造函數(shù),為對(duì)象提供多種初始化方式;P96例3-19:cl

29、ass Boxpublic: Box(); Box(int,int,int);Box box1;Box Box2(10,15,20);3.5.2 運(yùn)算符重載運(yùn)算符重載指對(duì)于不同數(shù)據(jù)類型的操作數(shù),同一個(gè)運(yùn)算符所代表的運(yùn)算功能可以不同;可以把運(yùn)算符看成調(diào)用運(yùn)算符函數(shù),如10+20看成int +(10,20);重載運(yùn)算符就是編寫(xiě)運(yùn)算符函數(shù);格式 operator();P97例3-20非成員函數(shù)重載運(yùn)算符:class ComplexComplex operator+(Complex c1,Complex c2)void main()complex=complex1+complex2;利用非成員函數(shù)重載

30、雙目運(yùn)算符時(shí),運(yùn)算符函數(shù)的第一個(gè)參數(shù)代表運(yùn)算符左邊的操作數(shù),運(yùn)算符函數(shù)的第二個(gè)參數(shù)代表運(yùn)算符右邊的操作數(shù);Complex operator+(Complex c1,Complex c2)如果運(yùn)算符函數(shù)要求訪問(wèn)一個(gè)類的非公有成員,則運(yùn)算符函數(shù)不能定義為非成員函數(shù),除非將它聲明為該類的友元函數(shù);P98例3-21成員函數(shù)重載運(yùn)算符:class ComplexComplex operator+(Complex); Complex Complex :operator+(Complex other)void main()complex=complex1+complex2;利用成員函數(shù)重載雙目運(yùn)算符時(shí),運(yùn)算

31、符左邊的操作數(shù)就是對(duì)象本身,不能再將它作為運(yùn)算符函數(shù)的參數(shù),因此,這時(shí)運(yùn)算符函數(shù)只需一個(gè)函數(shù)參數(shù);Complex operator+(Complex);同一個(gè)重載運(yùn)算符的參數(shù)個(gè)數(shù)是相同的;用戶不能定義新的運(yùn)算符,只能對(duì)現(xiàn)有的進(jìn)行重載;重載后的優(yōu)先級(jí)和結(jié)合性不變;下列運(yùn)算符不能重載“.”(成員運(yùn)算符)“:”(作用域限定符)“?:”(條件運(yùn)算符)“*”(成員指針選擇符);3.6 C+模板模板:將數(shù)據(jù)類型參數(shù)化的工具;使用模板時(shí)根據(jù)實(shí)參的數(shù)據(jù)類型確定模板參數(shù)的數(shù)據(jù)類型;避免代碼重復(fù)編寫(xiě);3.6.1 函數(shù)模板例:int abs(int val) return val0?-val:val;float abs(float val) return val0?-val:val;為了避免這種代碼的重復(fù)編寫(xiě),C+提供函數(shù)模板;例:template /T是自

溫馨提示

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

評(píng)論

0/150

提交評(píng)論