課件C程序設(shè)計第8章_第1頁
課件C程序設(shè)計第8章_第2頁
課件C程序設(shè)計第8章_第3頁
課件C程序設(shè)計第8章_第4頁
課件C程序設(shè)計第8章_第5頁
已閱讀5頁,還剩75頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第第8章章 類和對象類和對象 第第9章章 關(guān)于類和對象的進一步討論關(guān)于類和對象的進一步討論 第第10章章 運算符重載運算符重載 第第3 3篇篇 基于對象的程序設(shè)計基于對象的程序設(shè)計 第第8章章 類和對象類和對象 8.1 面向?qū)ο蟪绦蛟O(shè)計方法概述面向?qū)ο蟪绦蛟O(shè)計方法概述 8.2 類的聲明和對象的定義類的聲明和對象的定義 8.3 類的成員函數(shù)類的成員函數(shù) 8.4 對象成員的引用對象成員的引用 8.5 類的封裝性和信息隱蔽類的封裝性和信息隱蔽 8.6 類和對象的簡單應(yīng)用舉例類和對象的簡單應(yīng)用舉例 到目前為止,我們介紹的是到目前為止,我們介紹的是C+在面向過程的程序在面向過程的程序 設(shè)計中的應(yīng)用。對于

2、規(guī)模比較小的程序,編程者可設(shè)計中的應(yīng)用。對于規(guī)模比較小的程序,編程者可 以直接編寫出一個面向過程的程序,詳細地描述每以直接編寫出一個面向過程的程序,詳細地描述每 一瞬時的數(shù)據(jù)結(jié)構(gòu)及對其的操作過程。但是當程序一瞬時的數(shù)據(jù)結(jié)構(gòu)及對其的操作過程。但是當程序 規(guī)模較大時,就顯得力不從心了。規(guī)模較大時,就顯得力不從心了。C+就是為了解就是為了解 決編寫大程序過程中的困難而產(chǎn)生的。決編寫大程序過程中的困難而產(chǎn)生的。 8.1 面向?qū)ο蟪绦蛟O(shè)計方法概述面向?qū)ο蟪绦蛟O(shè)計方法概述 面向?qū)ο蟮某绦蛟O(shè)計的思路和人們?nèi)粘I钪刑幚砻嫦驅(qū)ο蟮某绦蛟O(shè)計的思路和人們?nèi)粘I钪刑幚?問題的思路是相似的。在自然世界和社會生活中,

3、問題的思路是相似的。在自然世界和社會生活中, 一個復(fù)雜的事物總是由許多部分組成的。一個復(fù)雜的事物總是由許多部分組成的。 當人們生產(chǎn)汽車時,分別設(shè)計和制造發(fā)動機、底盤、當人們生產(chǎn)汽車時,分別設(shè)計和制造發(fā)動機、底盤、 車身和輪子,最后把它們組裝在一起。在組裝時,車身和輪子,最后把它們組裝在一起。在組裝時, 各部分之間有一定的聯(lián)系,以便協(xié)調(diào)工作。各部分之間有一定的聯(lián)系,以便協(xié)調(diào)工作。 這就是面向?qū)ο蟮某绦蛟O(shè)計的基本思路。這就是面向?qū)ο蟮某绦蛟O(shè)計的基本思路。 為了進一步說明問題,下面先討論幾個有關(guān)的概念。為了進一步說明問題,下面先討論幾個有關(guān)的概念。 8.1.1 什么是面向?qū)ο蟮某绦蛟O(shè)計什么是面向?qū)ο?/p>

4、的程序設(shè)計 1. 對象對象 客觀世界中任何一個事物都可以看成一個對象客觀世界中任何一個事物都可以看成一個對象 (object)。 對象可大可小。對象是構(gòu)成系統(tǒng)的基本單位。對象可大可小。對象是構(gòu)成系統(tǒng)的基本單位。 任何一個對象都應(yīng)當具有這兩個要素,即屬性任何一個對象都應(yīng)當具有這兩個要素,即屬性 (attribute)和行為和行為(behavior),它能根據(jù)外界給的信它能根據(jù)外界給的信 息進行相應(yīng)的操作。一個對象往往是由一組屬性和息進行相應(yīng)的操作。一個對象往往是由一組屬性和 一組行為構(gòu)成的。一般來說,凡是具備屬性和行為一組行為構(gòu)成的。一般來說,凡是具備屬性和行為 這兩種要素的,都可以作為對象。這

5、兩種要素的,都可以作為對象。 在一個系統(tǒng)中的多個對象之間通過一定的渠道相互在一個系統(tǒng)中的多個對象之間通過一定的渠道相互 聯(lián)系,如圖聯(lián)系,如圖8.1示意。要使某一個對象實現(xiàn)某一種示意。要使某一個對象實現(xiàn)某一種 行為行為(即操作即操作),應(yīng)當向它傳送相應(yīng)的消息。對象之,應(yīng)當向它傳送相應(yīng)的消息。對象之 間就是這樣通過發(fā)送和接收消息互相聯(lián)系的。間就是這樣通過發(fā)送和接收消息互相聯(lián)系的。 圖圖8.1 圖圖8.2 面向?qū)ο蟮某绦蛟O(shè)計采用了以上人們所熟悉的這種面向?qū)ο蟮某绦蛟O(shè)計采用了以上人們所熟悉的這種 思路。使用面向?qū)ο蟮某绦蛟O(shè)計方法設(shè)計一個復(fù)雜思路。使用面向?qū)ο蟮某绦蛟O(shè)計方法設(shè)計一個復(fù)雜 的軟件系統(tǒng)時,首

6、要的問題是確定該系統(tǒng)是由哪些的軟件系統(tǒng)時,首要的問題是確定該系統(tǒng)是由哪些 對象組成的,并且設(shè)計這些對象。在對象組成的,并且設(shè)計這些對象。在C+中,每個中,每個 對象都是由數(shù)據(jù)和函數(shù)對象都是由數(shù)據(jù)和函數(shù)(即操作代碼即操作代碼)這兩部分組成這兩部分組成 的的,見圖見圖8.2。數(shù)據(jù)體現(xiàn)了前面提到的。數(shù)據(jù)體現(xiàn)了前面提到的“屬性屬性”,如,如 一個三角形對象,它的一個三角形對象,它的3個邊長就是它的屬性。函個邊長就是它的屬性。函 數(shù)是用來對數(shù)據(jù)進行操作的,以便實現(xiàn)某些功能,數(shù)是用來對數(shù)據(jù)進行操作的,以便實現(xiàn)某些功能, 例如可以通過邊長計算出三角形的面積,并且輸出例如可以通過邊長計算出三角形的面積,并且輸

7、出 三角形的邊長和面積。計算三角形面積和輸出有關(guān)三角形的邊長和面積。計算三角形面積和輸出有關(guān) 數(shù)據(jù)就是前面提到的行為,在程序設(shè)計方法中也稱數(shù)據(jù)就是前面提到的行為,在程序設(shè)計方法中也稱 為方法為方法(method)。調(diào)用對象中的函數(shù)就是向該對象調(diào)用對象中的函數(shù)就是向該對象 傳送一個消息傳送一個消息(message),要求該對象實現(xiàn)某一行要求該對象實現(xiàn)某一行 為為(功能功能)。 2. 封裝與信息隱蔽封裝與信息隱蔽 可以對一個對象進行封裝處理,把它的一部分屬性可以對一個對象進行封裝處理,把它的一部分屬性 和功能對外界屏蔽,也就是說從外界是看不到的和功能對外界屏蔽,也就是說從外界是看不到的, 甚至是不

8、可知的。甚至是不可知的。 這樣做的好處是大大降低了操作對象的復(fù)雜程度。這樣做的好處是大大降低了操作對象的復(fù)雜程度。 面向?qū)ο蟪绦蛟O(shè)計方法的一個重要特點就是面向?qū)ο蟪绦蛟O(shè)計方法的一個重要特點就是“封裝封裝 性性” (encapsulation),所謂所謂“封裝封裝”,指兩方面的,指兩方面的 含義:含義: 一是將有關(guān)的數(shù)據(jù)和操作代碼封裝在一個一是將有關(guān)的數(shù)據(jù)和操作代碼封裝在一個 對象中,形成一個基本單位,各個對象之間相對獨對象中,形成一個基本單位,各個對象之間相對獨 立,互不干擾。二是將對象中某些部分對外隱蔽,立,互不干擾。二是將對象中某些部分對外隱蔽, 即隱蔽其內(nèi)部細節(jié),只留下少量接口,以便與外

9、界即隱蔽其內(nèi)部細節(jié),只留下少量接口,以便與外界 聯(lián)系,接收外界的消息。這種對外界隱蔽的做法稱聯(lián)系,接收外界的消息。這種對外界隱蔽的做法稱 為信息隱蔽為信息隱蔽(imformation hiding)。信息隱蔽還有利信息隱蔽還有利 于數(shù)據(jù)安全,防止無關(guān)的人了解和修改數(shù)據(jù)。于數(shù)據(jù)安全,防止無關(guān)的人了解和修改數(shù)據(jù)。 C+的對象中的函數(shù)名就是對象的對外接口,外界的對象中的函數(shù)名就是對象的對外接口,外界 可以通過函數(shù)名來調(diào)用這些函數(shù)來實現(xiàn)某些行為可以通過函數(shù)名來調(diào)用這些函數(shù)來實現(xiàn)某些行為 (功能功能)。這些將在以后詳細介紹。這些將在以后詳細介紹。 3. 抽象抽象 在程序設(shè)計方法中,常用到抽象在程序設(shè)計方

10、法中,常用到抽象(abstraction)這一這一 名詞。抽象的過程是將有關(guān)事物的共性歸納、集中名詞。抽象的過程是將有關(guān)事物的共性歸納、集中 的過程。的過程。 抽象的作用是表示同一類事物的本質(zhì)。抽象的作用是表示同一類事物的本質(zhì)。C和和C+中中 的數(shù)據(jù)類型就是對一批具體的數(shù)的抽象。的數(shù)據(jù)類型就是對一批具體的數(shù)的抽象。 對象是具體存在的,如一個三角形可以作為一個對對象是具體存在的,如一個三角形可以作為一個對 象,象,10個不同尺寸的三角形是個不同尺寸的三角形是10個對象。如果這個對象。如果這10 個三角形對象有相同的屬性和行為,可以將它們抽個三角形對象有相同的屬性和行為,可以將它們抽 象為一種類型

11、,稱為三角形類型。在象為一種類型,稱為三角形類型。在C+中,這種中,這種 類型就稱為類型就稱為“類類(class)”。這這10個三角形就是屬于個三角形就是屬于 同一同一“類類”的對象。類是對象的抽象,而對象則是的對象。類是對象的抽象,而對象則是 類的特例,或者說是類的具體表現(xiàn)形式。類的特例,或者說是類的具體表現(xiàn)形式。 4. 繼承與重用繼承與重用 如果在軟件開發(fā)中已經(jīng)建立了一個名為如果在軟件開發(fā)中已經(jīng)建立了一個名為A的的“類類”, 又想另外建立一個名為又想另外建立一個名為B的的“類類”,而后者與前者,而后者與前者 內(nèi)容基本相同,只是在前者的基礎(chǔ)上增加一些屬性內(nèi)容基本相同,只是在前者的基礎(chǔ)上增加一

12、些屬性 和行為,只需在類和行為,只需在類A的基礎(chǔ)上增加一些新內(nèi)容即可。的基礎(chǔ)上增加一些新內(nèi)容即可。 這就是面向?qū)ο蟪绦蛟O(shè)計中的繼承機制。利用繼承這就是面向?qū)ο蟪绦蛟O(shè)計中的繼承機制。利用繼承 可以簡化程序設(shè)計的步驟??梢院喕绦蛟O(shè)計的步驟。 “白馬白馬”繼承了繼承了“馬馬”的基本特征,又增加了新的的基本特征,又增加了新的 特征特征(顏色顏色),“馬馬”是父類,或稱為基類,是父類,或稱為基類,“白馬白馬” 是從是從“馬馬”派生出來的,稱為子類或派生類。派生出來的,稱為子類或派生類。 C+提供了繼承機制,采用繼承的方法可以很方便提供了繼承機制,采用繼承的方法可以很方便 地利用一個已有的類建立一個新的

13、類。這就是常說地利用一個已有的類建立一個新的類。這就是常說 的的“軟件重用軟件重用”(software reusability) 的思想。的思想。 5. 多態(tài)性多態(tài)性 如果有幾個相似而不完全相同的對象,有時人們要如果有幾個相似而不完全相同的對象,有時人們要 求在向它們發(fā)出同一個消息時,它們的反應(yīng)各不相求在向它們發(fā)出同一個消息時,它們的反應(yīng)各不相 同,分別執(zhí)行不同的操作。這種情況就是多態(tài)現(xiàn)象。同,分別執(zhí)行不同的操作。這種情況就是多態(tài)現(xiàn)象。 如,在如,在Windows環(huán)境下,用鼠標雙擊一個文件對象環(huán)境下,用鼠標雙擊一個文件對象 (這就是向?qū)ο髠魉鸵粋€消息這就是向?qū)ο髠魉鸵粋€消息),如果對象是一個可

14、,如果對象是一個可 執(zhí)行文件,則會執(zhí)行此程序,如果對象是一個文本執(zhí)行文件,則會執(zhí)行此程序,如果對象是一個文本 文件,則啟動文本編輯器并打開該文件。文件,則啟動文本編輯器并打開該文件。 在在C+中,所謂多態(tài)性中,所謂多態(tài)性(polymorphism)是指:是指: 由繼由繼 承而產(chǎn)生的相關(guān)的不同的類,其對象對同一消息會承而產(chǎn)生的相關(guān)的不同的類,其對象對同一消息會 作出不同的響應(yīng)。多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計的一作出不同的響應(yīng)。多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計的一 個重要特征,能增加程序的靈活性。個重要特征,能增加程序的靈活性。 傳統(tǒng)的面向過程程序設(shè)計是圍繞功能進行的,用一傳統(tǒng)的面向過程程序設(shè)計是圍繞功能進行的

15、,用一 個函數(shù)實現(xiàn)一個功能。所有的數(shù)據(jù)都是公用的,一個函數(shù)實現(xiàn)一個功能。所有的數(shù)據(jù)都是公用的,一 個函數(shù)可以使用任何一組數(shù)據(jù),而一組數(shù)據(jù)又能被個函數(shù)可以使用任何一組數(shù)據(jù),而一組數(shù)據(jù)又能被 多個函數(shù)所使用(見圖多個函數(shù)所使用(見圖8.3)。)。 圖圖8.3 8.1.2 面向?qū)ο蟪绦蛟O(shè)計的特點面向?qū)ο蟪绦蛟O(shè)計的特點 面向?qū)ο蟪绦蛟O(shè)計采取的是另外一種思路。它面對面向?qū)ο蟪绦蛟O(shè)計采取的是另外一種思路。它面對 的是一個個對象。實際上,每一組數(shù)據(jù)都是有特定的是一個個對象。實際上,每一組數(shù)據(jù)都是有特定 的用途的,是某種操作的對象。也就是說,一組操的用途的,是某種操作的對象。也就是說,一組操 作調(diào)用一組數(shù)據(jù)。

16、作調(diào)用一組數(shù)據(jù)。 程序設(shè)計者的任務(wù)包括兩個方面:程序設(shè)計者的任務(wù)包括兩個方面: 一是設(shè)計所需一是設(shè)計所需 的各種類和對象,即決定把哪些數(shù)據(jù)和操作封裝在的各種類和對象,即決定把哪些數(shù)據(jù)和操作封裝在 一起;二是考慮怎樣向有關(guān)對象發(fā)送消息,以完成一起;二是考慮怎樣向有關(guān)對象發(fā)送消息,以完成 所需的任務(wù)。這時他如同一個總調(diào)度,不斷地向各所需的任務(wù)。這時他如同一個總調(diào)度,不斷地向各 個對象發(fā)出命令,讓這些對象活動起來個對象發(fā)出命令,讓這些對象活動起來(或者說激或者說激 活這些對象活這些對象),完成自己職責(zé)范圍內(nèi)的工作。各個,完成自己職責(zé)范圍內(nèi)的工作。各個 對象的操作完成了,整體任務(wù)也就完成了。顯然,對象

17、的操作完成了,整體任務(wù)也就完成了。顯然, 對一個大型任務(wù)來說,面向?qū)ο蟪绦蛟O(shè)計方法是十對一個大型任務(wù)來說,面向?qū)ο蟪绦蛟O(shè)計方法是十 分有效的,它能大大降低程序設(shè)計人員的工作難度,分有效的,它能大大降低程序設(shè)計人員的工作難度, 減少出錯機會。減少出錯機會。 類是類是C+中十分重要的概念,它是實現(xiàn)面向?qū)ο蟪讨惺种匾母拍睿菍崿F(xiàn)面向?qū)ο蟪?序設(shè)計的基礎(chǔ)。類是所有面向?qū)ο蟮恼Z言的共同特序設(shè)計的基礎(chǔ)。類是所有面向?qū)ο蟮恼Z言的共同特 征,所有面向?qū)ο蟮恼Z言都提供了這種類型。一個征,所有面向?qū)ο蟮恼Z言都提供了這種類型。一個 有一定規(guī)模的有一定規(guī)模的C+程序是由許多類所構(gòu)成的。程序是由許多類所構(gòu)成的。

18、C+支持面向過程的程序設(shè)計,也支持基于對象的支持面向過程的程序設(shè)計,也支持基于對象的 程序設(shè)計,又支持面向?qū)ο蟮某绦蛟O(shè)計。在本章到程序設(shè)計,又支持面向?qū)ο蟮某绦蛟O(shè)計。在本章到 第第10章將介紹基于對象的程序設(shè)計。包括類和對象章將介紹基于對象的程序設(shè)計。包括類和對象 的概念、類的機制和聲明、類對象的定義與使用等。的概念、類的機制和聲明、類對象的定義與使用等。 這是面向?qū)ο蟮某绦蛟O(shè)計的基礎(chǔ)。這是面向?qū)ο蟮某绦蛟O(shè)計的基礎(chǔ)。 8.1.3 類和對象的作用類和對象的作用 基于對象就是基于類。與面向過程的程序不同,基基于對象就是基于類。與面向過程的程序不同,基 于對象的程序是以類和對象為基礎(chǔ)的,程序的操作于

19、對象的程序是以類和對象為基礎(chǔ)的,程序的操作 是圍繞對象進行的。在此基礎(chǔ)上利用了繼承機制和是圍繞對象進行的。在此基礎(chǔ)上利用了繼承機制和 多態(tài)性,就成為面向?qū)ο蟮某绦蛟O(shè)計多態(tài)性,就成為面向?qū)ο蟮某绦蛟O(shè)計(有時不細分有時不細分 基于對象程序設(shè)計和面向?qū)ο蟪绦蛟O(shè)計,而把二者基于對象程序設(shè)計和面向?qū)ο蟪绦蛟O(shè)計,而把二者 合稱為面向?qū)ο蟮某绦蛟O(shè)計合稱為面向?qū)ο蟮某绦蛟O(shè)計)。 基于對象程序設(shè)計所面對的是一個個對象。所有的基于對象程序設(shè)計所面對的是一個個對象。所有的 數(shù)據(jù)分別屬于不同的對象。數(shù)據(jù)分別屬于不同的對象。 在面向過程的結(jié)構(gòu)化程序設(shè)計中,人們常使用這樣在面向過程的結(jié)構(gòu)化程序設(shè)計中,人們常使用這樣 的公

20、式來表述程序:的公式來表述程序: 程序程序=算法數(shù)據(jù)結(jié)構(gòu)算法數(shù)據(jù)結(jié)構(gòu) 算法和數(shù)據(jù)結(jié)構(gòu)兩者是互相獨立、分開設(shè)計的,面算法和數(shù)據(jù)結(jié)構(gòu)兩者是互相獨立、分開設(shè)計的,面 向過程的程序設(shè)計是以算法為主體的。在實踐中人向過程的程序設(shè)計是以算法為主體的。在實踐中人 們逐漸認識到算法和數(shù)據(jù)結(jié)構(gòu)是互相緊密聯(lián)系不可們逐漸認識到算法和數(shù)據(jù)結(jié)構(gòu)是互相緊密聯(lián)系不可 分的,應(yīng)當以一個算法對應(yīng)一組數(shù)據(jù)結(jié)構(gòu),而不宜分的,應(yīng)當以一個算法對應(yīng)一組數(shù)據(jù)結(jié)構(gòu),而不宜 提倡一個算法對應(yīng)多組數(shù)據(jù)結(jié)構(gòu),以及一組數(shù)據(jù)結(jié)提倡一個算法對應(yīng)多組數(shù)據(jù)結(jié)構(gòu),以及一組數(shù)據(jù)結(jié) 構(gòu)對應(yīng)多個算法?;趯ο蠛兔嫦?qū)ο蟪绦蛟O(shè)計就構(gòu)對應(yīng)多個算法?;趯ο蠛兔嫦?qū)ο蟪?/p>

21、序設(shè)計就 是把一個算法和一組數(shù)據(jù)結(jié)構(gòu)封裝在一個對象中。是把一個算法和一組數(shù)據(jù)結(jié)構(gòu)封裝在一個對象中。 因此,就形成了新的觀念:因此,就形成了新的觀念: 對象對象 = 算法算法 數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu) 程序程序 = (對象對象+對象對象+對象對象+) + 消息消息 或:或: 程序程序 = 對象對象s + 消息消息 “對象對象s”表示多個對象。消息的作用就是對對象的表示多個對象。消息的作用就是對對象的 控制。程序設(shè)計的關(guān)鍵是設(shè)計好每一個對象,及確控制。程序設(shè)計的關(guān)鍵是設(shè)計好每一個對象,及確 定向這些對象發(fā)出的命令,使各對象完成相應(yīng)操作。定向這些對象發(fā)出的命令,使各對象完成相應(yīng)操作。 隨著軟件規(guī)模的迅速增大

22、,軟件人員面臨的問題十隨著軟件規(guī)模的迅速增大,軟件人員面臨的問題十 分復(fù)雜。需要規(guī)范整個軟件開發(fā)過程,明確軟件開分復(fù)雜。需要規(guī)范整個軟件開發(fā)過程,明確軟件開 發(fā)過程中每個階段的任務(wù),在保證前一個階段工作發(fā)過程中每個階段的任務(wù),在保證前一個階段工作 的正確性的情況下,再進行下一階段的工作。這就的正確性的情況下,再進行下一階段的工作。這就 是軟件工程學(xué)需要研究和解決的問題。是軟件工程學(xué)需要研究和解決的問題。 面向?qū)ο蟮能浖こ贪ㄒ韵聨讉€部分:面向?qū)ο蟮能浖こ贪ㄒ韵聨讉€部分: 8.1.4 面向?qū)ο蟮能浖_發(fā)面向?qū)ο蟮能浖_發(fā) 1. 面向?qū)ο蠓治雒嫦驅(qū)ο蠓治?object oriented an

23、alysis,OOA) 軟件工程中的系統(tǒng)分析階段,系統(tǒng)分析員要和用戶軟件工程中的系統(tǒng)分析階段,系統(tǒng)分析員要和用戶 結(jié)合在一起,對用戶的需求作出精確的分析和明確結(jié)合在一起,對用戶的需求作出精確的分析和明確 的描述,從宏觀的角度概括出系統(tǒng)應(yīng)該做什么的描述,從宏觀的角度概括出系統(tǒng)應(yīng)該做什么(而而 不是怎么做不是怎么做)。面向?qū)ο蟮姆治?,要按照面向?qū)ο蟆C嫦驅(qū)ο蟮姆治觯凑彰嫦驅(qū)ο?的概念和方法,在對任務(wù)的分析中,從客觀存在的的概念和方法,在對任務(wù)的分析中,從客觀存在的 事物和事物之間的關(guān)系,歸納出有關(guān)的對象事物和事物之間的關(guān)系,歸納出有關(guān)的對象(包括包括 對象的屬性和行為對象的屬性和行為)以及對象

24、之間的聯(lián)系,并將具以及對象之間的聯(lián)系,并將具 有相同屬性和行為的對象用一個類有相同屬性和行為的對象用一個類(class)來表示。來表示。 建立一個能反映真實工作情況的需求模型。建立一個能反映真實工作情況的需求模型。 2. 面向?qū)ο笤O(shè)計面向?qū)ο笤O(shè)計(object oriented design,OOD) 根據(jù)面向?qū)ο蠓治鲭A段形成的需求模型,對每一部根據(jù)面向?qū)ο蠓治鲭A段形成的需求模型,對每一部 分分別進行具體的設(shè)計,首先是進行類的設(shè)計,類分分別進行具體的設(shè)計,首先是進行類的設(shè)計,類 的設(shè)計可能包含多個層次的設(shè)計可能包含多個層次(利用繼承與派生利用繼承與派生)。然后。然后 以這些類為基礎(chǔ)提出程序設(shè)計

25、的思路和方法,包括以這些類為基礎(chǔ)提出程序設(shè)計的思路和方法,包括 對算法的設(shè)計。在設(shè)計階段,并不牽涉某一種具體對算法的設(shè)計。在設(shè)計階段,并不牽涉某一種具體 的計算機語言,而是用一種更通用的描述工具的計算機語言,而是用一種更通用的描述工具(如如 偽代碼或流程圖偽代碼或流程圖)來描述。來描述。 3. 面向?qū)ο缶幊堂嫦驅(qū)ο缶幊?object oriented programming, OOP) 根據(jù)面向?qū)ο笤O(shè)計的結(jié)果,用一種計算機語言把它根據(jù)面向?qū)ο笤O(shè)計的結(jié)果,用一種計算機語言把它 寫成程序,顯然應(yīng)當選用面向?qū)ο蟮挠嬎銠C語言寫成程序,顯然應(yīng)當選用面向?qū)ο蟮挠嬎銠C語言 (例如例如C+),否則無法實現(xiàn)面向

26、對象設(shè)計的要求。否則無法實現(xiàn)面向?qū)ο笤O(shè)計的要求。 4. 面向?qū)ο鬁y試面向?qū)ο鬁y試(object oriented test,OOT) 在寫好程序后交給用戶使用前,必須對程序進行嚴在寫好程序后交給用戶使用前,必須對程序進行嚴 格的測試。測試的目的是發(fā)現(xiàn)程序中的錯誤并改正格的測試。測試的目的是發(fā)現(xiàn)程序中的錯誤并改正 它。面向?qū)ο鬁y試是用面向?qū)ο蟮姆椒ㄟM行測試,它。面向?qū)ο鬁y試是用面向?qū)ο蟮姆椒ㄟM行測試, 以類作為測試的基本單元。以類作為測試的基本單元。 5. 面向?qū)ο缶S護面向?qū)ο缶S護(object oriented soft maintenance, OOSM) 因為對象的封裝性,修改一個對象對其

27、他對象影響因為對象的封裝性,修改一個對象對其他對象影響 很小。利用面向?qū)ο蟮姆椒ňS護程序,大大提高了很小。利用面向?qū)ο蟮姆椒ňS護程序,大大提高了 軟件維護的效率。軟件維護的效率。 現(xiàn)在設(shè)計一個大的軟件,是嚴格按照面向?qū)ο筌浖F(xiàn)在設(shè)計一個大的軟件,是嚴格按照面向?qū)ο筌浖?工程的工程的5個階段進行的,這個階段進行的,這5個階段的工作不是由一個階段的工作不是由一 個人從頭到尾完成的,而是由不同的人分別完成的。個人從頭到尾完成的,而是由不同的人分別完成的。 這樣,這樣,OOP階段的任務(wù)就比較簡單了,程序編寫階段的任務(wù)就比較簡單了,程序編寫 者只需要根據(jù)者只需要根據(jù)OOD提出的思路用面向?qū)ο笳Z言編提出的

28、思路用面向?qū)ο笳Z言編 寫出程序即可。在一個大型軟件的開發(fā)中,寫出程序即可。在一個大型軟件的開發(fā)中,OOP 只是面向?qū)ο箝_發(fā)過程中的一個很小的部分。只是面向?qū)ο箝_發(fā)過程中的一個很小的部分。 如果所處理的是一個較簡單的問題,可以不必嚴格如果所處理的是一個較簡單的問題,可以不必嚴格 按照以上按照以上5個階段進行,往往由程序設(shè)計者按照面?zhèn)€階段進行,往往由程序設(shè)計者按照面 向?qū)ο蟮姆椒ㄟM行程序設(shè)計,包括類的設(shè)計向?qū)ο蟮姆椒ㄟM行程序設(shè)計,包括類的設(shè)計(或選或選 用已有的類用已有的類)和程序的設(shè)計。和程序的設(shè)計。 每一個實體都是對象。有一些對象是具有相同的結(jié)每一個實體都是對象。有一些對象是具有相同的結(jié) 構(gòu)和

29、特性的。每個對象都屬于一個特定的類型。構(gòu)和特性的。每個對象都屬于一個特定的類型。 在在C+中對象的類型稱為類中對象的類型稱為類(class)。類代表了某一類代表了某一 批對象的共性和特征。前面已說明:批對象的共性和特征。前面已說明: 類是對象的類是對象的 抽象,而對象是類的具體實例抽象,而對象是類的具體實例(instance)。正如同正如同 結(jié)構(gòu)體類型和結(jié)構(gòu)體變量的關(guān)系一樣,人們先聲明結(jié)構(gòu)體類型和結(jié)構(gòu)體變量的關(guān)系一樣,人們先聲明 一個結(jié)構(gòu)體類型,然后用它去定義結(jié)構(gòu)體變量。同一個結(jié)構(gòu)體類型,然后用它去定義結(jié)構(gòu)體變量。同 一個結(jié)構(gòu)體類型可以定義出多個不同的結(jié)構(gòu)體變量。一個結(jié)構(gòu)體類型可以定義出多個不

30、同的結(jié)構(gòu)體變量。 8.2 類的聲明和對象的定義類的聲明和對象的定義 8.2.1 類和對象的關(guān)系類和對象的關(guān)系 在在C+中也是先聲明一個類類型,然后用它去定義中也是先聲明一個類類型,然后用它去定義 若干個同類型的對象。對象就是類類型的一個變量。若干個同類型的對象。對象就是類類型的一個變量。 可以說類是對象的模板,是用來定義對象的一種抽可以說類是對象的模板,是用來定義對象的一種抽 象類型。象類型。 類是抽象的,不占用內(nèi)存,而對象是具體的,占用類是抽象的,不占用內(nèi)存,而對象是具體的,占用 存儲空間。在一開始時弄清對象和類的關(guān)系是十分存儲空間。在一開始時弄清對象和類的關(guān)系是十分 重要的。重要的。 類是

31、用戶自己指定的類型。如果程序中要用到類類類是用戶自己指定的類型。如果程序中要用到類類 型,必須自己根據(jù)需要進行聲明,或者使用別人已型,必須自己根據(jù)需要進行聲明,或者使用別人已 設(shè)計好的類。設(shè)計好的類。C+標準本身并不提供現(xiàn)成的類的名標準本身并不提供現(xiàn)成的類的名 稱、結(jié)構(gòu)和內(nèi)容。稱、結(jié)構(gòu)和內(nèi)容。 在在C+中聲明一個類類型和聲明一個結(jié)構(gòu)體類型是中聲明一個類類型和聲明一個結(jié)構(gòu)體類型是 相似的。相似的。 下面是聲明一個結(jié)構(gòu)體類型的方法:下面是聲明一個結(jié)構(gòu)體類型的方法: struct Student /聲明了一個名為聲明了一個名為Student的結(jié)構(gòu)體類型的結(jié)構(gòu)體類型 int num; char nam

32、e20; char sex; ; Student stud1,stud2; /定義了兩個結(jié)構(gòu)體變量定義了兩個結(jié)構(gòu)體變量stud1和和stud2 8.2.2 聲明類類型聲明類類型 它只包括數(shù)據(jù),沒有包括操作。現(xiàn)在聲明一個類:它只包括數(shù)據(jù),沒有包括操作?,F(xiàn)在聲明一個類: class Student /以以class開頭開頭 int num; char name20; char sex; /以上以上3行是數(shù)據(jù)成員行是數(shù)據(jù)成員 void display( ) /這是成員函數(shù)這是成員函數(shù) coutnum:numendl; coutname:nameendl; coutsex:sexendl; /以上以上

33、4行是函數(shù)中的操作語句行是函數(shù)中的操作語句 ; Student stud1,stud2; /定義了兩個定義了兩個Student 類的對象類的對象stud1和和stud2 可以看到聲明類的方法是由聲明結(jié)構(gòu)體類型的方法可以看到聲明類的方法是由聲明結(jié)構(gòu)體類型的方法 發(fā)展而來的。發(fā)展而來的。 可以看到,類可以看到,類(class)就是對象的類型。實際上,類就是對象的類型。實際上,類 是一種廣義的數(shù)據(jù)類型。類這種數(shù)據(jù)類型中的數(shù)據(jù)是一種廣義的數(shù)據(jù)類型。類這種數(shù)據(jù)類型中的數(shù)據(jù) 既包含數(shù)據(jù),也包含操作數(shù)據(jù)的函數(shù)。既包含數(shù)據(jù),也包含操作數(shù)據(jù)的函數(shù)。 不能把類中的全部成員與外界隔離,一般是把數(shù)據(jù)不能把類中的全部成

34、員與外界隔離,一般是把數(shù)據(jù) 隱蔽起來,而把成員函數(shù)作為對外界的接口。隱蔽起來,而把成員函數(shù)作為對外界的接口。 可以將上面類的聲明改為可以將上面類的聲明改為 class Student /聲明類類型聲明類類型 private: /聲明以下部分為私有的聲明以下部分為私有的 int num; char name20; char sex; public: /聲明以下部分為公用的聲明以下部分為公用的 void display( ) coutnum:numendl; coutname:nameendl; coutsex:sexendl; ; Student stud1,stud2; /定義了兩個定義了兩個

35、Student 類的對象類的對象 如果在類的定義中既不指定如果在類的定義中既不指定private,也不指定也不指定 public,則系統(tǒng)就默認為是私有的。則系統(tǒng)就默認為是私有的。 歸納以上對類類型的聲明,可得到其一般形式如下:歸納以上對類類型的聲明,可得到其一般形式如下: class 類名類名 private: 私有的數(shù)據(jù)和成員函數(shù)私有的數(shù)據(jù)和成員函數(shù); public: 公用的數(shù)據(jù)和成員函數(shù)公用的數(shù)據(jù)和成員函數(shù); ; private和和public稱為成員訪問限定符稱為成員訪問限定符(member access specifier)。 除了除了private和和public之外,還有一種成員訪

36、問限定之外,還有一種成員訪問限定 符符protected(受保護的受保護的),用,用protected聲明的成員稱聲明的成員稱 為受保護的成員,它不能被類外訪問為受保護的成員,它不能被類外訪問(這點與私有這點與私有 成員類似成員類似),但可以被派生類的成員函數(shù)訪問。,但可以被派生類的成員函數(shù)訪問。 在聲明類類型時,聲明為在聲明類類型時,聲明為private的成員和聲明為的成員和聲明為 public的成員的次序任意,既可以先出現(xiàn)的成員的次序任意,既可以先出現(xiàn)private部部 分,也可以先出現(xiàn)分,也可以先出現(xiàn)public部分。如果在類體中既不部分。如果在類體中既不 寫關(guān)鍵字寫關(guān)鍵字private

37、,又不寫又不寫public,就默認為就默認為private。 在一個類體中,關(guān)鍵字在一個類體中,關(guān)鍵字private和和public可以分別出可以分別出 現(xiàn)多次。每個部分的有效范圍到出現(xiàn)另一個訪問限現(xiàn)多次。每個部分的有效范圍到出現(xiàn)另一個訪問限 定符或類體結(jié)束時定符或類體結(jié)束時(最后一個右花括號最后一個右花括號)為止。但是為止。但是 為了使程序清晰,應(yīng)該養(yǎng)成這樣的習(xí)慣:為了使程序清晰,應(yīng)該養(yǎng)成這樣的習(xí)慣: 使每一使每一 種成員訪問限定符在類定義體中只出現(xiàn)一次。種成員訪問限定符在類定義體中只出現(xiàn)一次。 在以前的在以前的C+程序中,常先出現(xiàn)程序中,常先出現(xiàn)private部分,后出部分,后出 現(xiàn)現(xiàn)pu

38、blic部分,如上面所示?,F(xiàn)在的部分,如上面所示?,F(xiàn)在的C+程序多數(shù)程序多數(shù) 先寫先寫public部分,把部分,把private部分放在類體的后部。部分放在類體的后部。 這樣可以使用戶將注意力集中在能被外界調(diào)用的成這樣可以使用戶將注意力集中在能被外界調(diào)用的成 員上,使閱讀者的思路更清晰一些。員上,使閱讀者的思路更清晰一些。 在在C+程序中,經(jīng)常可以看到類。為了用戶方便,程序中,經(jīng)??梢钥吹筋?。為了用戶方便, 常用的常用的C+編譯系統(tǒng)往往向用戶提供類庫編譯系統(tǒng)往往向用戶提供類庫(但不屬但不屬 于于C+語言的組成部分語言的組成部分),內(nèi)裝常用的基本的類,內(nèi)裝常用的基本的類, 供用戶使用。不少用戶也

39、把自己或本單位經(jīng)常用到供用戶使用。不少用戶也把自己或本單位經(jīng)常用到 的類放在一個專門的類庫中,需要用時直接調(diào)用,的類放在一個專門的類庫中,需要用時直接調(diào)用, 這樣就減少了程序設(shè)計的工作量。這樣就減少了程序設(shè)計的工作量。 8.2.2節(jié)的程序段中,最后一行用已聲明的節(jié)的程序段中,最后一行用已聲明的Student 類來定義對象,這種方法是很容易理解的。經(jīng)過定類來定義對象,這種方法是很容易理解的。經(jīng)過定 義后,義后,stud1和和stud2就成為具有就成為具有Student類特征的對類特征的對 象。象。stud1和和stud2這兩個對象都分別包括這兩個對象都分別包括Student類類 中定義的數(shù)據(jù)和函

40、數(shù)。中定義的數(shù)據(jù)和函數(shù)。 定義對象也可以有幾種方法。定義對象也可以有幾種方法。 8.2.3 定義對象的方法定義對象的方法 1. 先聲明類類型,然后再定義對象先聲明類類型,然后再定義對象 前面用的就是這種方法,如前面用的就是這種方法,如 Student stud1,stud2; /Student是已經(jīng)聲明的類類型是已經(jīng)聲明的類類型 在在C+中,聲明了類類型后,定義對象有兩種形式。中,聲明了類類型后,定義對象有兩種形式。 (1) class 類名類名 對象名對象名 如如 class Student stud1,stud2; 把把class和和Student合起來作為一個類名,用來定義合起來作為一個

41、類名,用來定義 對象。對象。 (2) 類名類名 對象名對象名 如如 Student stud1,stud2; 直接用類名定義對象。這兩種方法是等效的。第直接用類名定義對象。這兩種方法是等效的。第1 種方法是從種方法是從C語言繼承下來的,第語言繼承下來的,第2種方法是種方法是C+的的 特色,顯然第特色,顯然第2種方法更為簡捷方便。種方法更為簡捷方便。 2. 在聲明類類型的同時定義對象在聲明類類型的同時定義對象 class Student /聲明類類型聲明類類型 public: /先聲明公用部分先聲明公用部分 void display( ) coutnum:numendl; coutname:na

42、meendl; coutsex:sexendl; private: /后聲明私有部分后聲明私有部分 int num; char name20; char sex; stud1,stud2; /定義了兩個定義了兩個Student類的對象類的對象 在定義在定義Student類的同時,定義了兩個類的同時,定義了兩個Student 類的類的 對象。對象。 3. 不出現(xiàn)類名,直接定義對象不出現(xiàn)類名,直接定義對象 class /無類名無類名 private: /聲明以下部分為私有的聲明以下部分為私有的 public: /聲明以下部分為公用的聲明以下部分為公用的 stud1,stud2; /定義了兩個無類名

43、的類對象定義了兩個無類名的類對象 直接定義對象,在直接定義對象,在C+中是合法的、允許的,但卻中是合法的、允許的,但卻 很少用,也不提倡用。在實際的程序開發(fā)中,一般很少用,也不提倡用。在實際的程序開發(fā)中,一般 都采用上面都采用上面3種方法中的第種方法中的第1種方法。在小型程序中種方法。在小型程序中 或所聲明的類只用于本程序時,也可以用第或所聲明的類只用于本程序時,也可以用第2種方種方 法。法。 在定義一個對象時,編譯系統(tǒng)會為這個對象分配存在定義一個對象時,編譯系統(tǒng)會為這個對象分配存 儲空間,以存放對象中的成員。儲空間,以存放對象中的成員。 C+增加了增加了class類型后,仍保留了結(jié)構(gòu)體類型類

44、型后,仍保留了結(jié)構(gòu)體類型 (struct),而且把它的功能也擴展了。而且把它的功能也擴展了。C+允許用允許用 struct來定義一個類型。如可以將前面用關(guān)鍵字來定義一個類型。如可以將前面用關(guān)鍵字 class聲明的類類型改為用關(guān)鍵字聲明的類類型改為用關(guān)鍵字struct: struct Student /用關(guān)鍵字用關(guān)鍵字struct來聲明一個類類型來聲明一個類類型 private: /聲明以下部分為私有的聲明以下部分為私有的 int num; /以下以下3行為數(shù)據(jù)成員行為數(shù)據(jù)成員 char name20; char sex; public: /聲明以下部分為公用的聲明以下部分為公用的 void d

45、isplay( ) /成員函數(shù)成員函數(shù) coutnum:numendl; coutname:nameendl; coutsex:sexendl; ; Student stud1,stud2; /定義了兩個定義了兩個Student類的對象類的對象 8.2.4 類和結(jié)構(gòu)體類型的異同類和結(jié)構(gòu)體類型的異同 為了使結(jié)構(gòu)體類型也具有封裝的特征,為了使結(jié)構(gòu)體類型也具有封裝的特征,C+不是簡不是簡 單地繼承單地繼承C的結(jié)構(gòu)體,而是使它也具有類的特點,的結(jié)構(gòu)體,而是使它也具有類的特點, 以便于用于面向?qū)ο蟪绦蛟O(shè)計。用以便于用于面向?qū)ο蟪绦蛟O(shè)計。用struct聲明的結(jié)聲明的結(jié) 構(gòu)體類型實際上也就是類。構(gòu)體類型實際

46、上也就是類。 用用struct聲明的類,如果對其成員不作聲明的類,如果對其成員不作private或或 public的聲明,系統(tǒng)將其默認為的聲明,系統(tǒng)將其默認為public。如果想分。如果想分 別指定私有成員和公用成員,則應(yīng)用別指定私有成員和公用成員,則應(yīng)用private或或 public作顯式聲明。而用作顯式聲明。而用class定義的類,如果不作定義的類,如果不作 private或或public聲明,系統(tǒng)將其成員默認為聲明,系統(tǒng)將其成員默認為private, 在需要時也可以自己用顯式聲明改變。在需要時也可以自己用顯式聲明改變。 如果希望成員是公用的,使用如果希望成員是公用的,使用struct比

47、較方便,如比較方便,如 果希望部分成員是私有的,宜用果希望部分成員是私有的,宜用class。建議盡量使建議盡量使 用用class來建立類,寫出完全體現(xiàn)來建立類,寫出完全體現(xiàn)C+風(fēng)格的程序。風(fēng)格的程序。 類的成員函數(shù)類的成員函數(shù)(簡稱類函數(shù)簡稱類函數(shù))是函數(shù)的一種,它的用是函數(shù)的一種,它的用 法和作用和第法和作用和第4章介紹過的函數(shù)基本上是一樣的,章介紹過的函數(shù)基本上是一樣的, 它也有返回值和函數(shù)類型,它與一般函數(shù)的區(qū)別只它也有返回值和函數(shù)類型,它與一般函數(shù)的區(qū)別只 是:是: 它是屬于一個類的成員,出現(xiàn)在類體中。它它是屬于一個類的成員,出現(xiàn)在類體中。它 可以被指定為可以被指定為private(私

48、有的私有的)、public(公用的公用的)或或 protected(受保護的受保護的)。在使用類函數(shù)時,要注意調(diào)。在使用類函數(shù)時,要注意調(diào) 用它的權(quán)限用它的權(quán)限(它能否被調(diào)用它能否被調(diào)用)以及它的作用域以及它的作用域(函數(shù)能函數(shù)能 使用什么范圍中的數(shù)據(jù)和函數(shù)使用什么范圍中的數(shù)據(jù)和函數(shù))。例如私有的成員。例如私有的成員 函數(shù)只能被本類中的其他成員函數(shù)所調(diào)用,而不能函數(shù)只能被本類中的其他成員函數(shù)所調(diào)用,而不能 被類外調(diào)用。被類外調(diào)用。 8.3 類的成員函數(shù)類的成員函數(shù) 8.3.1 成員函數(shù)的性質(zhì)成員函數(shù)的性質(zhì) 成員函數(shù)可以訪問本類中任何成員成員函數(shù)可以訪問本類中任何成員(包括私有的和包括私有的和

49、公用的公用的),可以引用在本作用域中有效的數(shù)據(jù)。,可以引用在本作用域中有效的數(shù)據(jù)。 一般的做法是將需要被外界調(diào)用的成員函數(shù)指定為一般的做法是將需要被外界調(diào)用的成員函數(shù)指定為 public,它們是類的對外接口。但應(yīng)注意,并非要它們是類的對外接口。但應(yīng)注意,并非要 求把所有成員函數(shù)都指定為求把所有成員函數(shù)都指定為public。有的函數(shù)并不有的函數(shù)并不 是準備為外界調(diào)用的,而是為本類中的成員函數(shù)所是準備為外界調(diào)用的,而是為本類中的成員函數(shù)所 調(diào)用的,就應(yīng)該將它們指定為調(diào)用的,就應(yīng)該將它們指定為private。這種函數(shù)的這種函數(shù)的 作用是支持其他函數(shù)的操作,是類中其他成員的工作用是支持其他函數(shù)的操作,

50、是類中其他成員的工 具函數(shù)具函數(shù)(utility function),類外用戶不能調(diào)用這些私類外用戶不能調(diào)用這些私 有的工具函數(shù)。有的工具函數(shù)。 類的成員函數(shù)是類體中十分重要的部分。如果一個類的成員函數(shù)是類體中十分重要的部分。如果一個 類中不包含成員函數(shù),就等同于類中不包含成員函數(shù),就等同于C語言中的結(jié)構(gòu)體語言中的結(jié)構(gòu)體 了,體現(xiàn)不出類在面向?qū)ο蟪绦蛟O(shè)計中的作用。了,體現(xiàn)不出類在面向?qū)ο蟪绦蛟O(shè)計中的作用。 在前面已經(jīng)看到成員函數(shù)是在類體中定義的。也可在前面已經(jīng)看到成員函數(shù)是在類體中定義的。也可 以在類體中只寫成員函數(shù)的聲明,而在類的外面進以在類體中只寫成員函數(shù)的聲明,而在類的外面進 行函數(shù)定義

51、。如行函數(shù)定義。如 class Student public: void display( ); /公用成員函數(shù)原型聲明公用成員函數(shù)原型聲明 private: int num; string name; char sex; /以上以上3行是私有數(shù)據(jù)成員行是私有數(shù)據(jù)成員 ; void Student display( ) /在類外定義在類外定義display類函數(shù)類函數(shù) coutnum:numendl; /函數(shù)體函數(shù)體 coutname:nameendl; coutsex:sexendl; Student stud1,stud2; /定義兩個類對象定義兩個類對象 8.3.2 在類外定義成員函數(shù)在

52、類外定義成員函數(shù) 注意:注意: 在類體中直接定義函數(shù)時,不需要在函數(shù)在類體中直接定義函數(shù)時,不需要在函數(shù) 名前面加上類名,因為函數(shù)屬于哪一個類是不言而名前面加上類名,因為函數(shù)屬于哪一個類是不言而 喻的。但成員函數(shù)在類外定義時,必須在函數(shù)名前喻的。但成員函數(shù)在類外定義時,必須在函數(shù)名前 面加上類名,予以限定面加上類名,予以限定(qualifed),“ ”是作用域是作用域 限定符限定符(field qualifier)或稱作用域運算符,用它聲或稱作用域運算符,用它聲 明函數(shù)是屬于哪個類的。明函數(shù)是屬于哪個類的。 如果在作用域運算符如果在作用域運算符“ ”的前面沒有類名,或者的前面沒有類名,或者 函

53、數(shù)名前面既無類名又無作用域運算符函數(shù)名前面既無類名又無作用域運算符“ ”,如,如 display( ) 或或 display( ) 則表示則表示display函數(shù)不屬于任何類,這個函數(shù)不是成函數(shù)不屬于任何類,這個函數(shù)不是成 員函數(shù),而是全局函數(shù),即非成員函數(shù)的一般普通員函數(shù),而是全局函數(shù),即非成員函數(shù)的一般普通 函數(shù)。函數(shù)。 類函數(shù)必須先在類體中作原型聲明,然后在類外定類函數(shù)必須先在類體中作原型聲明,然后在類外定 義,也就是說類體的位置應(yīng)在函數(shù)定義之前,否則義,也就是說類體的位置應(yīng)在函數(shù)定義之前,否則 編譯時會出錯。編譯時會出錯。 雖然函數(shù)在類的外部定義,但在調(diào)用成員函數(shù)時會雖然函數(shù)在類的外部

54、定義,但在調(diào)用成員函數(shù)時會 根據(jù)在類中聲明的函數(shù)原型找到函數(shù)的定義(函數(shù)根據(jù)在類中聲明的函數(shù)原型找到函數(shù)的定義(函數(shù) 代碼),從而執(zhí)行該函數(shù)。代碼),從而執(zhí)行該函數(shù)。 在類的內(nèi)部對成員函數(shù)作聲明,而在類體外定義成在類的內(nèi)部對成員函數(shù)作聲明,而在類體外定義成 員函數(shù),這是程序設(shè)計的一種良好習(xí)慣。如果一個員函數(shù),這是程序設(shè)計的一種良好習(xí)慣。如果一個 函數(shù),其函數(shù)體只有函數(shù),其函數(shù)體只有23行,一般可在聲明類時在行,一般可在聲明類時在 類體中定義。多于類體中定義。多于3行的函數(shù),一般在類體內(nèi)聲明,行的函數(shù),一般在類體內(nèi)聲明, 在類外定義。在類外定義。 關(guān)于內(nèi)置關(guān)于內(nèi)置(inline)函數(shù),已在第函數(shù)

55、,已在第4章第章第4.5節(jié)中作過介節(jié)中作過介 紹。類的成員函數(shù)也可以指定為內(nèi)置函數(shù)。紹。類的成員函數(shù)也可以指定為內(nèi)置函數(shù)。 在類體中定義的成員函數(shù)的規(guī)模一般都很小,而系在類體中定義的成員函數(shù)的規(guī)模一般都很小,而系 統(tǒng)調(diào)用函數(shù)的過程所花費的時間開銷相對是比較大統(tǒng)調(diào)用函數(shù)的過程所花費的時間開銷相對是比較大 的。調(diào)用一個函數(shù)的時間開銷遠遠大于小規(guī)模函數(shù)的。調(diào)用一個函數(shù)的時間開銷遠遠大于小規(guī)模函數(shù) 體中全部語句的執(zhí)行時間。為了減少時間開銷,如體中全部語句的執(zhí)行時間。為了減少時間開銷,如 果在類體中定義的成員函數(shù)中不包括循環(huán)等控制結(jié)果在類體中定義的成員函數(shù)中不包括循環(huán)等控制結(jié) 構(gòu),構(gòu),C+系統(tǒng)會自動將它

56、們作為內(nèi)置系統(tǒng)會自動將它們作為內(nèi)置(inline)函數(shù)來函數(shù)來 處理。也就是說,在程序調(diào)用這些成員函數(shù)時,并處理。也就是說,在程序調(diào)用這些成員函數(shù)時,并 不是真正地執(zhí)行函數(shù)的調(diào)用過程不是真正地執(zhí)行函數(shù)的調(diào)用過程(如保留返回地址如保留返回地址 等處理等處理),而是把函數(shù)代碼嵌入程序的調(diào)用點。這,而是把函數(shù)代碼嵌入程序的調(diào)用點。這 樣可以大大減少調(diào)用成員函數(shù)的時間開銷。樣可以大大減少調(diào)用成員函數(shù)的時間開銷。 8.3.3 inline 成員函數(shù)成員函數(shù) C+要求對一般的內(nèi)置函數(shù)要用關(guān)鍵字要求對一般的內(nèi)置函數(shù)要用關(guān)鍵字inline聲明,聲明, 但對類內(nèi)定義的成員函數(shù),可以省略但對類內(nèi)定義的成員函數(shù),可

57、以省略inline,因為因為 這些成員函數(shù)已被隱含地指定為內(nèi)置函數(shù)。如這些成員函數(shù)已被隱含地指定為內(nèi)置函數(shù)。如 class Student public: void display( ) coutnum:numendl; coutname:nameendl; coutsex:sexendl; private: int num; string name; char sex; ; 其中第其中第3行行 void display( ) 也可以寫成也可以寫成 inline void display( ) 將將display函數(shù)顯式地聲明為內(nèi)置函數(shù)。以上兩種寫函數(shù)顯式地聲明為內(nèi)置函數(shù)。以上兩種寫 法是等效

58、的。對在類體內(nèi)定義的函數(shù),一般都省寫法是等效的。對在類體內(nèi)定義的函數(shù),一般都省寫 inline。 應(yīng)該注意的是:應(yīng)該注意的是: 如果成員函數(shù)不在類體內(nèi)定義,如果成員函數(shù)不在類體內(nèi)定義, 而在類體外定義,系統(tǒng)并不把它默認為內(nèi)置而在類體外定義,系統(tǒng)并不把它默認為內(nèi)置(inline) 函數(shù),調(diào)用這些成員函數(shù)的過程和調(diào)用一般函數(shù)的函數(shù),調(diào)用這些成員函數(shù)的過程和調(diào)用一般函數(shù)的 過程是相同的。如果想將這些成員函數(shù)指定為內(nèi)置過程是相同的。如果想將這些成員函數(shù)指定為內(nèi)置 函數(shù),應(yīng)當用函數(shù),應(yīng)當用inline作顯式聲明。如作顯式聲明。如 class Student public: inline void dis

59、play( ); /聲明此成員函數(shù)為內(nèi)置函數(shù)聲明此成員函數(shù)為內(nèi)置函數(shù) private: int num; string name; char sex; ; inline void Student display( ) / 在類外定義在類外定義display函數(shù)為內(nèi)置函數(shù)函數(shù)為內(nèi)置函數(shù) coutnum:numendl; coutname:nameendl; coutsex:sexabc; ; 可以用下面的語句來輸出該類對象所占用的字節(jié)數(shù):可以用下面的語句來輸出該類對象所占用的字節(jié)數(shù): coutsizeof(Time)endl; 輸出的值是輸出的值是12。這就證明了一個對象所占的空間大。這就證明了

60、一個對象所占的空間大 小只取決于該對象中數(shù)據(jù)成員所占的空間,而與成小只取決于該對象中數(shù)據(jù)成員所占的空間,而與成 員函數(shù)無關(guān)。函數(shù)代碼是存儲在對象空間之外的。員函數(shù)無關(guān)。函數(shù)代碼是存儲在對象空間之外的。 如果對同一個類定義了如果對同一個類定義了10個對象,這些對象的成員個對象,這些對象的成員 函數(shù)對應(yīng)的是同一個函數(shù)代碼段,而不是函數(shù)對應(yīng)的是同一個函數(shù)代碼段,而不是10個不同個不同 的函數(shù)代碼段。的函數(shù)代碼段。 需要注意的是:需要注意的是: 雖然調(diào)用不同對象的成員函數(shù)時雖然調(diào)用不同對象的成員函數(shù)時 都是執(zhí)行同一段函數(shù)代碼,但是執(zhí)行結(jié)果一般是不都是執(zhí)行同一段函數(shù)代碼,但是執(zhí)行結(jié)果一般是不 相同的。不

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論