C第9章 面向?qū)ο蟪绦虻挠?jì)基礎(chǔ)_第1頁(yè)
C第9章 面向?qū)ο蟪绦虻挠?jì)基礎(chǔ)_第2頁(yè)
C第9章 面向?qū)ο蟪绦虻挠?jì)基礎(chǔ)_第3頁(yè)
C第9章 面向?qū)ο蟪绦虻挠?jì)基礎(chǔ)_第4頁(yè)
C第9章 面向?qū)ο蟪绦虻挠?jì)基礎(chǔ)_第5頁(yè)
已閱讀5頁(yè),還剩57頁(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、 第第9 9章章 面向?qū)ο蟪绦蛟O(shè)計(jì)基礎(chǔ)面向?qū)ο蟪绦蛟O(shè)計(jì)基礎(chǔ) 9.1 9.1 面向?qū)ο蟪绦蛟O(shè)計(jì)概述面向?qū)ο蟪绦蛟O(shè)計(jì)概述9.29.2 類(lèi)和對(duì)象類(lèi)和對(duì)象9.39.3 帶默認(rèn)參數(shù)的成員函數(shù)和重載函數(shù)帶默認(rèn)參數(shù)的成員函數(shù)和重載函數(shù)9.49.4 構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)9.59.5 對(duì)象成員和靜態(tài)成員對(duì)象成員和靜態(tài)成員9.69.6 友元友元9.79.7 類(lèi)模板和模板類(lèi)類(lèi)模板和模板類(lèi)習(xí)題習(xí)題cpu指令系統(tǒng),由0、1序列構(gòu)成的指令碼組成如:10000000 加 10010000 減用助記符號(hào)描述的指令系統(tǒng)如 add a, b面向機(jī)器的語(yǔ)言程序設(shè)計(jì)是數(shù)據(jù)被加工的過(guò)程客觀世界可以分類(lèi),對(duì)象是類(lèi)的實(shí)例對(duì)

2、象是數(shù)據(jù)和方法的封裝對(duì)象間通過(guò)發(fā)送和接受消息發(fā)生聯(lián)系程序設(shè)計(jì)關(guān)鍵是定義類(lèi),并由類(lèi)派生對(duì)象9.1 9.1 面向?qū)ο蟪绦蛟O(shè)計(jì)概述面向?qū)ο蟪绦蛟O(shè)計(jì)概述9.1.1 9.1.1 面向?qū)ο笫擒浖椒▽W(xué)的返璞歸真面向?qū)ο笫擒浖椒▽W(xué)的返璞歸真 客觀世界是由許多具體的事物、抽象的概念、客觀世界是由許多具體的事物、抽象的概念、規(guī)則等組成的,我們將任何感興趣或要加以研規(guī)則等組成的,我們將任何感興趣或要加以研究的事、物、概念統(tǒng)稱為對(duì)象究的事、物、概念統(tǒng)稱為對(duì)象objectobject。每個(gè)對(duì)象都有各自的內(nèi)部狀態(tài)和運(yùn)動(dòng)規(guī)律,每個(gè)對(duì)象都有各自的內(nèi)部狀態(tài)和運(yùn)動(dòng)規(guī)律,不同對(duì)象之間通過(guò)消息傳遞進(jìn)行相互作用和聯(lián)不同對(duì)象之間通過(guò)

3、消息傳遞進(jìn)行相互作用和聯(lián)系就構(gòu)成了各種不同的系統(tǒng)。面向?qū)ο蟮姆椒ㄏ稻蜆?gòu)成了各種不同的系統(tǒng)。面向?qū)ο蟮姆椒ㄕ且詫?duì)象作為最基本元素的一種分析問(wèn)題和正是以對(duì)象作為最基本元素的一種分析問(wèn)題和解決問(wèn)題的方法。解決問(wèn)題的方法。傳統(tǒng)的結(jié)構(gòu)化方法強(qiáng)調(diào)的是功能抽象和模塊化,每傳統(tǒng)的結(jié)構(gòu)化方法強(qiáng)調(diào)的是功能抽象和模塊化,每個(gè)模塊都是一個(gè)過(guò)程。結(jié)構(gòu)化方法處理問(wèn)題是以過(guò)程為個(gè)模塊都是一個(gè)過(guò)程。結(jié)構(gòu)化方法處理問(wèn)題是以過(guò)程為中心的。面向?qū)ο髲?qiáng)調(diào)的是功能抽象和數(shù)據(jù)抽象,用對(duì)中心的。面向?qū)ο髲?qiáng)調(diào)的是功能抽象和數(shù)據(jù)抽象,用對(duì)象來(lái)描述事物和過(guò)程。而對(duì)象包含數(shù)據(jù)和對(duì)數(shù)據(jù)的操作,象來(lái)描述事物和過(guò)程。而對(duì)象包含數(shù)據(jù)和對(duì)數(shù)據(jù)的操作,是對(duì)

4、數(shù)據(jù)和功能的抽象和統(tǒng)一。面向?qū)ο蠓椒ㄌ幚韱?wèn)題是對(duì)數(shù)據(jù)和功能的抽象和統(tǒng)一。面向?qū)ο蠓椒ㄌ幚韱?wèn)題的過(guò)程是對(duì)一系列相關(guān)對(duì)象的操縱,即發(fā)送消息到目標(biāo)的過(guò)程是對(duì)一系列相關(guān)對(duì)象的操縱,即發(fā)送消息到目標(biāo)對(duì)象中,由對(duì)象執(zhí)行相應(yīng)的操作。因此面向?qū)ο蠓椒ㄊ菍?duì)象中,由對(duì)象執(zhí)行相應(yīng)的操作。因此面向?qū)ο蠓椒ㄊ且詫?duì)象為中心的,這種以對(duì)象為中心的方法更自然、更以對(duì)象為中心的,這種以對(duì)象為中心的方法更自然、更直接地反映現(xiàn)實(shí)世界的問(wèn)題空間,具有獨(dú)特的抽象性、直接地反映現(xiàn)實(shí)世界的問(wèn)題空間,具有獨(dú)特的抽象性、封裝性、繼承性和多態(tài)性,能更好地適應(yīng)復(fù)雜大系統(tǒng)不封裝性、繼承性和多態(tài)性,能更好地適應(yīng)復(fù)雜大系統(tǒng)不斷發(fā)展與變化的要求。斷發(fā)展與

5、變化的要求。在在1919世紀(jì)世紀(jì)8080年代,年代,c c語(yǔ)言成為一種極其流行、應(yīng)用語(yǔ)言成為一種極其流行、應(yīng)用非常廣泛的語(yǔ)言。非常廣泛的語(yǔ)言。c+c+是在是在c c語(yǔ)言的基礎(chǔ)上進(jìn)行擴(kuò)充,語(yǔ)言的基礎(chǔ)上進(jìn)行擴(kuò)充,并增加了類(lèi)似并增加了類(lèi)似smalltalksmalltalk語(yǔ)言中相應(yīng)的對(duì)象機(jī)制。語(yǔ)言中相應(yīng)的對(duì)象機(jī)制。它將它將“類(lèi)類(lèi)”看作是用戶定義類(lèi)型,使其擴(kuò)充比較自看作是用戶定義類(lèi)型,使其擴(kuò)充比較自然。然。c+c+以其高效的執(zhí)行效率贏得了廣大程序設(shè)計(jì)以其高效的執(zhí)行效率贏得了廣大程序設(shè)計(jì)員的青睞是一種混合型的面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言,員的青睞是一種混合型的面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言,由于它的出現(xiàn),才使面向?qū)ο蟮?/p>

6、程序設(shè)計(jì)語(yǔ)言越來(lái)由于它的出現(xiàn),才使面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言越來(lái)越得到重視和廣泛的應(yīng)用。越得到重視和廣泛的應(yīng)用。 (4) c家族家族9.1.3 9.1.3 面向?qū)ο蟪绦蚍治雒嫦驅(qū)ο蟪绦蚍治鰋oaooa與設(shè)計(jì)與設(shè)計(jì)oodood的的基本步驟基本步驟面向?qū)ο蟮拈_(kāi)發(fā)方法可分為四個(gè)階段:面向?qū)ο蟮拈_(kāi)發(fā)方法可分為四個(gè)階段:(1) 系統(tǒng)調(diào)查和需求分析。系統(tǒng)調(diào)查和需求分析。即對(duì)應(yīng)用系統(tǒng)將要實(shí)現(xiàn)的功能即對(duì)應(yīng)用系統(tǒng)將要實(shí)現(xiàn)的功能以及用戶對(duì)系統(tǒng)開(kāi)發(fā)的需求進(jìn)行調(diào)查研究。這是所有開(kāi)以及用戶對(duì)系統(tǒng)開(kāi)發(fā)的需求進(jìn)行調(diào)查研究。這是所有開(kāi)發(fā)方法都必須進(jìn)行的。發(fā)方法都必須進(jìn)行的。(2) 分析問(wèn)題的性質(zhì)和求解問(wèn)題。分析問(wèn)題的性質(zhì)和求解問(wèn)

7、題。在繁雜的問(wèn)題域中抽象在繁雜的問(wèn)題域中抽象地識(shí)別出對(duì)象及其行為、結(jié)構(gòu)、屬性、方法等。這一階地識(shí)別出對(duì)象及其行為、結(jié)構(gòu)、屬性、方法等。這一階段稱為面向?qū)ο蠓治觯?jiǎn)稱為段稱為面向?qū)ο蠓治?,?jiǎn)稱為ooa。 (3) 整理問(wèn)題。整理問(wèn)題。即對(duì)分析的結(jié)果作進(jìn)一步的抽象、歸類(lèi)、即對(duì)分析的結(jié)果作進(jìn)一步的抽象、歸類(lèi)、整理,最終以規(guī)范的形式描述對(duì)象和類(lèi)。這一步稱為面整理,最終以規(guī)范的形式描述對(duì)象和類(lèi)。這一步稱為面向?qū)ο笤O(shè)計(jì),簡(jiǎn)稱為向?qū)ο笤O(shè)計(jì),簡(jiǎn)稱為ood。(4) 程序?qū)崿F(xiàn)。程序?qū)崿F(xiàn)。即用面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言將上一步整即用面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言將上一步整理的對(duì)象和類(lèi)的描述映射為應(yīng)用程序軟件。這一步一般理的對(duì)象和

8、類(lèi)的描述映射為應(yīng)用程序軟件。這一步一般稱為面向?qū)ο蟪绦蛟O(shè)計(jì),簡(jiǎn)稱為稱為面向?qū)ο蟪绦蛟O(shè)計(jì),簡(jiǎn)稱為oop。面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)oop9.2 9.2 類(lèi)和對(duì)象類(lèi)和對(duì)象9.2.1 9.2.1 類(lèi)類(lèi)n類(lèi)是類(lèi)是c+c+的的數(shù)據(jù)抽象和封裝機(jī)制數(shù)據(jù)抽象和封裝機(jī)制,它描述了一組具有相同屬性,它描述了一組具有相同屬性(數(shù)據(jù)成員)和行為特征(成員函數(shù))的對(duì)象。在系統(tǒng)實(shí)現(xiàn)中,(數(shù)據(jù)成員)和行為特征(成員函數(shù))的對(duì)象。在系統(tǒng)實(shí)現(xiàn)中,類(lèi)是一種類(lèi)是一種共享共享機(jī)制,它提供了本類(lèi)對(duì)象共享的操作實(shí)現(xiàn)。類(lèi)是機(jī)制,它提供了本類(lèi)對(duì)象共享的操作實(shí)現(xiàn)。類(lèi)是代碼復(fù)用的基本單位,它可以實(shí)現(xiàn)抽象數(shù)據(jù)類(lèi)型,創(chuàng)建對(duì)象,代碼復(fù)用的基本單

9、位,它可以實(shí)現(xiàn)抽象數(shù)據(jù)類(lèi)型,創(chuàng)建對(duì)象,實(shí)現(xiàn)屬性和行為的封裝實(shí)現(xiàn)屬性和行為的封裝n對(duì)象是類(lèi)的實(shí)例。對(duì)象是類(lèi)的實(shí)例。類(lèi)是對(duì)一組具有相同特征的對(duì)象的抽象描述,類(lèi)是對(duì)一組具有相同特征的對(duì)象的抽象描述,所有這些對(duì)象都是這個(gè)類(lèi)的實(shí)例。所有這些對(duì)象都是這個(gè)類(lèi)的實(shí)例。n類(lèi)提供了完整的解決特定問(wèn)題的能力,因?yàn)轭?lèi)描述了數(shù)據(jù)結(jié)構(gòu)類(lèi)提供了完整的解決特定問(wèn)題的能力,因?yàn)轭?lèi)描述了數(shù)據(jù)結(jié)構(gòu)(對(duì)象屬性)、算法(對(duì)象行為)和外部接口(消息協(xié)議)。(對(duì)象屬性)、算法(對(duì)象行為)和外部接口(消息協(xié)議)。n在在c+c+語(yǔ)言中,一個(gè)類(lèi)的定義包含語(yǔ)言中,一個(gè)類(lèi)的定義包含數(shù)據(jù)成員和成員函數(shù)數(shù)據(jù)成員和成員函數(shù)兩部分兩部分內(nèi)容。數(shù)據(jù)成員定義該

10、類(lèi)對(duì)象的屬性,不同對(duì)象的屬性值可以內(nèi)容。數(shù)據(jù)成員定義該類(lèi)對(duì)象的屬性,不同對(duì)象的屬性值可以不同;成員函數(shù)定義了該類(lèi)對(duì)象的操作即行為。不同;成員函數(shù)定義了該類(lèi)對(duì)象的操作即行為。 1. 1. 類(lèi)的定義類(lèi)的定義類(lèi)由三部分組成:類(lèi)名、數(shù)據(jù)成員和成員函數(shù)。類(lèi)由三部分組成:類(lèi)名、數(shù)據(jù)成員和成員函數(shù)。class 類(lèi)名類(lèi)名 private: / 私有數(shù)據(jù)成員和成員函數(shù)私有數(shù)據(jù)成員和成員函數(shù) public: / 公有數(shù)據(jù)成員和成員函數(shù)公有數(shù)據(jù)成員和成員函數(shù) protected: / 保護(hù)的數(shù)據(jù)成員和成員函數(shù)保護(hù)的數(shù)據(jù)成員和成員函數(shù) ;有關(guān)類(lèi)定義的幾點(diǎn)說(shuō)明1:(1) class是定義類(lèi)的關(guān)鍵字,類(lèi)名是一種標(biāo)識(shí)符,必

11、須符合c+標(biāo)識(shí)符的命名規(guī)則。內(nèi)是類(lèi)的定義體部分,說(shuō)明該類(lèi)的成員,類(lèi)的成員包括數(shù)據(jù)成員和成員函數(shù)。(2) 類(lèi)成員的三種訪問(wèn)控制權(quán)限: 類(lèi)有三種訪問(wèn)控制權(quán)限,分別是private(私有成員)、public(公有成員)、protected(保護(hù)成員),在每一種訪問(wèn)控制權(quán)限下,均可以定義數(shù)據(jù)成員和成員函數(shù)。(3) 類(lèi)具有封裝性,c+中的數(shù)據(jù)封裝通過(guò)類(lèi)來(lái)實(shí)現(xiàn)。外部不能隨意訪問(wèn)說(shuō)明為protected和private的成員。(4) 一般情況下,類(lèi)名的第一個(gè)字母大寫(xiě)。(5) 由于類(lèi)的公有成員提供了一個(gè)類(lèi)的接口,所以一般情況下,先定義公有成員,再定義保護(hù)成員和私有成員,這樣可以在閱讀時(shí)首先了解這個(gè)類(lèi)的接口。

12、(6) 數(shù)據(jù)成員可以是任何數(shù)據(jù)類(lèi)型,但是不能用自動(dòng)(auto)、寄存器(register)或外部(extern)進(jìn)行說(shuō)明。(7) 注意在定義類(lèi)時(shí),不允許初始化數(shù)據(jù)成員。 有關(guān)類(lèi)定義的幾點(diǎn)說(shuō)明2:(8) 結(jié)構(gòu)體和類(lèi)的區(qū)別c+語(yǔ)言中的結(jié)構(gòu)可有數(shù)據(jù)成員和函數(shù)成員。在默認(rèn)情況下,結(jié)構(gòu)體中的數(shù)據(jù)成員和成員函數(shù)都是公有的,而在類(lèi)中是私有的。我們可以隨意修改結(jié)構(gòu)體變量中的數(shù)據(jù),這樣對(duì)數(shù)據(jù)的操作是很不安全的,我們不能通過(guò)結(jié)構(gòu)體對(duì)數(shù)據(jù)進(jìn)行保護(hù)和控制;在結(jié)構(gòu)體中,數(shù)據(jù)和其相應(yīng)的操作是分離的,使得程序的復(fù)雜性難以控制,而且程序的可重用性不好,嚴(yán)重影響了軟件的生產(chǎn)效率。所以,一般我們僅在描述數(shù)據(jù)成員時(shí)使用結(jié)構(gòu),當(dāng)既有

13、數(shù)據(jù)成員又有成員函數(shù)時(shí)使用類(lèi)。(9) 注意:在類(lèi)定義時(shí)不要丟掉類(lèi)定義的結(jié)束標(biāo)志分號(hào)。有關(guān)類(lèi)定義的幾點(diǎn)說(shuō)明3:類(lèi)定義實(shí)例例:定義日期類(lèi)class tdate / 定義日期類(lèi)public: / 定義公有成員函數(shù) void set(int m,int d,int y); / 置日期值 int isleapyear(); / 判是否閏年 void print(); / 輸出日期值private: / 定義私有數(shù)據(jù)成員 int month; int day; int year; / 類(lèi)定義體的結(jié)束2. 成員函數(shù)的定義類(lèi)的數(shù)據(jù)成員說(shuō)明對(duì)象的特征,而成員函數(shù)決定對(duì)象的操作行為。成員函數(shù)是程序算法實(shí)現(xiàn)的部分,

14、是對(duì)封裝的數(shù)據(jù)進(jìn)行操作的唯一途徑。類(lèi)的成員函數(shù)有兩種定義方法:外聯(lián)定義和內(nèi)聯(lián)定義。(1) 外聯(lián)成員函數(shù)(外聯(lián)函數(shù))外聯(lián)定義成員函數(shù)是指在類(lèi)定義體中聲明成員函數(shù),而在類(lèi)外定義成員函數(shù)。作用域區(qū)分符:指明一個(gè)成員函數(shù)或數(shù)據(jù)成員所在的類(lèi)。:前若不跟類(lèi)名,則成為全局?jǐn)?shù)據(jù)或全局函數(shù)(非成員函數(shù))。在類(lèi)外定義成員函數(shù)的具體形式為:返回值類(lèi)型 類(lèi)名:成員函數(shù)名(形式參數(shù)表) / 函數(shù)體void tdate:set(int m,int d,int y) / void tdate:set(int m,int d,int y) / 置日期值置日期值 month=m; day=d; year=y; month=m;

15、 day=d; year=y; int tdate:isleapyear() / int tdate:isleapyear() / 判是否閏年判是否閏年 return (year%4=0&year%100!=0)|(year%400=0); return (year%4=0&year%100!=0)|(year%400=0); void tdate:print() / void tdate:print() / 輸出日期值輸出日期值 coutmonth/day /yearendl; coutmonth/day /year成員或 (*對(duì)象指針名).公有成員(3) 通過(guò)對(duì)象的引用調(diào)用

16、成員格式:對(duì)象的引用.成員需要注意,只有用public定義的公有成員才能使用圓點(diǎn)操作符訪問(wèn)。對(duì)象中的私有成員是類(lèi)中隱藏的數(shù)據(jù),類(lèi)的外部不能訪問(wèn)對(duì)象的私有成員,只能通過(guò)該類(lèi)的公有成員函數(shù)來(lái)訪問(wèn)它們。 class myclock private: int hour, minute, second; public: void init(); void updata(); void display();myclock clock,*pclock; / 定義對(duì)象clock和指向myclock類(lèi)對(duì)象的指針pclockclock.init(); / 通過(guò)對(duì)象訪問(wèn)公有成員函數(shù)pclock=&clock

17、; / 指針pclock指向?qū)ο骳lockpclock-display(); / 通過(guò)指針訪問(wèn)成員函數(shù)clock.hour=4; / 錯(cuò)誤,因?yàn)閷?duì)象不能訪問(wèn)其私有成員9.2.3 9.2.3 名字解析和名字解析和thisthis指針指針(1) 名字解析在調(diào)用成員函數(shù)時(shí),通常使用縮寫(xiě)形式,如上例中的語(yǔ)句s.set(2,15,1998);就是s.tdate:set(2,15,1998);的縮寫(xiě),因此可以定義兩個(gè)或多個(gè)類(lèi)的具有相同名字的成員而不會(huì)產(chǎn)生二義性。(2) this指針當(dāng)一個(gè)成員函數(shù)被調(diào)用時(shí),自動(dòng)向它傳遞一個(gè)隱含的參數(shù),該參數(shù)是一個(gè)指向接受該函數(shù)調(diào)用的對(duì)象的指針,在程序中可以使用關(guān)鍵字this

18、來(lái)引用該指針,因此稱該指針為this指針。this指針是c+實(shí)現(xiàn)封裝的一種機(jī)制,它將成員和用于操作這些成員的成員函數(shù)連接在一起。 this指針void tdate:set(int m,int d,int y) / 置日期值 month=m; day=d; year=y;void tdate:set(int m,int d,int y) / 置日期值 this-month=m; this-day=d; this-year=y;使用this指針,保證了每個(gè)對(duì)象可以擁有不同的數(shù)據(jù)成員,但處理這些數(shù)據(jù)成員的代碼可以被所有的對(duì)象共享。9.3 帶默認(rèn)參數(shù)的成員函數(shù)和重載函數(shù)9.3.1 帶默認(rèn)參數(shù)的函數(shù)帶默

19、認(rèn)參數(shù)的函數(shù)n如果在函數(shù)說(shuō)明或函數(shù)定義中為形參指定一個(gè)默認(rèn)值,則稱此函數(shù)為帶默認(rèn)參數(shù)的函數(shù)。如果在調(diào)用時(shí),指定了形參相對(duì)應(yīng)的實(shí)參,則形參使用實(shí)參的值,如果未指定相應(yīng)的實(shí)參,則形參使用默認(rèn)值,這為函數(shù)的使用提供了很大的便利。 n指定了初始值的參數(shù)稱為默認(rèn)參數(shù)。如果函數(shù)有多個(gè)默認(rèn)參數(shù),則默認(rèn)參數(shù)必須是從右向左定義,并且在一個(gè)默認(rèn)參數(shù)的右邊不能有未指定默認(rèn)值的參數(shù)。 n在普通函數(shù)中可以帶有默認(rèn)參數(shù),同樣,類(lèi)的成員函數(shù)也可以有默認(rèn)形參值,其調(diào)用規(guī)則同普通函數(shù)?!纠?.1】帶默認(rèn)參數(shù)的函數(shù)。9.3.2 函數(shù)重載nc+編譯系統(tǒng)允許為兩個(gè)或兩個(gè)以上的函數(shù)取相同的函數(shù)名,但是形參的個(gè)數(shù)或者形參的類(lèi)型不應(yīng)相同,

20、編譯系統(tǒng)會(huì)根據(jù)實(shí)參和形參的類(lèi)型及個(gè)數(shù)的最佳匹配,自動(dòng)確定調(diào)用哪一個(gè)函數(shù),這就是所謂的函數(shù)重載。n函數(shù)重載使函數(shù)方便使用,便于記憶,也使程序設(shè)計(jì)更加靈活,增加程序的可讀性。 n函數(shù)重載無(wú)需特別聲明,只要所定義的函數(shù)與已經(jīng)定義的同名函數(shù)形參形式不完全相同,c+編譯器就認(rèn)為是函數(shù)的重載。 n【例9.2】重載函數(shù)應(yīng)用舉例在使用重載函數(shù)時(shí)要注意在使用重載函數(shù)時(shí)要注意: 不可以定義兩個(gè)具有相同名稱、相同參數(shù)類(lèi)型和相同參數(shù)個(gè)數(shù),只是函數(shù)返回值不同的函數(shù)。例如,以下定義是c+不允許的: int func(int x); float func(int x); 如果某個(gè)函數(shù)參數(shù)有默認(rèn)值,必須保證其參數(shù)默認(rèn)后調(diào)用形

21、式不與其它函數(shù)混淆。例如下面的重載是錯(cuò)誤的: int f(int a, float b); void f(int a, float b, int c=0);9.4 9.4 構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)當(dāng)建立一個(gè)對(duì)象時(shí),對(duì)象的狀態(tài)(數(shù)據(jù)成員的取值)是不確定的。但對(duì)象表達(dá)了現(xiàn)實(shí)世界的實(shí)體,因此,一旦建立對(duì)象,必須有一個(gè)有意義的初始值。c+有一個(gè)稱為構(gòu)造函數(shù)的特殊成員函數(shù),它可自動(dòng)進(jìn)行對(duì)象的初始化。而析構(gòu)函數(shù)在對(duì)象撤消時(shí)執(zhí)行清理任務(wù),進(jìn)行善后處理。9.4.1 構(gòu)造函數(shù) 對(duì)象的初始化是指對(duì)象數(shù)據(jù)成員的初始化,在使用對(duì)象前,一定要初始化。由于數(shù)據(jù)成員一般為私有的(private),所以不能直接賦

22、值。對(duì)對(duì)象初始化有以下兩種方法:類(lèi)中提供一個(gè)普通成員函數(shù)來(lái)初始化,但是會(huì)造成使用上的不便(使用對(duì)象前必須顯式調(diào)用該函數(shù))和不安全(未調(diào)用初始化函數(shù)就使用對(duì)象)。另外一種方法是使用構(gòu)造函數(shù)對(duì)對(duì)象進(jìn)行初始化。1. 1. 構(gòu)造函數(shù)(構(gòu)造函數(shù)(constructorconstructor)構(gòu)造函數(shù)是一個(gè)與類(lèi)同名,沒(méi)有返回值的特殊成員函數(shù)。一般用于初始化類(lèi)的數(shù)據(jù)成員和創(chuàng)建對(duì)象,每當(dāng)創(chuàng)建一個(gè)對(duì)象時(shí)(包括使用new動(dòng)態(tài)創(chuàng)建對(duì)象),編譯系統(tǒng)就自動(dòng)調(diào)用構(gòu)造函數(shù)。構(gòu)造函數(shù)象類(lèi)以外的一般函數(shù)和類(lèi)成員函數(shù)一樣可以重載和帶默認(rèn)參數(shù)?!纠?.3】構(gòu)造函數(shù)的定義、使用和重載。 2帶默認(rèn)參數(shù)的構(gòu)造函數(shù)構(gòu)造函數(shù)也可以使用默認(rèn)參

23、數(shù),但要注意,必須保證函數(shù)形式參數(shù)默認(rèn)后,函數(shù)形式不能與其它構(gòu)造函數(shù)完全相同。即在使用帶默認(rèn)參數(shù)的構(gòu)造函數(shù)時(shí),要注意避免二義性。所帶的參數(shù)個(gè)數(shù)或參數(shù)類(lèi)型必須有所不同,否則系統(tǒng)調(diào)用時(shí)會(huì)出現(xiàn)二義性?!纠?.4】帶默認(rèn)參數(shù)的構(gòu)造函數(shù)。3.默認(rèn)構(gòu)造函數(shù)c+規(guī)定,每個(gè)類(lèi)必須有一個(gè)構(gòu)造函數(shù),沒(méi)有構(gòu)造函數(shù),就不能創(chuàng)建任何對(duì)象。若用戶未顯式定義一個(gè)類(lèi)的構(gòu)造函數(shù),則c+提供一個(gè)默認(rèn)的構(gòu)造函數(shù),也叫默認(rèn)構(gòu)造函數(shù),該默認(rèn)構(gòu)造函數(shù)是個(gè)無(wú)參構(gòu)造函數(shù),它僅負(fù)責(zé)創(chuàng)建對(duì)象,而不做任何初始化工作。只要一個(gè)類(lèi)定義了一個(gè)構(gòu)造函數(shù)(不一定是無(wú)參構(gòu)造函數(shù)),c+就不再提供默認(rèn)的構(gòu)造函數(shù)。如果為類(lèi)定義了一個(gè)帶參數(shù)的構(gòu)造函數(shù),還想要使用無(wú)

24、參構(gòu)造函數(shù),則必須自己定義。與變量定義類(lèi)似,在用默認(rèn)構(gòu)造函數(shù)創(chuàng)建對(duì)象時(shí),如果創(chuàng)建的是全局對(duì)象或靜態(tài)對(duì)象,則對(duì)象的位模式全為0,否則,對(duì)象值是隨機(jī)的。【例9.5】默認(rèn)構(gòu)造函數(shù) 4. 拷貝構(gòu)造函數(shù)(復(fù)制構(gòu)造函數(shù)) (1) 拷貝構(gòu)造函數(shù) 拷貝構(gòu)造函數(shù)的功能是用一個(gè)已有的對(duì)象來(lái)初始化一個(gè)被創(chuàng)建的同類(lèi)對(duì)象,是一種特殊的構(gòu)造函數(shù),具有一般構(gòu)造函數(shù)的所有特性,當(dāng)創(chuàng)建一個(gè)新對(duì)象時(shí)系統(tǒng)自動(dòng)調(diào)用它;其形參是本類(lèi)對(duì)象的引用,它的特殊功能是將參數(shù)代表的對(duì)象逐域拷貝到新創(chuàng)建的對(duì)象中。 用戶可以根據(jù)自己實(shí)際問(wèn)題的需要定義特定的拷貝構(gòu)造函數(shù),以實(shí)現(xiàn)同類(lèi)對(duì)象之間數(shù)據(jù)成員的傳遞。如果用戶沒(méi)有聲明類(lèi)的拷貝構(gòu)造函數(shù),系統(tǒng)就會(huì)自動(dòng)生

25、成一個(gè)默認(rèn)拷貝構(gòu)造函數(shù),這個(gè)默認(rèn)拷貝構(gòu)造函數(shù)的功能是把初始對(duì)象的每個(gè)數(shù)據(jù)成員的值都復(fù)制到新建立的對(duì)象中??截悩?gòu)造函數(shù)的聲明形式為: 類(lèi)名(類(lèi)名&對(duì)象名);下面定義了一個(gè)下面定義了一個(gè)catcat類(lèi)和類(lèi)和catcat類(lèi)的拷貝構(gòu)造函數(shù):類(lèi)的拷貝構(gòu)造函數(shù):class cat class cat private: private: int age; int age; float weight; float weight; char char * *color;color; public: public: cat(); cat(); cat(cat &); / cat(cat &

26、); / 拷貝構(gòu)造函數(shù)的聲明拷貝構(gòu)造函數(shù)的聲明 void play();void play(); void hunt(); void hunt(); ; cat:cat(cat:cat(cat &othercat &other) ) age = other.age; age = other.age; weight = other.weight; weight = other.weight; color = other.color; color = other.color; 自動(dòng)調(diào)用拷貝構(gòu)造函數(shù)的四種情況 用類(lèi)的一個(gè)對(duì)象去初始化另一個(gè)對(duì)象用類(lèi)的一個(gè)對(duì)象去初始化另一個(gè)對(duì)象cat c

27、at1; cat cat1; cat cat2(cat1); / cat cat2(cat1); / 創(chuàng)建創(chuàng)建 cat2cat2時(shí)系統(tǒng)自動(dòng)調(diào)用拷貝構(gòu)造函數(shù),時(shí)系統(tǒng)自動(dòng)調(diào)用拷貝構(gòu)造函數(shù),用用cat1cat1初始化初始化cat2cat2。 用類(lèi)的一個(gè)對(duì)象去初始化另一個(gè)對(duì)象時(shí)的另外一種形式用類(lèi)的一個(gè)對(duì)象去初始化另一個(gè)對(duì)象時(shí)的另外一種形式cat cat2=cat1; / cat cat2=cat1; / 注意并非注意并非cat cat1,cat2; cat2=cat1;cat cat1,cat2; cat2=cat1; 對(duì)象作為函數(shù)參數(shù)傳遞時(shí),調(diào)用拷貝構(gòu)造函數(shù)對(duì)象作為函數(shù)參數(shù)傳遞時(shí),調(diào)用拷貝構(gòu)造函數(shù)。

28、f(cat a) / f(cat a) / 定義定義f f函數(shù),形參為函數(shù),形參為catcat類(lèi)對(duì)象類(lèi)對(duì)象cat b; / cat b; / 定義對(duì)象定義對(duì)象b bf(b); / f(b); / 進(jìn)行進(jìn)行f f函數(shù)調(diào)用時(shí),系統(tǒng)自動(dòng)調(diào)用拷貝構(gòu)造函數(shù)函數(shù)調(diào)用時(shí),系統(tǒng)自動(dòng)調(diào)用拷貝構(gòu)造函數(shù) 如果函數(shù)的返回值是類(lèi)的對(duì)象,函數(shù)調(diào)用返回時(shí),調(diào)如果函數(shù)的返回值是類(lèi)的對(duì)象,函數(shù)調(diào)用返回時(shí),調(diào)用拷貝構(gòu)造函數(shù)。用拷貝構(gòu)造函數(shù)。cat f() / cat f() / 定義定義f f函數(shù),函數(shù)的返回值為函數(shù),函數(shù)的返回值為catcat類(lèi)的對(duì)象類(lèi)的對(duì)象 cat a; cat a;return a;return a; ca

29、t b; / cat b; / 定義對(duì)象定義對(duì)象b bb=f(); / b=f(); / 調(diào)用調(diào)用f f函數(shù),系統(tǒng)自動(dòng)調(diào)用拷貝構(gòu)造函函數(shù),系統(tǒng)自動(dòng)調(diào)用拷貝構(gòu)造函數(shù)數(shù)5.構(gòu)造初始化表構(gòu)造函數(shù)也可使用構(gòu)造初始化表對(duì)數(shù)據(jù)成員進(jìn)行初始化,其格式為::():(), ()如:circle:circle(float r):radius(r) 成員初始化的次序取決于它們?cè)陬?lèi)定義中的聲明次序,與它們?cè)诔蓡T初始化表中的次序無(wú)關(guān)。6. 類(lèi)類(lèi)型和基本數(shù)據(jù)類(lèi)型的轉(zhuǎn)換 (1) 構(gòu)造函數(shù)用作類(lèi)型轉(zhuǎn)換通過(guò)構(gòu)造函數(shù)用作類(lèi)型轉(zhuǎn)換可以實(shí)現(xiàn)基本數(shù)據(jù)類(lèi)型轉(zhuǎn)換為類(lèi)類(lèi)型。通過(guò)構(gòu)造函數(shù)進(jìn)行類(lèi)型轉(zhuǎn)換必須有一個(gè)前提,那就是此類(lèi)一定要有一個(gè)只帶一

30、個(gè)參數(shù)的構(gòu)造函數(shù),這樣才可以實(shí)現(xiàn)從參數(shù)類(lèi)型向該類(lèi)類(lèi)型的轉(zhuǎn)換,并且這種轉(zhuǎn)換是隱式的。如: class aclass a public: public: a(); a(); a(int); a(int);f(a a) / ff(a a) / f函數(shù)的定義;函數(shù)的定義;f f函數(shù)的形參為函數(shù)的形參為a a類(lèi)的對(duì)象類(lèi)的對(duì)象 f(1); / f(1); / f f函數(shù)的調(diào)用;進(jìn)行函數(shù)的調(diào)用;進(jìn)行f f函數(shù)調(diào)用時(shí)先構(gòu)造一個(gè)函數(shù)調(diào)用時(shí)先構(gòu)造一個(gè)a a類(lèi)對(duì)類(lèi)對(duì)象,象,/ / 調(diào)用調(diào)用a:a(int)a:a(int)進(jìn)行隱式類(lèi)型轉(zhuǎn)換,然后把它傳給進(jìn)行隱式類(lèi)型轉(zhuǎn)換,然后把它傳給函數(shù)函數(shù)f f的形式參數(shù)。的形式參數(shù)

31、。 (2) 類(lèi)類(lèi)型轉(zhuǎn)換函數(shù)類(lèi)類(lèi)型轉(zhuǎn)換函數(shù)用來(lái)類(lèi)類(lèi)型轉(zhuǎn)換函數(shù)用來(lái)將類(lèi)類(lèi)型向基本類(lèi)型轉(zhuǎn)換將類(lèi)類(lèi)型向基本類(lèi)型轉(zhuǎn)換。 在類(lèi)定義體中聲明在類(lèi)定義體中聲明operator type();operator type();其中其中typetype為要轉(zhuǎn)換的基本類(lèi)型名,此函數(shù)既沒(méi)有參數(shù),又為要轉(zhuǎn)換的基本類(lèi)型名,此函數(shù)既沒(méi)有參數(shù),又沒(méi)有返回類(lèi)型,但在函數(shù)體中必須返回具有沒(méi)有返回類(lèi)型,但在函數(shù)體中必須返回具有typetype類(lèi)型的一個(gè)對(duì)類(lèi)型的一個(gè)對(duì)象。象。 定義轉(zhuǎn)換函數(shù)的函數(shù)體定義轉(zhuǎn)換函數(shù)的函數(shù)體類(lèi)名類(lèi)名:opertor type():opertor type() return type return type類(lèi)型

32、的值類(lèi)型的值; ; 使用類(lèi)型轉(zhuǎn)換函數(shù):使用類(lèi)型轉(zhuǎn)換函數(shù)與對(duì)基本類(lèi)型使用類(lèi)型轉(zhuǎn)換函數(shù):使用類(lèi)型轉(zhuǎn)換函數(shù)與對(duì)基本類(lèi)型進(jìn)行強(qiáng)制轉(zhuǎn)換時(shí)一樣,就象進(jìn)行強(qiáng)制轉(zhuǎn)換時(shí)一樣,就象是一種函數(shù)調(diào)用過(guò)程。是一種函數(shù)調(diào)用過(guò)程?!纠纠?.69.6】類(lèi)型轉(zhuǎn)換函數(shù)類(lèi)型轉(zhuǎn)換函數(shù)9.4.2 析構(gòu)函數(shù)(1)類(lèi)的另一個(gè)特殊的成員函數(shù)是析構(gòu)函數(shù)。析構(gòu)函數(shù)的功能是當(dāng)對(duì)象被撤消時(shí),釋放該對(duì)象占用的內(nèi)存空間。析構(gòu)函數(shù)的作用與構(gòu)造函數(shù)正好相反,一般情況下,析構(gòu)函數(shù)執(zhí)行構(gòu)造函數(shù)的逆操作。在對(duì)象消亡時(shí),系統(tǒng)將自動(dòng)調(diào)用析構(gòu)函數(shù),執(zhí)行一些在對(duì)象撤消前必須執(zhí)行的清理任務(wù)。 與構(gòu)造函數(shù)相同的是在定義析構(gòu)函數(shù)時(shí),不能指定任何的返回類(lèi)型,也不能使用void

33、。與構(gòu)造函數(shù)不同的是構(gòu)造函數(shù)可以帶參數(shù),可以重載,而析構(gòu)函數(shù)沒(méi)有參數(shù),每個(gè)類(lèi)只能有一個(gè)析構(gòu)函數(shù)。析構(gòu)函數(shù)的函數(shù)名為類(lèi)名前加。1. 析構(gòu)函數(shù)被自動(dòng)調(diào)用的三種情況(1) 一個(gè)動(dòng)態(tài)分配的對(duì)象被刪除,即使用delete刪除對(duì)象時(shí),編譯系統(tǒng)會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù);(2) 程序運(yùn)行結(jié)束時(shí);(3) 一個(gè)編譯器生成的臨時(shí)對(duì)象不再需要時(shí)。2析構(gòu)函數(shù)的手工調(diào)用 對(duì)象名.類(lèi)名:析構(gòu)函數(shù)名3析構(gòu)函數(shù)與構(gòu)造函數(shù)的調(diào)用順序構(gòu)造函數(shù)和析構(gòu)函數(shù)的調(diào)用順序剛好相反,先構(gòu)造的后析構(gòu)。9.4.2 9.4.2 析構(gòu)函數(shù)析構(gòu)函數(shù)(2)(2)【例【例9.79.7】析構(gòu)函數(shù)和構(gòu)造函數(shù)的調(diào)用順序析構(gòu)函數(shù)和構(gòu)造函數(shù)的調(diào)用順序 9.5 9.5 對(duì)象

34、成員和靜態(tài)成員對(duì)象成員和靜態(tài)成員 對(duì)象成員也稱為類(lèi)的聚集,是指在類(lèi)的定義中數(shù)據(jù)成員可以為其它的類(lèi)對(duì)象,即類(lèi)對(duì)象作為另一個(gè)類(lèi)的數(shù)據(jù)成員。 如果在類(lèi)定義中包含有對(duì)象成員,則在創(chuàng)建類(lèi)對(duì)象時(shí)先調(diào)用對(duì)象成員的構(gòu)造函數(shù),再調(diào)用類(lèi)本身的構(gòu)造函數(shù)。析構(gòu)函數(shù)和構(gòu)造函數(shù)的調(diào)用順序正好相反。從實(shí)現(xiàn)的角度講,實(shí)際上是首先調(diào)用類(lèi)本身的構(gòu)造函數(shù),在執(zhí)行本身構(gòu)造函數(shù)的函數(shù)體之前,調(diào)用成員對(duì)象的構(gòu)造函數(shù),然后再執(zhí)行類(lèi)本身構(gòu)造函數(shù)的函數(shù)體?!纠纠?.89.8】含有對(duì)象成員的類(lèi)的析構(gòu)函數(shù)和構(gòu)含有對(duì)象成員的類(lèi)的析構(gòu)函數(shù)和構(gòu)造函數(shù)的調(diào)用順序舉例。造函數(shù)的調(diào)用順序舉例。 9.5.2 靜態(tài)成員 在類(lèi)的定義中,它的數(shù)據(jù)成員和成員函數(shù)可以

35、聲明成靜態(tài)的,即用關(guān)鍵字static,這些成員就被稱為靜態(tài)成員。它的特征是不管這個(gè)類(lèi)創(chuàng)建了多少個(gè)對(duì)象,而其靜態(tài)成員只有一個(gè)副本,此副本被這個(gè)類(lèi)的所有對(duì)象共享。 靜態(tài)成員分為靜態(tài)數(shù)據(jù)成員和靜態(tài)成員函數(shù)。1. 靜態(tài)數(shù)據(jù)成員n靜態(tài)數(shù)據(jù)成員被存放在內(nèi)存的某一單元內(nèi),該類(lèi)的所有對(duì)象都可以訪問(wèn)它。無(wú)論建立多少個(gè)該類(lèi)的對(duì)象,其靜態(tài)成員只有一個(gè)副本。即使沒(méi)有創(chuàng)建任何一個(gè)該類(lèi)對(duì)象,類(lèi)的靜態(tài)成員在存儲(chǔ)空間中也是存在的,可以通過(guò)名字解析運(yùn)算符來(lái)直接訪問(wèn)。n含有靜態(tài)數(shù)據(jù)成員的類(lèi)在創(chuàng)建對(duì)象時(shí)不為靜態(tài)數(shù)據(jù)成員分配存儲(chǔ)空間初始化在類(lèi)體外進(jìn)行。n :=(=(初始值初始值););【例【例9.99.9】靜態(tài)數(shù)據(jù)成員的使用靜態(tài)數(shù)據(jù)

36、成員的使用2.2.靜態(tài)成員函數(shù)靜態(tài)成員函數(shù)(1) 靜態(tài)成員函數(shù)無(wú)this指針,它是同類(lèi)的所有對(duì)象共享的資源,只有一個(gè)共用的副本,因此它不能直接訪問(wèn)非靜態(tài)的數(shù)據(jù)成員,必須要通過(guò)某個(gè)該類(lèi)對(duì)象才能訪問(wèn)。而一般的成員函數(shù)中都含有一個(gè)this指針,指向?qū)ο笞陨?,可以直接訪問(wèn)非靜態(tài)的數(shù)據(jù)成員。(2) 在靜態(tài)成員函數(shù)中訪問(wèn)的基本上是靜態(tài)數(shù)據(jù)成員或全局變量。(3) 由于靜態(tài)成員函數(shù)屬于類(lèi)獨(dú)占的成員函數(shù),因此訪問(wèn)靜態(tài)成員函數(shù)的消息接收者不是類(lèi)對(duì)象,而是類(lèi)自身。在調(diào)用靜態(tài)成員函數(shù)的前面,必須綴上對(duì)象名或類(lèi)名,經(jīng)常用類(lèi)名。(4) 一個(gè)類(lèi)的靜態(tài)成員函數(shù)與非靜態(tài)成員函數(shù)不同,它不需要?jiǎng)?chuàng)建任何該類(lèi)的對(duì)象就可以被調(diào)用。靜態(tài)

37、成員函數(shù)的使用雖然不針對(duì)某一個(gè)特定的對(duì)象,但在使用時(shí)系統(tǒng)中最好已經(jīng)存在此類(lèi)的對(duì)象,否則無(wú)意義。(5) 靜態(tài)成員函數(shù)不能是虛函數(shù)9.6 友元友元n使用friend關(guān)鍵字,程序員可以指派特別的函數(shù)或類(lèi),訪問(wèn)類(lèi)的private成員。使用友元使數(shù)據(jù)封裝性受到削弱,導(dǎo)致程序的可維護(hù)性變差,因此使用友元要慎重。n作為一種編程技術(shù)手段,友元為程序員提供了一種面向?qū)ο蟪绦蚝兔嫦蜻^(guò)程程序相互銜接的接口。友元較為實(shí)際的應(yīng)用是運(yùn)算符重載,從而提高軟件系統(tǒng)的靈活性。n友元分為友元函數(shù)、友元成員和友元類(lèi)三種,友元聲明可放在類(lèi)的公有、私有或保護(hù)部分,結(jié)果一樣。 1.友元函數(shù)是一種說(shuō)明在類(lèi)定義體內(nèi)的友元函數(shù)是一種說(shuō)明在類(lèi)定

38、義體內(nèi)的非成員函數(shù)非成員函數(shù)。friendfriend 返回值類(lèi)型返回值類(lèi)型 函數(shù)名函數(shù)名( (參數(shù)表參數(shù)表););說(shuō)明:說(shuō)明:(1) (1) 友元函數(shù)是在類(lèi)中說(shuō)明的一個(gè)函數(shù),它不是該友元函數(shù)是在類(lèi)中說(shuō)明的一個(gè)函數(shù),它不是該類(lèi)的成員函數(shù),但允許訪問(wèn)該類(lèi)的所有成員。它是類(lèi)的成員函數(shù),但允許訪問(wèn)該類(lèi)的所有成員。它是獨(dú)立于任何類(lèi)的一般的外界函數(shù)。友元并不在類(lèi)的獨(dú)立于任何類(lèi)的一般的外界函數(shù)。友元并不在類(lèi)的范圍中范圍中, ,它們也不用成員選擇符它們也不用成員選擇符(.(.或或-)-)調(diào)用,除非調(diào)用,除非它們是其它類(lèi)的成員。它們是其它類(lèi)的成員。友元函數(shù)的說(shuō)明:友元函數(shù)的說(shuō)明:(2)(2) 由于友元函數(shù)不是

39、類(lèi)的成員,所以沒(méi)有由于友元函數(shù)不是類(lèi)的成員,所以沒(méi)有thisthis指針,指針,訪問(wèn)該類(lèi)的對(duì)象的成員時(shí),必須使用對(duì)象名,而不能訪問(wèn)該類(lèi)的對(duì)象的成員時(shí),必須使用對(duì)象名,而不能直接使用類(lèi)的成員名。直接使用類(lèi)的成員名。(3)(3) 雖然友元函數(shù)是在類(lèi)中說(shuō)明的,但其名字的作用域雖然友元函數(shù)是在類(lèi)中說(shuō)明的,但其名字的作用域在類(lèi)外,作用域的開(kāi)始點(diǎn)在說(shuō)明點(diǎn),結(jié)束點(diǎn)和類(lèi)名相在類(lèi)外,作用域的開(kāi)始點(diǎn)在說(shuō)明點(diǎn),結(jié)束點(diǎn)和類(lèi)名相同。因此,友元說(shuō)明可以代替該函數(shù)的函數(shù)說(shuō)明。同。因此,友元說(shuō)明可以代替該函數(shù)的函數(shù)說(shuō)明。(4)(4) 如果在說(shuō)明友元時(shí)給出了該函數(shù)的函數(shù)體代碼,則如果在說(shuō)明友元時(shí)給出了該函數(shù)的函數(shù)體代碼,則它是

40、內(nèi)聯(lián)的。它是內(nèi)聯(lián)的。(5 5)在類(lèi)外定義友元函數(shù)時(shí),去掉)在類(lèi)外定義友元函數(shù)時(shí),去掉friendfriend關(guān)鍵字。關(guān)鍵字。 【例【例9.109.10】友元函數(shù)的定義和使用友元函數(shù)的定義和使用2. 2. 友元成員友元成員另一個(gè)類(lèi)的成員函數(shù)可以作為某個(gè)類(lèi)的友元另一個(gè)類(lèi)的成員函數(shù)可以作為某個(gè)類(lèi)的友元,只是在聲明友元函數(shù)時(shí)要加上成員函數(shù)所在的類(lèi)只是在聲明友元函數(shù)時(shí)要加上成員函數(shù)所在的類(lèi)名,稱為友元成員。聲明如下:名,稱為友元成員。聲明如下:friend friend 返回值類(lèi)型返回值類(lèi)型 類(lèi)名類(lèi)名成員函數(shù)名成員函數(shù)名( (形形參列表參列表) );與上一種友元比較,此種友元的存取范圍要與上一種友元比較

41、,此種友元的存取范圍要小得多。因?yàn)檫@里的友元函數(shù)只是一個(gè)類(lèi)中的一小得多。因?yàn)檫@里的友元函數(shù)只是一個(gè)類(lèi)中的一個(gè)成員,個(gè)成員,friendfriend授權(quán)該函數(shù)可以訪問(wèn)宣布其為友授權(quán)該函數(shù)可以訪問(wèn)宣布其為友元的類(lèi)中的所有成員。元的類(lèi)中的所有成員?!纠纠?.119.11】友元成員友元成員 某一個(gè)類(lèi)可以是另一個(gè)類(lèi)的友元某一個(gè)類(lèi)可以是另一個(gè)類(lèi)的友元,這樣,這樣作為友元的類(lèi)中的所有成員函數(shù)都可以訪作為友元的類(lèi)中的所有成員函數(shù)都可以訪問(wèn)另一個(gè)類(lèi)中的私有成員。友元類(lèi)的說(shuō)明問(wèn)另一個(gè)類(lèi)中的私有成員。友元類(lèi)的說(shuō)明方式如下:方式如下:friend class friend class 類(lèi)名;類(lèi)名;【例【例9.129

42、.12】友元類(lèi)二。友元類(lèi)二。 (1) (1) 友元關(guān)系不具有傳遞性。假設(shè)類(lèi)友元關(guān)系不具有傳遞性。假設(shè)類(lèi)a a是類(lèi)是類(lèi)b b的的友元,類(lèi)友元,類(lèi)b b是類(lèi)是類(lèi)c c的友元,除非在類(lèi)的友元,除非在類(lèi)c c中聲明了類(lèi)中聲明了類(lèi)a a是它的友元類(lèi),否則類(lèi)是它的友元類(lèi),否則類(lèi)a a并不是類(lèi)并不是類(lèi)c c的友元。的友元。(2) (2) 友元關(guān)系是單向的,不具有交換性。假設(shè)友元關(guān)系是單向的,不具有交換性。假設(shè)類(lèi)類(lèi)a a是類(lèi)是類(lèi)b b的友元(即在類(lèi)的友元(即在類(lèi)b b定義中聲明定義中聲明a a為友元為友元類(lèi)),類(lèi)類(lèi)),類(lèi)b b是否是是否是a a的友元,要看在類(lèi)中是否有的友元,要看在類(lèi)中是否有相應(yīng)的聲明。相應(yīng)的聲明。9.7 函數(shù)模板和類(lèi)模板nc+語(yǔ)言中可以使用模板來(lái)避免在程序中多次書(shū)寫(xiě)相同的代碼。模板是一種描述函數(shù)或類(lèi)的特性的藍(lán)圖。模板分為函數(shù)模板和類(lèi)模板,可以從一個(gè)函數(shù)模板生成多個(gè)函數(shù),或者從一個(gè)類(lèi)模板生成多個(gè)類(lèi)。建立一個(gè)模板后,編譯器將根據(jù)需要從模板生成多份代碼。 9.7.1 函數(shù)模板n函數(shù)模板函數(shù)模板的一般說(shuō)明形式如下: template (模板函數(shù)形參表)/ 函數(shù)模板定義體2. 模板函數(shù)模板函數(shù)函數(shù)模板只是

溫馨提示

  • 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)論