第03章 面向?qū)ο缶幊袒A(chǔ).ppt_第1頁
第03章 面向?qū)ο缶幊袒A(chǔ).ppt_第2頁
第03章 面向?qū)ο缶幊袒A(chǔ).ppt_第3頁
第03章 面向?qū)ο缶幊袒A(chǔ).ppt_第4頁
第03章 面向?qū)ο缶幊袒A(chǔ).ppt_第5頁
已閱讀5頁,還剩85頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),第3章 面向?qū)ο缶幊袒A(chǔ),3.0 面向?qū)ο蟮乃枷?3.1 面向?qū)ο蟪绦蛟O(shè)計(jì)的基本特點(diǎn) 3.2 建立類與對(duì)象 3.3 構(gòu)造函數(shù)和析構(gòu)函數(shù) 3.4 類的作用域和對(duì)象的生存期 3.5 類的靜態(tài)成員 3.6 常類型 3.7 數(shù)組、指針與對(duì)象 3.8 類的組合,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),第四章 類與對(duì)象,3.9 友元 項(xiàng)目設(shè)計(jì)3 面向?qū)ο蟪绦蛟O(shè)計(jì)中類的應(yīng)用,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.0 面向?qū)ο蟮乃枷?面向過程的程序設(shè)計(jì)方法 面向?qū)ο蟮某绦蛟O(shè)計(jì)方法 對(duì)象與消息 消息的組成部分 類與對(duì)象的關(guān)系,2020年

2、6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.1 面向?qū)ο蟪绦蛟O(shè)計(jì)的基本特點(diǎn),3.1.1 抽象 3.1.2 封裝 3.1.3 繼承 3.1.4 多態(tài),2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.1.1 抽象,抽象是面向?qū)ο蟪绦蛟O(shè)計(jì)的基本原則之一,抽象與具體相對(duì)應(yīng)。 一個(gè)汽車的型號(hào)就是抽象,它代表了某個(gè)汽車的一切屬性,包括最大時(shí)速,車身長(zhǎng)度,全車凈重等。抽象就是對(duì)具體事物的概括。 在現(xiàn)實(shí)中,為了減少必須處理的事情,我們是在某一程度的細(xì)節(jié)中生活的。在面向?qū)ο蟪绦蛟O(shè)計(jì)中,這種細(xì)節(jié)程度就叫抽象。 數(shù)據(jù)抽象與代碼抽象,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.1.2 封裝,在面向?qū)ο?/p>

3、程序設(shè)計(jì)中抽象可以表示它所描述事物的所有屬性和操作,將抽象得到的數(shù)據(jù)和操作相結(jié)合,形成一個(gè)有機(jī)的整體,就叫做封裝。 在C+中,是利用類(class)的形式來實(shí)現(xiàn)封裝的,可以通過封裝,將一部分操作或?qū)傩宰鳛轭惻c外部的接口,將其他成員隱蔽起來,以達(dá)到對(duì)數(shù)據(jù)訪問權(quán)限的合理控制,使程序中不同部分之間的相互影響減到最低限度。 封裝的二層含義 B,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.1.2 封裝,封裝可以將數(shù)據(jù)和代碼組織為一個(gè)可重用的C+類,在編寫代碼的時(shí)候就可以有效利用已有的成果。 在C+中如果以電視為例進(jìn)行抽象并封裝的話,可以得到如下代碼:,class Television /cla

4、ss關(guān)鍵字 類名 /邊界 public: /外部接口 void SetChannel(int ChannelNum); /行為,代碼成員 void ShutDown(); /行為,代碼成員 private: /特定的訪問權(quán)限 int CurrentChannel; /屬性,數(shù)據(jù)成員 ;,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.1.3 繼承,B繼承是面向?qū)ο蟪绦蛟O(shè)計(jì)中的一種重要機(jī)制,該機(jī)制自動(dòng)的將一個(gè)類中的操作和數(shù)據(jù)結(jié)構(gòu)提供給另一個(gè)類,這使得程序員可以使用已有類的成分來建立新類。 C+語言中可以讓你聲明一個(gè)新類作為另一個(gè)類的派生。派生類(也叫子類)繼承其父類的屬性和操作。子類也聲明

5、了新的操作和屬性,除去了一些不適合于自身用途的繼承下來的操作和屬性。這樣,繼承可以讓你重用父類的代碼,專注于子類代碼的編寫。,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.1.3 繼承,對(duì)地球上的各種生物進(jìn)行抽象,將可以得到如下形式的繼承關(guān)系圖:,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.1.3 繼承,在面向?qū)ο蟪绦蛟O(shè)計(jì)方法出現(xiàn)以前,在標(biāo)準(zhǔn)的C函數(shù)庫中,基本上不能找到可重用的代碼部件。如果一個(gè)程序員已經(jīng)開發(fā)了一些程序,現(xiàn)在要開發(fā)一個(gè)新的程序,實(shí)際上不可能用到先前程序中的代碼部件,通常這些部件都要修改。 繼承可以使已存在的類在不用修改的情況下適應(yīng)新的應(yīng)用,掌握C+面向?qū)ο蟪绦?/p>

6、設(shè)計(jì)所有方面的關(guān)鍵就在于理解繼承。,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.1.4 多態(tài),B多態(tài),是指類中具有相似功能的不同函數(shù)使用同一個(gè)名稱來實(shí)現(xiàn)。 以繪圖程序?yàn)槔?,函?shù)可以對(duì)一般圖形進(jìn)行操作,而不關(guān)心它們是圓、正方形還是三角形。所有的圖形都能被繪制、擦除和移動(dòng),所以這些函數(shù)能簡(jiǎn)單地發(fā)送消息給一個(gè)圖形對(duì)象,而不考慮這個(gè)對(duì)象如何處理這個(gè)消息。 B C+中,多態(tài)是通過函數(shù)重載和虛函數(shù)來實(shí)現(xiàn)的。,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.2 建立類與對(duì)象,3.2.1 類的聲明與實(shí)現(xiàn) 3.2.2 類成員的訪問控制 3.2.3 類的成員函數(shù) 3.2.4 對(duì)象的建立與使用,2

7、020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.2.1 類的聲明與實(shí)現(xiàn),面向?qū)ο蟪绦蛟O(shè)計(jì)方法的核心是類,利用它可以實(shí)現(xiàn)對(duì)數(shù)據(jù)和方法的封裝,通過類的繼承,能夠?qū)崿F(xiàn)對(duì)問題的深入抽象描述。 類相當(dāng)于一種用戶自定義的類型,它和前幾章提到的基本類型,如浮點(diǎn)型、整形,有類似的特征。,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),class private: public: ; 類中的數(shù)據(jù)和函數(shù)是類的成員,分別稱為數(shù)據(jù)成員和成員函數(shù)。,B定義類的一般格式如下:,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),public類成員,是公有的,能被外面的程序訪問; private類成員,是私有的,只能由

8、類中的函數(shù)所使用,而不能被外面的程序所訪問。 是類定義中的實(shí)現(xiàn)部分,這部分包含所有在類體中聲明的函數(shù)的定義。 當(dāng)類的成員函數(shù)的函數(shù)體在類的外部定義時(shí),必須由作用域運(yùn)算符“:”來通知編譯系統(tǒng)該函數(shù)所屬的類。,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.2.1 類的聲明與實(shí)現(xiàn),這里還是以電視為例,聲明一個(gè)類來描述電視。,class Television public: void SetChannel(int ChannelNum); void ShutDown(); void TurnOn(); private: int CurrentChannel; bool IsOpen; ;,20

9、20年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.2.1 類的聲明與實(shí)現(xiàn),(1)在類的聲明中只聲明了函數(shù)的原形,函數(shù)的實(shí)現(xiàn)可以在類外定義:,void Television:SetChannel(int ChannelNum) . /這里為設(shè)置頻道相關(guān)代碼 CurrentChannel= ChannelNum; void Television: ShutDown() . /這里為關(guān)閉電視相關(guān)代碼 IsOpen=false; ,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.2.1 類的聲明與實(shí)現(xiàn),void Television: TurnOn () . /這里為打開電視相關(guān)代碼 IsOpe

10、n=true; ,這樣,我們就完成了對(duì)Television類的聲明。首先以class關(guān)鍵字聲明類的名稱;然后聲明類的數(shù)據(jù)成員和函數(shù)成員,通過public、private等關(guān)鍵字來說名類的成員的訪問控制屬性,最后再給出成員函數(shù)的實(shí)現(xiàn)。,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.2.1 類的聲明與實(shí)現(xiàn),下面再以一個(gè)簡(jiǎn)單例子說明,如何在C+程序中使用一個(gè)定義好的類: 這樣,我們完成了一次對(duì)Television類的使用。首先聲明了Television類的變量,也就是完成了Television類的實(shí)例化;然后通過類的變量調(diào)用類中的成員函數(shù)完成相應(yīng)功能。,Television Tv; / Te

11、levision類的實(shí)例化 Tv.TurnOn(); /調(diào)用成員函數(shù)打開電視 Tv. SetChannel (8); /調(diào)用成員函數(shù)選擇頻道 Tv. ShutDown (); /調(diào)用成員函數(shù)關(guān)閉電視,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.2.2 類成員的訪問控制,在C+中可以通過設(shè)置成員的訪問控制屬性來實(shí)現(xiàn)對(duì)類成員訪問權(quán)限的控制。訪問控制屬性有以下三種: public(公有類型) private(私有類型) protected(保護(hù)類型),2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.2.2 類成員的訪問控制,公有類型用來聲明類的外部接口。公有成員用public關(guān)鍵字聲

12、明,任何一個(gè)來自外部的訪問都必須通過這種外部接口來進(jìn)行。 private關(guān)鍵字后面聲明的就是類的私有類型成員,如果私有成員緊接著類名稱,私有關(guān)鍵字可以省略,也就是說在默認(rèn)情況下類成員會(huì)被當(dāng)作私有類型。只有本類的成員函數(shù)可以訪問私有類型的成員,而類外的任何訪問都是非法的。,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.2.2 類成員的訪問控制,protected關(guān)鍵字定義的保護(hù)類型的性質(zhì)和私有類型的性質(zhì)相似,其差別在于繼承過程中對(duì)新類的影響不同。 加入類成員的訪問控制附后,可以將電視類寫成以下形式:,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.2.2 類成員的訪問控制,clas

13、s Television public: void SetChannel(int ChannelNum); private: int CurrentChannel; public: void ShutDown(); void TurnOn(); private: bool IsOpen; ;,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),定義類時(shí)應(yīng)注意: (1) 不允許對(duì)所定義的數(shù)據(jù)成員進(jìn)行初始化,例如類CMeter中,下面的定義是錯(cuò)誤的: class CMeter . private: int m_nPos = 10; . ; (2) 在“public:”或“private:”后面定義的

14、所有成員都是公有或私有的,直到下一個(gè)“public:”或“private:”出現(xiàn)為止。,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),(3) 關(guān)鍵字public和private可以在類中出現(xiàn)多次,且前后的順序沒有關(guān)系; (4) 關(guān)鍵字protected(保護(hù))也可修飾成員的類型,它與private兩者基本相似,但在類的繼承時(shí)有所不同。 (5) 數(shù)據(jù)成員的類型可以是整型、浮點(diǎn)型、字符型、數(shù)組、指針和引用等,也可以是另一個(gè)類的對(duì)象。 (6) 盡量將類單獨(dú)存放在一個(gè)文件中或?qū)㈩惖穆暶鞣旁?h文件中而將成員函數(shù)的實(shí)現(xiàn)放在與.h文件同名的.cpp文件中。,2020年6月20日星期六,C+面向?qū)ο蟪绦?/p>

15、設(shè)計(jì),3.2.3 類的成員函數(shù),1命名成員函數(shù) 例:成員函數(shù)的定義,class Circle public: void SetRadius(float Radius) /成員函數(shù) m_Radius=Radius; float GetCircumference() /成員函數(shù) return 2*m_Radius*3.14159265; ,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.2.3 類的成員函數(shù),2. 類中定義的成員函數(shù) 上面的例子中,類定義的大括號(hào)所包含的2個(gè)成員函數(shù)是在類中定義。定義在類中的成員函數(shù)一般規(guī)模都比較小,只有15句語句,它們一般即使沒有明確用inline標(biāo)示,也被

16、認(rèn)為是內(nèi)聯(lián)函數(shù)。,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.2.3 類的成員函數(shù),3. 類之后定義的成員函數(shù) 對(duì)于語句比較多的成員函數(shù)來說,直接把代碼放在類定義中使用起來很不便。為了避免這種情況,C+允許在類聲明的后面定義成員函數(shù)。 例:類外定義成員函數(shù),class Circle public: void SetRadius(float Radius); float GetCircumference(); ;,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.2.3 類的成員函數(shù),與在類內(nèi)部定義成員函數(shù)時(shí)不一樣,在類外部定義時(shí),成員函數(shù)名前要多加上一個(gè)類名。,/類外定義的成員函

17、數(shù) void Circle:SetRadius(float Radius) m_Radius=Radius; float Circle:GetCircumference() return 2*m_Radius*3.14159265; ,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.2.3 類的成員函數(shù),3. 類成員函數(shù)的重載 類成員函數(shù)的重載方法與普通函數(shù)一樣。但由于類名是成員函數(shù)名的一部分,所以一個(gè)類的成員函數(shù)以另一個(gè)類的成員函數(shù)即使同名,也不能認(rèn)為是重載。,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.2.4 對(duì)象的建立與使用,類是一種抽象機(jī)制,它描述了一類問題的共同屬性和

18、行為。在面向?qū)ο蟪绦蛟O(shè)計(jì)中,類的對(duì)象也就是具有該類類型的某一特定實(shí)體。 例如,人類是一個(gè)類,每個(gè)不同的人都是人類的實(shí)例(instance),或稱對(duì)象(object)。,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),對(duì)象的定義,定義對(duì)象,格式: 定義的對(duì)象既可是一個(gè)普通對(duì)象,也可是一個(gè)數(shù)組對(duì)象或指針對(duì)象。 對(duì)象的成員就是該對(duì)象的類所定義的成員。對(duì)象成員有數(shù)據(jù)成員和成員函數(shù),其表示方式如下: . .() 前者用來表示數(shù)據(jù)成員,后者用來表示成員函數(shù)?!?”是一個(gè)運(yùn)算符,用來表示對(duì)象的成員。,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.2.4 對(duì)象的建立與使用,聲明一個(gè)類的實(shí)例(對(duì)象)和

19、聲明一個(gè)一般變量相同,例如: 聲明了類及其對(duì)象,我們就可以訪問對(duì)象的公有成員,例如:,Circle c;,c.PrintCircumference();,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),指向?qū)ο蟮闹羔樀某蓡T表示如下: - -() “-”與“.”運(yùn)算符的區(qū)別是:“-”用來表示指向?qū)ο蟮闹羔槼蓡T,“.”用來表示一般對(duì)象成員。前者表示數(shù)據(jù)成員,后者表示成員函數(shù)。 下面的兩種表示是等價(jià)的: - (*). 這對(duì)于成員函數(shù)也適用。另外,引用對(duì)象的成員表示與一般對(duì)象的成員表示相同。,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.3 構(gòu)造函數(shù)和析構(gòu)函數(shù),3.3.1 構(gòu)造函數(shù) 3.3.

20、2 析構(gòu)函數(shù),2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),B3.3.1 構(gòu)造函數(shù),對(duì)象的初始化可以由類中的一個(gè)特殊成員函數(shù)來完成,即構(gòu)造函數(shù)。 構(gòu)造函數(shù)的作用是在對(duì)象被創(chuàng)建時(shí)用特定的方式構(gòu)造對(duì)象,將對(duì)象初始化為一個(gè)特定的狀態(tài),使此對(duì)象具有區(qū)別于其它對(duì)象的特征。構(gòu)造函數(shù)在對(duì)象被創(chuàng)建的時(shí)候由系統(tǒng)自動(dòng)調(diào)用,它完成的是一個(gè)由一般類到具體對(duì)象的過程。,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.3.1 構(gòu)造函數(shù),普通構(gòu)造函數(shù)例子:,class Person /類定義 public: Person(char* lpname,char* lpmale,int personage, char*

21、 lpcareer); /聲明構(gòu)造函數(shù) ;,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),Person:Person(char* lpname,char* lpsex,int personage, char* lpcareer) /實(shí)現(xiàn)Person類構(gòu)造函數(shù) strcpy(name,lpname); strcpy(sex,lpsex); age=personage; strcpy(career,lpcareer); ,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),構(gòu)造函數(shù)的最大特點(diǎn)是在對(duì)象建立時(shí)它會(huì)被自動(dòng)執(zhí)行,用于變量、對(duì)象的初始化代碼一般放在構(gòu)造函數(shù)中。 構(gòu)造函數(shù)必須與相應(yīng)的類同名,

22、可以帶參數(shù),也可以不帶參數(shù),可以重載,且沒有返回值。例如: class CMeter public: CMeter(int nPos = 10) / 構(gòu)造函數(shù) m_nPos = nPos; . 構(gòu)造函數(shù)CMeter(int nPos=10)中,nPos被設(shè)置了10,構(gòu)造函數(shù)中相應(yīng)實(shí)參沒有被指定時(shí),使用此缺省值。,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.3.1 構(gòu)造函數(shù),拷貝構(gòu)造函數(shù) 拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),有普通構(gòu)造函數(shù)的所有特性,其形參必須是本類對(duì)象的引用。其作用是使用一個(gè)已經(jīng)建立好的對(duì)象去初始化一個(gè)新的同類對(duì)象。 程序員可以根據(jù)實(shí)際需要定義特定的拷貝構(gòu)造函數(shù)來實(shí)現(xiàn)同

23、類對(duì)象之間的數(shù)據(jù)傳遞。如果程序員沒有定義類的拷貝構(gòu)造函數(shù),系統(tǒng)會(huì)自動(dòng)生成一個(gè)默認(rèn)拷貝構(gòu)造函數(shù),其作用是把初始值對(duì)象的每個(gè)數(shù)據(jù)成員的值都復(fù)制到新建立的對(duì)象中。,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.3.1 構(gòu)造函數(shù),拷貝構(gòu)造函數(shù)的定義例子,class Rect public: Rect(Rect ,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),Rect:Rect(Rect ,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),例Ex_ConCopy 拷貝構(gòu)造函數(shù)的使用。 #include class CDate public: CDate(int year = 2002, in

24、t month = 7, int day = 30) cout調(diào)用構(gòu)造函數(shù)endl; nYear = year; nMonth = month; nDay = day; coutnYear-nMonth-nDayendl; ,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),CDate(const CDate ,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.3.2 析構(gòu)函數(shù),析構(gòu)函數(shù)的作用與構(gòu)造函數(shù)幾乎正好相反,它在對(duì)象刪除前被自動(dòng)調(diào)用,來完成一些清理工作,也就是一些掃尾工作。 析構(gòu)函數(shù)與構(gòu)造函數(shù)一樣也是類的一個(gè)公有函數(shù)成員,它也不能有返回值,它的名稱必須由類名前面加“”構(gòu)成。 沒有返

25、回值 不帶參數(shù),不能重載,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.3.2 析構(gòu)函數(shù),析構(gòu)函數(shù)例子,class Rect public: Rect(int rtop,int rleft,int rwidth,int rheight); Rect(Rect ,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),默認(rèn)構(gòu)造函數(shù)和析構(gòu)函數(shù) 類定義時(shí),如果沒有定義任何構(gòu)造函數(shù),編譯器自動(dòng)生成一個(gè)不帶參數(shù)的默認(rèn)構(gòu)造函數(shù),格式如下: :() 按構(gòu)造函數(shù)的規(guī)定,默認(rèn)構(gòu)造函數(shù)名同類名。默認(rèn)構(gòu)造函數(shù)的這樣格式也可由用戶定義在類體中。在程序中定義一個(gè)對(duì)象而沒有指明初始化時(shí),則編譯器便按默認(rèn)構(gòu)造函數(shù)來初始化

26、該對(duì)象。 默認(rèn)構(gòu)造函數(shù)對(duì)對(duì)象初始化時(shí),則將對(duì)象的所有數(shù)據(jù)成員都初始化為零或空。 如果一個(gè)類中沒有定義析構(gòu)函數(shù),編譯系統(tǒng)生成一個(gè)默認(rèn)析構(gòu)函數(shù),格式: :() 默認(rèn)析構(gòu)函數(shù)名與該類的類名同名。是一個(gè)空函數(shù)。,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),構(gòu)造函數(shù)的重載 例Ex_ConDefault 帶默認(rèn)參數(shù)的構(gòu)造函數(shù)。 #include class CDate public: CDate(int year = 2002, int month = 7, int day = 30) nYear = year; nMonth = month; nDay = day; coutnYear-nMont

27、h-nDayM這樣的表達(dá)式中,其中pa是一個(gè)指向A類對(duì)象的指針。,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.3.2 對(duì)象的生存期,對(duì)象從誕生到結(jié)束的這段時(shí)間就是它的生存期。 對(duì)象的生存期可以分為靜態(tài)生存期和動(dòng)態(tài)生存期兩種。 靜態(tài)生存期 如果對(duì)象生存期與程序生存期相同,我們稱它具有靜態(tài)生存期。在文件中聲明的對(duì)象都是具有靜態(tài)生存期的。如果要在函數(shù)內(nèi)部的塊作用域中聲明具有靜態(tài)生存期的對(duì)象,則要使用關(guān)鍵字static,例如下列語句聲明的對(duì)象r便是具有靜態(tài)生存期的對(duì)象。,static Rect r;,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.3.2 對(duì)象的生存期,動(dòng)態(tài)生存期 動(dòng)態(tài)

28、生存期對(duì)象誕生于聲明點(diǎn),結(jié)束于該標(biāo)識(shí)符作用域結(jié)束處。 動(dòng)態(tài)生存期例子:,Circle gc; /具有靜態(tài)生存期,文件作用域 void main() gc.SetRadius(7); /對(duì)象成員具有類作用域 gc.PrintCircumference(); Circle c; /聲明具有動(dòng)態(tài)作用域的對(duì)象c c.SetRadius(5); /引用對(duì)象c c.PrintCircumference(); ,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.5 類的靜態(tài)成員,3.5.1 靜態(tài)數(shù)據(jù)成員 3.5.2 靜態(tài)函數(shù)成員,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.5.1 靜態(tài)數(shù)據(jù)成員

29、B,類屬性是描述類的所有對(duì)象同一特征的一個(gè)數(shù)據(jù)成員,對(duì)于任何對(duì)象實(shí)例,類屬性的值是相同的。 說明靜態(tài)數(shù)據(jù)成員的語句格式是: static 類型說明符 成員名; 用關(guān)鍵字static聲明 該類的所有對(duì)象維護(hù)該成員的同一個(gè)拷貝,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.5.2 靜態(tài)函數(shù)成員,和靜態(tài)數(shù)據(jù)成員一樣,靜態(tài)成員函數(shù)也屬于整個(gè)類,由同一個(gè)類的所有對(duì)象共同維護(hù),被這些對(duì)象所共享。 靜態(tài)成員函數(shù)的定義: static 類型 函數(shù)名(形參) 函數(shù)體 公有靜態(tài)成員函數(shù),可以通過類名或?qū)ο竺麃碚{(diào)用; 一般的非靜態(tài)成員函數(shù)只能通過對(duì)象名來調(diào)用。,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)

30、計(jì),3.5.2 靜態(tài)函數(shù)成員,靜態(tài)成員函數(shù)可以直接訪問該類的靜態(tài)數(shù)據(jù)和函數(shù)成員;而訪問非靜態(tài)數(shù)據(jù)成員,必須通過參數(shù)傳遞方式得到對(duì)象名,然后通過對(duì)象名來訪問。,class Rect public: static void f(Rect r); private: int y; ; void Rect:f(Rect r) couty; /錯(cuò)誤,不能訪問y coutr.y; /正確 ,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.6 常類型B,3.6.1 常引用 3.6.2 常對(duì)象 3.6.3 用const修飾的類成員,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.6.1 常引用,如果

31、在說明引用時(shí)加上const修飾符,被說明的引用為常引用。常引用所引用的對(duì)象是不能被更改的。如果用常引用做形參,便可防止對(duì)實(shí)參的意外修改。,void show(const int ,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.6.2 常對(duì)象,常對(duì)象,就是數(shù)據(jù)成員值在對(duì)象的整個(gè)生存期間內(nèi)不能改變的對(duì)象。也就是說常對(duì)象必須進(jìn)行初始化,而且不能被更新。 實(shí)例const 1,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),常對(duì)象 定義格式: const 定義常對(duì)象要進(jìn)行初始化,該對(duì)象不能再被更新,修飾符const可以放在類名后面,也可以放在類名前面。 常指針和常引用 常指針也是使用關(guān)鍵字co

32、nst來修飾的。有三種形式。 第一種形式是將const放在指針變量的類型之前,表示聲明一個(gè)指向常量的指針。此時(shí),在程序中不能通過指針來改變它所指向的數(shù)據(jù)值,但可以改變指針本身的值。 第二種形式是將const放在指針定義語句的指針名前,表示指針本身是一個(gè)常量,稱為指針常量或常指針。因此,不能改變這種指針變量的值,但可以改變指變量所指向的數(shù)據(jù)值。 第三種形式是將const在上述兩個(gè)地方都加,表示聲明一個(gè)指向常量的指針常量,指針本身的值不可改變,而且它所指向的數(shù)據(jù)的值也不能通過指針改變。(1),2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),例Ex_ConstPara 常參數(shù)的函數(shù)傳遞。 #inc

33、lude class COne public: void print(const int *p, int n) / 使用常參數(shù) cout*p; for (int i = 1; in; i+) cout, *(p+i); cout成員名,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.7.3 動(dòng)態(tài)配置對(duì)象內(nèi)存,在C+中我們可以通過動(dòng)態(tài)內(nèi)存分配技術(shù),在程序?qū)嶋H運(yùn)行過程中按照實(shí)際需要申請(qǐng)適量的內(nèi)存,使用結(jié)束后還可以釋放,這種在程序運(yùn)行過程中申請(qǐng)和釋放內(nèi)存單元的過程一般稱為建立和刪除。 建立和刪除堆對(duì)象使用兩個(gè)運(yùn)算符: new和delete,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.

34、7.3 動(dòng)態(tài)配置對(duì)象內(nèi)存,(1)運(yùn)算符new的功能是動(dòng)態(tài)分配內(nèi)存,或者稱為動(dòng)態(tài)創(chuàng)建堆對(duì)象,例如: Rect *pRect; pRect=new Rect(0,0,100,100); 運(yùn)算符delete用來刪除由new建立的對(duì)象,釋放指針?biāo)赶虻膬?nèi)存空間,例如: delete pRect;,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.7.4 this指針,隱含于每一個(gè)類的成員函數(shù)中的特殊指針。 明確地指出了成員函數(shù)當(dāng)前所操作的數(shù)據(jù)所屬的對(duì)象。 當(dāng)通過一個(gè)對(duì)象調(diào)用成員函數(shù)時(shí),系統(tǒng)先將該對(duì)象的地址賦給this指針,然后調(diào)用成員函數(shù),成員函數(shù)對(duì)對(duì)象的數(shù)據(jù)成員進(jìn)行操作時(shí),就隱含使用了this指

35、針。,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),對(duì)一個(gè)對(duì)象調(diào)用成員函數(shù)時(shí),編譯器將對(duì)象的地址賦給this指針,再調(diào)用成員函數(shù),每次成員函數(shù)存取數(shù)據(jù)成員時(shí),由隱含作用this指針??梢杂?this來標(biāo)識(shí)調(diào)用該成員函數(shù)的對(duì)象。 實(shí)例pointer,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.8 類的組合,3.8.1 類的組合 3.8.2 前向引用聲明,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.8.1 類的組合,組合的概念 類的組合描述的是一個(gè)類內(nèi)嵌其他類的對(duì)象作為成員的情況,它們之間的關(guān)系是一種包含與被包含的關(guān)系。 當(dāng)創(chuàng)建類的對(duì)象時(shí),如果這個(gè)類具有內(nèi)嵌對(duì)象成員 ,那么

36、各個(gè)內(nèi)嵌對(duì)象也將被自動(dòng)創(chuàng)建。,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.8.1 類的組合,類組合的構(gòu)造函數(shù)設(shè)計(jì) 在創(chuàng)建對(duì)象時(shí)既要對(duì)本類的基本數(shù)據(jù)成員進(jìn)行初始化,又要對(duì)內(nèi)嵌對(duì)象成員初始化。 組合類構(gòu)造函數(shù)的聲明形式: 類名:類名(形參表) :內(nèi)嵌對(duì)象1(參數(shù)),內(nèi)嵌對(duì)象2(參數(shù)),. 類的初始化 ,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.8.1 類的組合,類組合的構(gòu)造函數(shù)調(diào)用 構(gòu)造函數(shù)調(diào)用順序:先調(diào)用內(nèi)嵌對(duì)象的構(gòu)造函數(shù)(按內(nèi)嵌時(shí)的聲明順序,先聲明者先構(gòu)造),然后調(diào)用本類的構(gòu)造函數(shù)。(析構(gòu)函數(shù)的調(diào)用順序相反) 若調(diào)用默認(rèn)構(gòu)造函數(shù)(即無形參的),則內(nèi)嵌對(duì)象的初始化也將調(diào)用相應(yīng)的默認(rèn)構(gòu)造函數(shù)。,2020年6月20日星期六,C+面向?qū)ο蟪绦蛟O(shè)計(jì),3.8.2 前向引用聲明,類應(yīng)該先聲明,后使用 如果遇到兩個(gè)類相互引用的情

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論