C語(yǔ)言程序設(shè)計(jì)第五章類和對(duì)象.ppt_第1頁(yè)
C語(yǔ)言程序設(shè)計(jì)第五章類和對(duì)象.ppt_第2頁(yè)
C語(yǔ)言程序設(shè)計(jì)第五章類和對(duì)象.ppt_第3頁(yè)
C語(yǔ)言程序設(shè)計(jì)第五章類和對(duì)象.ppt_第4頁(yè)
C語(yǔ)言程序設(shè)計(jì)第五章類和對(duì)象.ppt_第5頁(yè)
已閱讀5頁(yè),還剩76頁(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、第五章 類和對(duì)象(一),第一節(jié) 類的定義,第五章,一、類的定義: 類:是一種復(fù)雜的數(shù)據(jù)類型,它是將不同類型的 數(shù)據(jù)和與這些數(shù)據(jù)相關(guān)的操作封裝在一起的集合體。 因此,類具有更高的抽象性,類中的數(shù)據(jù)具有隱藏 性,類還具有封裝性。 二、類的定義格式: 類的定義格式包括:說(shuō)明部分和實(shí)現(xiàn)部分。 說(shuō)明部分:說(shuō)明該類中的成員。 實(shí)現(xiàn)部分:對(duì)成員函數(shù)的定義。 成員:包含數(shù)據(jù)成員和成員函數(shù)。 成員函數(shù):是用來(lái)對(duì)數(shù)據(jù)成員進(jìn)行操作的,又稱為 “方法”。,第五章,概括起來(lái)說(shuō),說(shuō)明部分將告訴使用者“干什么”,而 實(shí)現(xiàn)部分是告訴使用者“怎么干”。因此,使用者關(guān)心 的往往是說(shuō)明部分,而實(shí)現(xiàn)部分是一些不必關(guān)心的信 息。 類的

2、一般定義格式: class public: private: ; ,第五章,說(shuō)明: 1、類的成員包含成員函數(shù)和數(shù)據(jù)成員兩部分。從訪問(wèn) 權(quán)限上來(lái)分,類的成員分為: 公有的(public)、私有的 (private)和保護(hù)的(protected)三類。 、關(guān)鍵字public, private 和 protected 被稱為訪問(wèn) 權(quán)限修飾符或訪問(wèn)控制修飾符,用它們來(lái)說(shuō)明類成 員的訪問(wèn)權(quán)限。它們?cè)陬愺w內(nèi)出現(xiàn)的先后順序無(wú)關(guān), 并且允許多次出現(xiàn)。 、公有部分往往是一些操作(即成員函數(shù))。它為用戶 提供接口功能,公有成員可以在程序中引用。 、私有部分通常是一些數(shù)據(jù)成員。這些成員是用來(lái) 描述該類中的對(duì)象的屬性

3、的,是被用來(lái)隱藏的部分,第五章,用戶無(wú)法訪問(wèn)它們,只有成員函數(shù)或經(jīng)特殊說(shuō)明的 函數(shù)才可以引用數(shù)據(jù)成員。 2、 是類定義中的實(shí)現(xiàn)部分,這 部分包含所有在類體內(nèi)說(shuō)明的函數(shù)的定義。如果一 個(gè)成員函數(shù)在類體內(nèi)定義了,實(shí)現(xiàn)部分將不出現(xiàn)。如 果所有的成員函數(shù)都在類體內(nèi)定義,則實(shí)現(xiàn)部分可以 省略。如果成員函數(shù)定義在類體外,則須在成員函數(shù) 頭的前面要加上該函數(shù)所屬類的標(biāo)識(shí),這時(shí)使用作 用域運(yùn)算符 。 作用域運(yùn)算符的使用格式如下: 函數(shù)類型 (),第五章,例1、定義一個(gè)關(guān)于日期的類。 class Tdate public : void SetDate(int y,int m,int d); int ISLeap

4、 Year(); void Print (); private: int year,month,day; ; void TDate SetDate(int y,int m,int d) year=y; month=m;,第五章,day=d; int TDate ISLeapYear() return (year%4=0 如果例中將成員函數(shù)的實(shí)現(xiàn)部分(即函數(shù)定義)都 寫在了類體內(nèi), 那么類的實(shí)現(xiàn)部分就可省略了。因此 關(guān)于日期類的定義還可以寫成如下程序:,第五章,class TDate public: void SetDate(int y,int m,int d) year=y;month=m;d

5、ay=d; int IsLeapYear() return (year%4=0 ;,第五章,例2、定義一個(gè)點(diǎn)類 class TPoint public: void SetPoint(int x, int y); int Xcoord() return X; int Ycoord() return Y; void Move (int xOffset, intyOffset); private: int X,Y; ; void TPoint SetPoint(int x, int y) X=x; Y=y;,第五章, void TPoint:Move(int xOffset, int yOffset

6、) X+=xOffset; Y+=yOffset; 三、定義類時(shí)應(yīng)注意的事項(xiàng): 1、在類體中不允許對(duì)所定義的數(shù)據(jù)成員進(jìn)行初始化。 如前面在日期類的定義中這樣編寫程序:,第五章,class TDate public: private: int year(1998),month(4) ,day(9); ; 這里,對(duì)數(shù)據(jù)成員year, month 和 day 進(jìn)行初始化 是錯(cuò)誤的。 2、類中的數(shù)據(jù)成員的類型可以是任意的,包含整型、 浮點(diǎn)型、字符型、數(shù)組、指針和引用等,也可以是對(duì) 象。另一個(gè)類的對(duì)象,可以作該類的成員,但是自 身類的對(duì)象是不可以的,當(dāng)另一個(gè)類的對(duì)象作為這,第五章,個(gè)類的成員時(shí),如果另一

7、個(gè)類的定義在后,需要提前說(shuō) 明。如: class N; /說(shuō)明類 N class M public: private: N n; /n是N類的對(duì)象 ; class N public: void f(M m); /m是M類的對(duì)象 ;,第五章,3、盡管在類體內(nèi)公有成員與私有成員的說(shuō)明順序無(wú) 關(guān),但是一般地,類體內(nèi)先說(shuō)明公有成員, 再說(shuō)明 私有成員,在說(shuō)明數(shù)據(jù)成員時(shí),一般按數(shù)據(jù)成員的類 型大小, 由小至大說(shuō)明。 4、在編程時(shí)經(jīng)常習(xí)慣地將類定義的說(shuō)明部分或者整個(gè) 定義部分(包含實(shí)現(xiàn)部分)放到一個(gè)頭文件中,使得 后面引用起來(lái)比較方便。上面定義的日期類和點(diǎn)類 的例子,可放在 .h擴(kuò)展名的文件中,即 Tda

8、te.h和 Tpoint.h文件。,第二節(jié) 對(duì)象的定義,第五章,根據(jù)類的定義,類是將不同類型的數(shù)據(jù)和與這些 數(shù)據(jù)相關(guān)的操作封裝在一起的集合體。由于類中的成 員函數(shù)是共享的,因此由同一個(gè)類所創(chuàng)建的對(duì)象的數(shù) 據(jù)結(jié)構(gòu)是相同的。兩個(gè)不同的對(duì)象的名字是不同的, 它們的數(shù)據(jù)結(jié)構(gòu)的內(nèi)容(即數(shù)據(jù)成員的值)是不同的。 所以,系統(tǒng)對(duì)已定義的對(duì)象僅給它分配數(shù)據(jù)成員變量, 而一般數(shù)據(jù)成員又都為私有成員,不同對(duì)象的數(shù)據(jù)成員 的值可以是不相同的。,第五章,一、對(duì)象的定義格式: 1、對(duì)象的定義格式: (1)、一般對(duì)象的定義格式 類名對(duì)象名表; (2)、指向?qū)ο蟮闹羔樁x格式 類名*指針名; (3)、對(duì)象引用的定義格式 類名

9、 date1.SetDate(1996,5,4); date2.SetDate(1998,4,9); int leap=date1.IsLeapYear(); coutleapendl; date1.Print(); date2.Print(); 為了閱讀方便,我們把前面的tdate.h程序?qū)懺谙旅妫?第五章,class TDate public: void SetDate(int y,int m,int d) year=y;month=m;day=d; int IsLeapYear() return (year%4=0 執(zhí)行該程序后,輸出結(jié)果如下: 1 1996.5.4 1998.4.9,第

10、五章,程序分析:該程序的主函數(shù)中,定義了兩個(gè)對(duì)象 date1和date2,并通過(guò)成員函SetDate( )給對(duì)象 date1 和 date2 賦值。通過(guò)成員函數(shù) IsLeapYear( )判斷對(duì) 象 date1 的年份 (1996) 是否是閏年。最后,通過(guò)調(diào) 用成員函數(shù)Print( )輸出顯示對(duì)象date1 和 date2 的 數(shù)據(jù)成員的值。 例4. 分析下列程序的輸出結(jié)果。 #include #includetpoint.h void main() TPoint p1,p2;,第五章,p1.SetPoint(3,5); p2.SetPoint(8,10); p1.Move(2,1); p2.

11、Move(1,-2); coutx1=p1.Xcoord(),y1=p1.Ycoord()endl; coutx2=p2.Xcoord(),y2=p2.Ycoord()endl; 同樣為了分析的方便,把建立的點(diǎn)類頭文件寫在下 面。 class TPoint public: void SetPoint(int x,int y); int Xcoord() return X;,第五章,int Ycoord() return Y; void Move (int xOffset, int yOffset); private: int X,Y; ; void TPointSetPoint(int x,i

12、nt y) X=x; Y=y; void TPointMove(int xOffset,int yOffset) X+=xOffset; Y+=yOffset; ,第五章,運(yùn)行該程序,輸出結(jié)果為: x1=5,y1=6 x2=9,y2=8 程序分析:在主程序中,先定義Tpoint類的兩個(gè) 對(duì)象p1,p2;調(diào)用成員函數(shù)SetPoint( )分別為p1,p2 對(duì)象的數(shù)據(jù)成員賦值;再調(diào)用Move( )成員函數(shù)為p1, p2的數(shù)據(jù)成員分別重新賦值;調(diào)用Xcoord( )和 Ycoord( )兩個(gè)成員函數(shù)通過(guò)為p1賦值而分別輸出x1, y1值,同樣原理輸出x2,y2值。,第三節(jié) 對(duì)象的初始化,第五章,一、

13、構(gòu)造函數(shù)和析構(gòu)函數(shù): 1.構(gòu)造函數(shù): 、構(gòu)造函數(shù)的功能: 在創(chuàng)建對(duì)象時(shí), 系統(tǒng)自動(dòng)調(diào)用相應(yīng)的構(gòu)造函數(shù)為 對(duì)象初始化。 、構(gòu)造函數(shù)的特點(diǎn): a、構(gòu)造函數(shù)是成員函數(shù),函數(shù)體可寫在類體內(nèi),也可 寫在類體外。 b、構(gòu)造函數(shù)是一個(gè)函數(shù)名與類名相同的特殊函數(shù),定 義時(shí)無(wú)類型說(shuō)明。 c、構(gòu)造函數(shù)可以有一個(gè)參數(shù),也可以有多個(gè)參數(shù),還 可以無(wú)參數(shù),并可以重載。,第五章,d、程序中不能直接調(diào)用構(gòu)造函數(shù),在創(chuàng)建對(duì)象時(shí)系統(tǒng) 自動(dòng)調(diào)用。 e、當(dāng)一個(gè)類中沒有定義任何構(gòu)造函數(shù)時(shí),系統(tǒng)將自動(dòng) 創(chuàng)建一個(gè)默認(rèn)構(gòu)造函數(shù)。 2、析構(gòu)函數(shù): 、析構(gòu)函數(shù)的功能: 是用來(lái)釋放一個(gè)對(duì)象的,與構(gòu)造函數(shù)的功能正好 相反。在對(duì)象刪除前,用它來(lái)做一

14、些清理工作。 、析構(gòu)函數(shù)的特點(diǎn): a、 析構(gòu)函數(shù)是成員函數(shù),函數(shù)體可寫在類體內(nèi),也可 以寫在類體外。 b、析構(gòu)函數(shù)也是一個(gè)特殊的函數(shù),它的函數(shù)名也同,第五章,類名,定義時(shí)也無(wú)類型說(shuō)明,但為了與構(gòu)造函數(shù)加以 區(qū)別,在函數(shù)名前面要加 “” 字符。 c、析構(gòu)函數(shù)無(wú)參數(shù),因此無(wú)法重載。一個(gè)類中只可能 定義一個(gè)析構(gòu)函數(shù)。 d、當(dāng)一個(gè)系統(tǒng)沒有定義析構(gòu)函數(shù)時(shí),系統(tǒng)將自動(dòng)創(chuàng)建 一個(gè)默認(rèn)的析構(gòu)函數(shù)。 e、析構(gòu)函數(shù)可以被調(diào)用,也可以被系統(tǒng)自動(dòng)調(diào)用。在 下面兩種情況下,析構(gòu)函數(shù)會(huì)被自動(dòng)調(diào)用: 、如果一個(gè)對(duì)象被定義在一個(gè)函數(shù)體內(nèi),則當(dāng)這個(gè) 函數(shù)結(jié)束時(shí),該對(duì)象的析構(gòu)函數(shù)被自動(dòng)調(diào)用。 、當(dāng)一個(gè)對(duì)象是使用new 運(yùn)算符被動(dòng)

15、態(tài)創(chuàng)建的,在 使用 delete 運(yùn)算符釋放它時(shí), delete將會(huì)自動(dòng),第五章,調(diào)用析構(gòu)函數(shù)。 例5、利用構(gòu)造函數(shù)與析構(gòu)函數(shù)重新定義前面講過(guò)的日 期類,并將其定義存放在tdate1.h 文件中。分析程 序的運(yùn)行結(jié)果。 class TDate1 public: TDate1(int y, int m, int d); TDate1(); void Print(); private: int year, month,day; ; TDate1TDate1(int y, int m, int d),第五章, year=y; month=m; day=d; cout #include tdate1.

16、h void main(),第五章, TDatel today(1998,4,9),tomorrow(1998,4,10); couttoday is; today. Print(); couttomorrow is; tomorrow. Print(); 執(zhí)行該程序后,輸出結(jié)果應(yīng)為: Constructor Called. Constructor Called. today is 1998.4.9 tomorrow is 1998.4.10 Destructor called. Destructor called.,第五章,二、默認(rèn)構(gòu)造函數(shù)和默認(rèn)析構(gòu)函數(shù): 在類定義時(shí)沒有定義任何構(gòu)造函數(shù)時(shí),

17、則編譯器自 動(dòng)生成一個(gè)不帶參數(shù)的默認(rèn)(缺?。?gòu)造函數(shù),其格式: ( ) 在程序中定義一個(gè)對(duì)象而沒有指明初始化時(shí),則編 譯器便按缺省構(gòu)造函數(shù)來(lái)初始化該對(duì)象。使用缺省構(gòu) 造函數(shù)對(duì)對(duì)象初始化時(shí),將對(duì)象的所有數(shù)據(jù)成員都初始 化為零或空。如在日期類Tdate1的程序中有說(shuō)明語(yǔ)句: TDatel today, tomorrow; 這時(shí)編譯系統(tǒng)使用缺省構(gòu)造函數(shù)對(duì)today,tomorrow,第五章,進(jìn)行初始化,使 today(0,0,0), tomorrow (0,0,0)。 同理,如果一個(gè)類中沒有定義析構(gòu)函數(shù)時(shí),則編譯 系統(tǒng)也生成一個(gè)默認(rèn)(缺?。┪鰳?gòu)函數(shù),其格式如下: 即為該類的類名。缺省析構(gòu) 函數(shù)是一個(gè)

18、空函數(shù),只用來(lái)釋放對(duì)象。 三、復(fù)制構(gòu)造函數(shù): 復(fù)制構(gòu)造函數(shù)也是一種特殊的成員函數(shù)。,第五章,1、復(fù)制構(gòu)造函數(shù)的功能: 用一個(gè)已知的對(duì)象來(lái)初始化一個(gè)被創(chuàng)建的同類的 對(duì)象。 2、復(fù)制構(gòu)造函數(shù)的特點(diǎn): 、也是一種構(gòu)造函數(shù),函數(shù)名同類名; 、也不被指定返回類型,只有一個(gè)參數(shù),并且是對(duì)某 個(gè)對(duì)象的引用。 、每個(gè)類都必須有一個(gè)復(fù)制構(gòu)造函數(shù),其定義格式: :( Y=y; TPoint(TPoint ;,第五章,TPointTPoint(TPoint ,第五章,執(zhí)行該程序后,輸出結(jié)果如下: Copy_initialization Constructor Called. P2=5,7 Destructor Ca

19、lled. Destructor Called.,第四節(jié) 成員函數(shù)的特性,第五章,一、內(nèi)聯(lián)函數(shù)和外聯(lián)函數(shù): 類的成員函數(shù)可分為: 1、內(nèi)聯(lián)函數(shù):定義在類體內(nèi)的成員函數(shù)。 2、外聯(lián)函數(shù):說(shuō)明在類體內(nèi),定義在類體外的成員函 數(shù),即函數(shù)體的說(shuō)明部分在類的實(shí)現(xiàn)部分。 例7、分析程序。 class A public: A(int x,int y)X=x;Y=y; int a() return X; /內(nèi)聯(lián)函數(shù) int b() return Y; /內(nèi)聯(lián)函數(shù) int c(); /外聯(lián)函數(shù) int d(); /外聯(lián)函數(shù),第五章,private: int X,Y; ; inline int Ac () ret

20、urn a()+b(); inline int Ad() return c(); #include void main() A m(3,5); int i=m.d(); coutd() return:iendl; ,第五章,運(yùn)行程序,結(jié)果: d() return:8 二、重載性: 一般的成員函數(shù)可以重載,構(gòu)造函數(shù)可以重載,而 析構(gòu)函數(shù)不能重載。 例8 分析程序。 class M public: M(int x,int y) X=x;Y=y; M(int x) X=x;Y=x*x; int Add(int x,int y); int Add(int x); int Add(); int Xout

21、() return X;,第五章,int Yout() return Y; private: int X,Y; ; int M Add(int x, int y) X=x; Y=y; return X+Y; int M Add(int x) X=Y=x; return X+Y; int M Add() return X+Y; ,第五章,#include void main() M a(10,20),b(4); couta=a.Xout(),a.Yout()endl; coutb=b.Xout(),b.Yout()endl; int i=a. Add(); int j=a.Add(3,9); i

22、nt k=b.Add(5); coutiendljendlkendl; 運(yùn)行該程序,得到運(yùn)行結(jié)果為: a=10,20 b=4,16 30 12 10,第五章,三、設(shè)置參數(shù)的缺省值: 一般成員函數(shù)和構(gòu)造成員函數(shù)都可被設(shè)置參數(shù)的 缺省值,這與設(shè)置函數(shù)參數(shù)的默認(rèn)值的方法是一致的。 例9、分析程序。 class N public: N(int a=3,int b=5,int c=7); int Aout() return A; int Bout() return B; int Cout() return C; private: int A,B,C; ; N N(int a,int b,int c),第

23、五章, A=a; B=b; C=c; #include void main() N X,Y(9,11),Z(13,15,17); coutX=X.Aout(),X.Bout(),X.Cout(),endl; coutY=Y.Aout(),Y.Bout(),Y.Cout(),endl; coutZ=Z.Aout(),Z.Bout(),Z.Cout(),endl; 運(yùn)行該程序,得到運(yùn)行結(jié)果為: X=3,5,7 Y=9,11,7 Z=13,15,17,第五節(jié) 靜態(tài)成員,第五章,全局量的可見范圍是無(wú)法控制的,即在整個(gè)程序 內(nèi)都是可見的,在程序的任何地方全局變量都可被更 新,如果不小心更新了,就會(huì)影響到

24、更新后的程序。 所以為了安全起見,盡量不使用全局變量,而使用靜 態(tài)成員,從而實(shí)現(xiàn)多個(gè)對(duì)象之間的數(shù)據(jù)共享。 一、靜態(tài)成員的特點(diǎn): 1、靜態(tài)成員是屬于類的,而不是屬于某個(gè)對(duì)象的。 2、靜態(tài)成員包含有靜態(tài)數(shù)據(jù)成員和靜態(tài)成員函數(shù)兩 種。 3、靜態(tài)成員的定義方法是在該成員說(shuō)明前加上關(guān)鍵字 Static。,第五章,二、靜態(tài)數(shù)據(jù)成員: 1、靜態(tài)數(shù)據(jù)成員的特點(diǎn): 、靜態(tài)數(shù)據(jù)成員是類的所有對(duì)象中共享的成員,而不 是某個(gè)對(duì)象的成員,可以實(shí)現(xiàn)多個(gè)對(duì)象之間的數(shù)據(jù)共 享。 、使用靜態(tài)數(shù)據(jù)成員不會(huì)破壞隱藏的原則,即保證了安全性。 、靜態(tài)數(shù)據(jù)成員是同一類中所有對(duì)象所公有的,對(duì) 多個(gè)對(duì)象來(lái)說(shuō),靜態(tài)數(shù)據(jù)成員只存儲(chǔ)一處,供所有對(duì)

25、 象共用,所以使用靜態(tài)數(shù)據(jù)成員可以節(jié)省內(nèi)存。 、靜態(tài)數(shù)據(jù)成員的值對(duì)每個(gè)對(duì)象都是一樣的,但它 的值是可以更新的。只要對(duì)靜態(tài)數(shù)據(jù)成員的值更新,第五章,一次,保證所有對(duì)象存取更新以后的、相同的值, 這樣可以提高時(shí)間效率。 2、靜態(tài)數(shù)據(jù)成員的使用方法和注意事項(xiàng): 、靜態(tài)數(shù)據(jù)成員在定義或說(shuō)明時(shí)前面加關(guān)鍵字static 如: class A private: int a,b,c; static int s; 、靜態(tài)數(shù)據(jù)成員是靜態(tài)存儲(chǔ)的,必須對(duì)它進(jìn)行初始 化,而且與一般數(shù)據(jù)成員初始化不同,初始化在類 體外進(jìn)行。其格式為: :=; 如: int As=10,第五章,格式中: a、初始化時(shí)為避免與一般靜態(tài)變量或

26、對(duì)象相混淆,靜 態(tài)數(shù)據(jù)成員名前面不加static關(guān)鍵字; b、初始化時(shí)不加該成員的訪問(wèn)權(quán)限控制符 private, public 等; c、靜態(tài)數(shù)據(jù)成員是類的成員,而不是對(duì)象的成員,因 此,初始化時(shí)使用作用域運(yùn)算符來(lái)標(biāo)明它所屬的類; 、如果靜態(tài)數(shù)據(jù)成員的訪問(wèn)權(quán)限允許的話(即public 的成員),可在程序中引用靜態(tài)數(shù)據(jù)成員。采用的格 式: 例10、 分析下列程序的輸出結(jié)果。,第五章,#include class Myclass public: Myclass (int a,int b,int c); void GetNumber(); void GetSum(); private: int A

27、,B,C; static int Sum; /在類體內(nèi)說(shuō)明靜態(tài)數(shù)據(jù)成員Sum ; int MyclassSum=0; /靜態(tài)數(shù)據(jù)成員Sum初始化為0 MyclassMyclass(int a,int b,int c) A=a; B=b; C=c; Sum+=A+B+C; ,第五章,void Myclass:GetNumber() coutNumber=A,B,Cendl; void Myclass:GetSum() coutSum=Sumendl; void main() Myclass M(3,7,10),N(14,9,11); M.GetNumber(); N.GetNumber(); M

28、.GetSum(); N.GetSum(); ,第五章,執(zhí)行該程序輸出如下結(jié)果 : Number= 3,7,10 Number=14,9,11 Sum=54 Sum=54,第五章,三、靜態(tài)成員函數(shù): 1、靜態(tài)成員函數(shù)的特點(diǎn): 靜態(tài)成員函數(shù)和靜態(tài)數(shù)據(jù)成員一樣,都屬于類的 靜態(tài)成員,都不是對(duì)象成員。因此,對(duì)靜態(tài)成員的引用 不需要用對(duì)象名。 2、使用靜態(tài)成員函數(shù)的注意事項(xiàng): 、在靜態(tài)成員函數(shù)的實(shí)現(xiàn)中,可以引用類中說(shuō)明的 靜態(tài)成員,而不能直接引用類中說(shuō)明的非靜態(tài)成 員,如果要引用非靜態(tài)成員時(shí),可通過(guò)對(duì)象來(lái)引用。 、調(diào)用靜態(tài)成員函數(shù)的格式: :() 例11 分析程序的輸出結(jié)果。,第五章,#include

29、 class M public: M(int a) A=a; B+=a; static void f1(M m); /靜態(tài)成員函數(shù)f1(),其中參數(shù)m是類的對(duì)象 private: int A; static int B; ; void Mf1(M m) cout“A=”m. Aendl; /靜態(tài)成員函數(shù)通過(guò)對(duì)象m來(lái)引用類中非靜態(tài)數(shù)據(jù)成員 coutB=Bendl; int MB=0; /靜態(tài)數(shù)據(jù)成員初始化 void main(),第五章, M P(5),Q(10); Mf1(P); Mf1(Q); 執(zhí)行該程序后輸出結(jié)果如下: A=5 B=15 A=10 B=15,第六節(jié) 友元,第五章,一、友元的

30、引進(jìn)及特點(diǎn): 1、友元引入的原因: 類具有封裝和信息隱藏的特性,只有類的成員函 數(shù)才能訪問(wèn)類中的私有成員,而程序中的非成員函數(shù) 是無(wú)法訪問(wèn)類中私有成員的,只可以訪問(wèn)類中的公有 成員,但是如果將數(shù)據(jù)成員都定義為公有的,這又破壞 了隱藏的特性。另外,在某些情況下,特別是在對(duì)某 些成員函數(shù)多次調(diào)用時(shí),由于參數(shù)傳遞,類型檢查和 安全性檢查等都需要時(shí)間開銷,而影響程序的運(yùn)行效 率。為了解決這些問(wèn)題,提出使用友元。友元有友元 函數(shù)和友元類兩種。,第五章,2、友元的特點(diǎn): 友元不是成員函數(shù),但是它可以訪問(wèn)類中的私有 成員,因此它破壞了類的封裝性和隱藏性,但是友元 提高了程序的運(yùn)行效率。 二、友元函數(shù) : 1

31、、概念: 友元函數(shù):是一種定義在類體外的需要在類體內(nèi) 進(jìn)行說(shuō)明的普通非成員函數(shù)。 為了與該類的成員函數(shù)加以區(qū)別,在說(shuō)明時(shí)前面加 關(guān)鍵字friend。說(shuō)明友元函數(shù)的方法如下: friend 類型函數(shù)名(參數(shù)表) 函數(shù)體 ,第五章,2、友元函數(shù)的特點(diǎn): 能夠訪問(wèn)類中私有成員的非成員函數(shù),在定義和 調(diào)用上與普通函數(shù)一樣。 例12、已知兩點(diǎn)坐標(biāo),求兩點(diǎn)距離。 #include #include class Point public: Point(double xx, double yy) x=xx; y=yy; void Getxy(); friend double Distance(Point ,第

32、五章,void PointGetxy() cout(x,y)endl; double Distance(Point ,第五章,執(zhí)行該程序輸出如下結(jié)果: (3.0,4.0) (6.0,8.0) Distance is 5 例13、分析一個(gè)利用友元函數(shù)表示時(shí)間的例子。 #include class Time public : Time (int new-hours,int new-minutes) hours=new-hours; minutes=new minutes; friend void Time12(Time time); friend void Time24(Time time); p

33、rivate: int hours,minutes; ;,第五章,void Time12(Time time) /友元函數(shù)的形參為Time類的對(duì)象time if(time.hours12) /訪問(wèn)類中私有成員hours必須通過(guò)類的對(duì)象time time.hours-=12; couttime.hours:time.minutesPMendl; else couttime.hours:time.minutesAMendl; void Time24(Time time) couttime.hours:time.minutesendl; void main() ,第五章,Time Time1(20,

34、30),Time2(10,45); Time12(Time1); Time24(Time1); Time12(Time2); Time24(Time2); 運(yùn)行結(jié)果: 8:30PM 20:30 10:45AM 10:45 三、友元類: 1、友元類定義: 在一個(gè)類體內(nèi),按下列格式說(shuō)明的類稱友元類。 friend class 類名;,第五章,2、友元類的特點(diǎn): 友元類中的成員函數(shù)為其被定義類的友元函數(shù), 即當(dāng)一個(gè)類作為另一個(gè)類的友元時(shí),這就意味著這個(gè)類 的所有成員函數(shù)都是另一個(gè)類的友元函數(shù)。 例14 分析一個(gè)友元類程序的輸出結(jié)果。 #include class X friend class Y;

35、/說(shuō)明友元類Y public: void Set (int i) x=i; void Display() coutx=x,; couty=yendl; ,第五章,private: int x; static int y; /y是靜態(tài)數(shù)據(jù)成員 ; class Y public: Y(int i,int j); void Display(); private: X a; /類Y中的私有成員a是X類的一個(gè)對(duì)象 ; int Xy=1; /為X類的靜態(tài)數(shù)據(jù)成員初始化 YY(int i,int j) /Y類中的構(gòu)造函數(shù)Y是X類的友元函數(shù) a.x=i; Xy=j; ,第五章,void YDisplay()

36、coutx=a.x,; couty=Xyendl; void main() X b; b.Set(5); b.Display(); Y c(6,9); c.Display(); b.Display(); 運(yùn)行結(jié)果: x=5,y=1 x=6,y=9 x=5,y=9,第七節(jié) 類的作用域,第五章,一、 類的作用域: 類的作用域簡(jiǎn)稱類域,它是指在類的定義中有一 對(duì)花括號(hào)所括起來(lái)的部分。 每一類都具有該類的類 域,其成員局部于該類的類域中。 類域介于文件域和函數(shù)域之間:文件域可以包含 類域,類域小于文件域;類域中可包含成員函數(shù)的作 用域。 類域中定義的變量不能使用 auto,register, exte

37、rn等修飾符,只能用static修飾符;定義的函數(shù) 也不能用extern修飾符。 由于類中成員的特殊訪問(wèn)規(guī)則,使得類中成員的作 用域變得比較復(fù)雜。具體地講,某個(gè)類A中某個(gè)成員M在,第五章,下列情況下具有類A的作用域 : 1、該成員(M)出現(xiàn)在該類的某個(gè)成員函數(shù)中,并且該成 員函數(shù)沒有定義同名標(biāo)識(shí)符。 2、在該類(A)的某個(gè)對(duì)象的該成員(M)的表達(dá)式中。 如,a是A的對(duì)象,即在表達(dá)式 a.M 中。 3、在該類(A)的某個(gè)指向?qū)ο笾羔樀脑摮蓡T(M)的表達(dá) 式中。如,Pa是一個(gè)指向A類對(duì)象的指針,即在表達(dá) 式Pa-M中。 4、在使用作用域運(yùn)算符所限定的該成員中。如,在表 達(dá)式AM中。 二、局部類和嵌套類: 1、局部類: 在一個(gè)函數(shù)體內(nèi)定義的類稱為局部類。因?yàn)橥鈬?作用域中的變量與該局部類的對(duì)象無(wú)關(guān),所以局部類,第五章,中只能使用它的外圍作用域中的對(duì)象和函數(shù)進(jìn)行聯(lián)系。 在定義局部類時(shí)需要注意:局部類中不能說(shuō)明靜態(tài) 成員函數(shù),并且所有成員函數(shù)都必須是內(nèi)聯(lián)函數(shù)。 2、嵌套類: 在一個(gè)類中定義的類稱為嵌套類,而定義嵌套類的 類稱為外圍類。 定義嵌套類的目的在于隱藏類名,減少全局的標(biāo) 識(shí)符,從而限制用戶能否使用該類建立對(duì)象。這樣可 以提高類的抽象能力,并且強(qiáng)調(diào)了兩個(gè)類(外圍類和嵌 套類)之間的主從關(guān)系。 對(duì)嵌套類的說(shuō)明: 、從作用域的角度上看,嵌套類被隱藏在外圍

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論