課件_譚浩強(qiáng)_C++程序設(shè)計(jì)_第8章_第1頁
課件_譚浩強(qiáng)_C++程序設(shè)計(jì)_第8章_第2頁
課件_譚浩強(qiáng)_C++程序設(shè)計(jì)_第8章_第3頁
課件_譚浩強(qiáng)_C++程序設(shè)計(jì)_第8章_第4頁
課件_譚浩強(qiáng)_C++程序設(shè)計(jì)_第8章_第5頁
已閱讀5頁,還剩76頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

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

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

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

4、成一個對象客觀世界中任何一個事物都可以看成一個對象(object)。對象可大可小。對象是構(gòu)成系統(tǒng)的基本單位。對象可大可小。對象是構(gòu)成系統(tǒng)的基本單位。任何一個對象都應(yīng)當(dāng)具有這兩個要素,即屬性任何一個對象都應(yīng)當(dāng)具有這兩個要素,即屬性(attribute)和行為和行為(behavior),它能根據(jù)外界給的信它能根據(jù)外界給的信息進(jìn)行相應(yīng)的操作。一個對象往往是由一組屬性和息進(jìn)行相應(yīng)的操作。一個對象往往是由一組屬性和一組行為構(gòu)成的。一般來說,凡是具備屬性和行為一組行為構(gòu)成的。一般來說,凡是具備屬性和行為這兩種要素的,都可以作為對象。這兩種要素的,都可以作為對象。在一個系統(tǒng)中的多個對象之間通過一定的渠道相互

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

6、設(shè)計(jì)這些對象。在對象組成的,并且設(shè)計(jì)這些對象。在C+中,每個中,每個對象都是由數(shù)據(jù)和函數(shù)對象都是由數(shù)據(jù)和函數(shù)(即操作代碼即操作代碼)這兩部分組成這兩部分組成的的,見圖見圖8.2。數(shù)據(jù)體現(xiàn)了前面提到的。數(shù)據(jù)體現(xiàn)了前面提到的“屬性屬性”,如,如一個三角形對象,它的一個三角形對象,它的3個邊長就是它的屬性。函個邊長就是它的屬性。函數(shù)是用來對數(shù)據(jù)進(jìn)行操作的,以便實(shí)現(xiàn)某些功能,數(shù)是用來對數(shù)據(jù)進(jìn)行操作的,以便實(shí)現(xiàn)某些功能,例如可以通過邊長計(jì)算出三角形的面積,并且輸出例如可以通過邊長計(jì)算出三角形的面積,并且輸出三角形的邊長和面積。計(jì)算三角形面積和輸出有關(guān)三角形的邊長和面積。計(jì)算三角形面積和輸出有關(guān)數(shù)據(jù)就是前

7、面提到的行為,在程序設(shè)計(jì)方法中也稱數(shù)據(jù)就是前面提到的行為,在程序設(shè)計(jì)方法中也稱為方法為方法(method)。調(diào)用對象中的函數(shù)就是向該對象調(diào)用對象中的函數(shù)就是向該對象傳送一個消息傳送一個消息(message),要求該對象實(shí)現(xiàn)某一行要求該對象實(shí)現(xiàn)某一行為為(功能功能)。2. 封裝與信息隱蔽封裝與信息隱蔽可以對一個對象進(jìn)行封裝處理,把它的一部分屬性可以對一個對象進(jìn)行封裝處理,把它的一部分屬性和功能對外界屏蔽,也就是說從外界是看不到的和功能對外界屏蔽,也就是說從外界是看不到的,甚至是不可知的。甚至是不可知的。這樣做的好處是大大降低了操作對象的復(fù)雜程度。這樣做的好處是大大降低了操作對象的復(fù)雜程度。面向?qū)?/p>

8、象程序設(shè)計(jì)方法的一個重要特點(diǎn)就是面向?qū)ο蟪绦蛟O(shè)計(jì)方法的一個重要特點(diǎn)就是“封裝封裝性性” (encapsulation),所謂所謂“封裝封裝”,指兩方面的,指兩方面的含義:含義: 一是將有關(guān)的數(shù)據(jù)和操作代碼封裝在一個一是將有關(guān)的數(shù)據(jù)和操作代碼封裝在一個對象中,形成一個基本單位,各個對象之間相對獨(dú)對象中,形成一個基本單位,各個對象之間相對獨(dú)立,互不干擾。二是將對象中某些部分對外隱蔽,立,互不干擾。二是將對象中某些部分對外隱蔽,即隱蔽其內(nèi)部細(xì)節(jié),只留下少量接口,以便與外界即隱蔽其內(nèi)部細(xì)節(jié),只留下少量接口,以便與外界聯(lián)系,接收外界的消息。這種對外界隱蔽的做法稱聯(lián)系,接收外界的消息。這種對外界隱蔽的做法

9、稱為信息隱蔽為信息隱蔽(imformation hiding)。信息隱蔽還有利信息隱蔽還有利于數(shù)據(jù)安全,防止無關(guān)的人了解和修改數(shù)據(jù)。于數(shù)據(jù)安全,防止無關(guān)的人了解和修改數(shù)據(jù)。C+的對象中的函數(shù)名就是對象的對外接口,外界的對象中的函數(shù)名就是對象的對外接口,外界可以通過函數(shù)名來調(diào)用這些函數(shù)來實(shí)現(xiàn)某些行為可以通過函數(shù)名來調(diào)用這些函數(shù)來實(shí)現(xiàn)某些行為(功能功能)。這些將在以后詳細(xì)介紹。這些將在以后詳細(xì)介紹。3. 抽象抽象在程序設(shè)計(jì)方法中,常用到抽象在程序設(shè)計(jì)方法中,常用到抽象(abstraction)這一這一名詞。抽象的過程是將有關(guān)事物的共性歸納、集中名詞。抽象的過程是將有關(guān)事物的共性歸納、集中的過程。的

10、過程。抽象的作用是表示同一類事物的本質(zhì)。抽象的作用是表示同一類事物的本質(zhì)。C和和C+中中的數(shù)據(jù)類型就是對一批具體的數(shù)的抽象。的數(shù)據(jù)類型就是對一批具體的數(shù)的抽象。對象是具體存在的,如一個三角形可以作為一個對對象是具體存在的,如一個三角形可以作為一個對象,象,10個不同尺寸的三角形是個不同尺寸的三角形是10個對象。如果這個對象。如果這10個三角形對象有相同的屬性和行為,可以將它們抽個三角形對象有相同的屬性和行為,可以將它們抽象為一種類型,稱為三角形類型。在象為一種類型,稱為三角形類型。在C+中,這種中,這種類型就稱為類型就稱為“類類(class)”。這這10個三角形就是屬于個三角形就是屬于同一同一

11、“類類”的對象。類是對象的抽象,而對象則是的對象。類是對象的抽象,而對象則是類的特例,或者說是類的具體表現(xiàn)形式。類的特例,或者說是類的具體表現(xiàn)形式。4. 繼承與重用繼承與重用如果在軟件開發(fā)中已經(jīng)建立了一個名為如果在軟件開發(fā)中已經(jīng)建立了一個名為A的的“類類”,又想另外建立一個名為又想另外建立一個名為B的的“類類”,而后者與前者,而后者與前者內(nèi)容基本相同,只是在前者的基礎(chǔ)上增加一些屬性內(nèi)容基本相同,只是在前者的基礎(chǔ)上增加一些屬性和行為,只需在類和行為,只需在類A的基礎(chǔ)上增加一些新內(nèi)容即可。的基礎(chǔ)上增加一些新內(nèi)容即可。這就是面向?qū)ο蟪绦蛟O(shè)計(jì)中的繼承機(jī)制。利用繼承這就是面向?qū)ο蟪绦蛟O(shè)計(jì)中的繼承機(jī)制。利

12、用繼承可以簡化程序設(shè)計(jì)的步驟。可以簡化程序設(shè)計(jì)的步驟?!鞍遵R白馬”繼承了繼承了“馬馬”的基本特征,又增加了新的的基本特征,又增加了新的特征特征(顏色顏色),“馬馬”是父類,或稱為基類,是父類,或稱為基類,“白馬白馬”是從是從“馬馬”派生出來的,稱為子類或派生類。派生出來的,稱為子類或派生類。C+提供了繼承機(jī)制,采用繼承的方法可以很方便提供了繼承機(jī)制,采用繼承的方法可以很方便地利用一個已有的類建立一個新的類。這就是常說地利用一個已有的類建立一個新的類。這就是常說的的“軟件重用軟件重用”(software reusability) 的思想。的思想。5. 多態(tài)性多態(tài)性如果有幾個相似而不完全相同的對象

13、,有時人們要如果有幾個相似而不完全相同的對象,有時人們要求在向它們發(fā)出同一個消息時,它們的反應(yīng)各不相求在向它們發(fā)出同一個消息時,它們的反應(yīng)各不相同,分別執(zhí)行不同的操作。這種情況就是多態(tài)現(xiàn)象。同,分別執(zhí)行不同的操作。這種情況就是多態(tài)現(xiàn)象。如,在如,在Windows環(huán)境下,用鼠標(biāo)雙擊一個文件對象環(huán)境下,用鼠標(biāo)雙擊一個文件對象(這就是向?qū)ο髠魉鸵粋€消息這就是向?qū)ο髠魉鸵粋€消息),如果對象是一個可,如果對象是一個可執(zhí)行文件,則會執(zhí)行此程序,如果對象是一個文本執(zhí)行文件,則會執(zhí)行此程序,如果對象是一個文本文件,則啟動文本編輯器并打開該文件。文件,則啟動文本編輯器并打開該文件。在在C+中,所謂多態(tài)性中,所謂

14、多態(tài)性(polymorphism)是指:是指: 由繼由繼承而產(chǎn)生的相關(guān)的不同的類,其對象對同一消息會承而產(chǎn)生的相關(guān)的不同的類,其對象對同一消息會作出不同的響應(yīng)。多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計(jì)的一作出不同的響應(yīng)。多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計(jì)的一個重要特征,能增加程序的靈活性。個重要特征,能增加程序的靈活性。傳統(tǒng)的面向過程程序設(shè)計(jì)是圍繞功能進(jìn)行的,用一傳統(tǒng)的面向過程程序設(shè)計(jì)是圍繞功能進(jìn)行的,用一個函數(shù)實(shí)現(xiàn)一個功能。所有的數(shù)據(jù)都是公用的,一個函數(shù)實(shí)現(xiàn)一個功能。所有的數(shù)據(jù)都是公用的,一個函數(shù)可以使用任何一組數(shù)據(jù),而一組數(shù)據(jù)又能被個函數(shù)可以使用任何一組數(shù)據(jù),而一組數(shù)據(jù)又能被多個函數(shù)所使用(見圖多個函數(shù)所使用(見圖

15、8.3)。)。 圖圖8.38.1.2 面向?qū)ο蟪绦蛟O(shè)計(jì)的特點(diǎn)面向?qū)ο蟪绦蛟O(shè)計(jì)的特點(diǎn)面向?qū)ο蟪绦蛟O(shè)計(jì)采取的是另外一種思路。它面對面向?qū)ο蟪绦蛟O(shè)計(jì)采取的是另外一種思路。它面對的是一個個對象。實(shí)際上,每一組數(shù)據(jù)都是有特定的是一個個對象。實(shí)際上,每一組數(shù)據(jù)都是有特定的用途的,是某種操作的對象。也就是說,一組操的用途的,是某種操作的對象。也就是說,一組操作調(diào)用一組數(shù)據(jù)。作調(diào)用一組數(shù)據(jù)。程序設(shè)計(jì)者的任務(wù)包括兩個方面:程序設(shè)計(jì)者的任務(wù)包括兩個方面: 一是設(shè)計(jì)所需一是設(shè)計(jì)所需的各種類和對象,即決定把哪些數(shù)據(jù)和操作封裝在的各種類和對象,即決定把哪些數(shù)據(jù)和操作封裝在一起;二是考慮怎樣向有關(guān)對象發(fā)送消息,以完成一起

16、;二是考慮怎樣向有關(guān)對象發(fā)送消息,以完成所需的任務(wù)。這時他如同一個總調(diào)度,不斷地向各所需的任務(wù)。這時他如同一個總調(diào)度,不斷地向各個對象發(fā)出命令,讓這些對象活動起來個對象發(fā)出命令,讓這些對象活動起來(或者說激或者說激活這些對象活這些對象),完成自己職責(zé)范圍內(nèi)的工作。各個,完成自己職責(zé)范圍內(nèi)的工作。各個對象的操作完成了,整體任務(wù)也就完成了。顯然,對象的操作完成了,整體任務(wù)也就完成了。顯然,對一個大型任務(wù)來說,面向?qū)ο蟪绦蛟O(shè)計(jì)方法是十對一個大型任務(wù)來說,面向?qū)ο蟪绦蛟O(shè)計(jì)方法是十分有效的,它能大大降低程序設(shè)計(jì)人員的工作難度,分有效的,它能大大降低程序設(shè)計(jì)人員的工作難度,減少出錯機(jī)會。減少出錯機(jī)會。類是

17、類是C+中十分重要的概念,它是實(shí)現(xiàn)面向?qū)ο蟪讨惺种匾母拍?,它是?shí)現(xiàn)面向?qū)ο蟪绦蛟O(shè)計(jì)的基礎(chǔ)。類是所有面向?qū)ο蟮恼Z言的共同特序設(shè)計(jì)的基礎(chǔ)。類是所有面向?qū)ο蟮恼Z言的共同特征,所有面向?qū)ο蟮恼Z言都提供了這種類型。一個征,所有面向?qū)ο蟮恼Z言都提供了這種類型。一個有一定規(guī)模的有一定規(guī)模的C+程序是由許多類所構(gòu)成的。程序是由許多類所構(gòu)成的。C+支持面向過程的程序設(shè)計(jì),也支持基于對象的支持面向過程的程序設(shè)計(jì),也支持基于對象的程序設(shè)計(jì),又支持面向?qū)ο蟮某绦蛟O(shè)計(jì)。在本章到程序設(shè)計(jì),又支持面向?qū)ο蟮某绦蛟O(shè)計(jì)。在本章到第第10章將介紹基于對象的程序設(shè)計(jì)。包括類和對象章將介紹基于對象的程序設(shè)計(jì)。包括類和對象的概念、

18、類的機(jī)制和聲明、類對象的定義與使用等。的概念、類的機(jī)制和聲明、類對象的定義與使用等。這是面向?qū)ο蟮某绦蛟O(shè)計(jì)的基礎(chǔ)。這是面向?qū)ο蟮某绦蛟O(shè)計(jì)的基礎(chǔ)。8.1.3 類和對象的作用類和對象的作用基于對象就是基于類。與面向過程的程序不同,基基于對象就是基于類。與面向過程的程序不同,基于對象的程序是以類和對象為基礎(chǔ)的,程序的操作于對象的程序是以類和對象為基礎(chǔ)的,程序的操作是圍繞對象進(jìn)行的。在此基礎(chǔ)上利用了繼承機(jī)制和是圍繞對象進(jìn)行的。在此基礎(chǔ)上利用了繼承機(jī)制和多態(tài)性,就成為面向?qū)ο蟮某绦蛟O(shè)計(jì)多態(tài)性,就成為面向?qū)ο蟮某绦蛟O(shè)計(jì)(有時不細(xì)分有時不細(xì)分基于對象程序設(shè)計(jì)和面向?qū)ο蟪绦蛟O(shè)計(jì),而把二者基于對象程序設(shè)計(jì)和面向

19、對象程序設(shè)計(jì),而把二者合稱為面向?qū)ο蟮某绦蛟O(shè)計(jì)合稱為面向?qū)ο蟮某绦蛟O(shè)計(jì))?;趯ο蟪绦蛟O(shè)計(jì)所面對的是一個個對象。所有的基于對象程序設(shè)計(jì)所面對的是一個個對象。所有的數(shù)據(jù)分別屬于不同的對象。數(shù)據(jù)分別屬于不同的對象。在面向過程的結(jié)構(gòu)化程序設(shè)計(jì)中,人們常使用這樣在面向過程的結(jié)構(gòu)化程序設(shè)計(jì)中,人們常使用這樣的公式來表述程序:的公式來表述程序: 程序程序=算法數(shù)據(jù)結(jié)構(gòu)算法數(shù)據(jù)結(jié)構(gòu)算法和數(shù)據(jù)結(jié)構(gòu)兩者是互相獨(dú)立、分開設(shè)計(jì)的,面算法和數(shù)據(jù)結(jié)構(gòu)兩者是互相獨(dú)立、分開設(shè)計(jì)的,面向過程的程序設(shè)計(jì)是以算法為主體的。在實(shí)踐中人向過程的程序設(shè)計(jì)是以算法為主體的。在實(shí)踐中人們逐漸認(rèn)識到算法和數(shù)據(jù)結(jié)構(gòu)是互相緊密聯(lián)系不可們逐漸認(rèn)識

20、到算法和數(shù)據(jù)結(jié)構(gòu)是互相緊密聯(lián)系不可分的,應(yīng)當(dāng)以一個算法對應(yīng)一組數(shù)據(jù)結(jié)構(gòu),而不宜分的,應(yīng)當(dā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è)計(jì)就構(gòu)對應(yīng)多個算法?;趯ο蠛兔嫦?qū)ο蟪绦蛟O(shè)計(jì)就是把一個算法和一組數(shù)據(jù)結(jié)構(gòu)封裝在一個對象中。是把一個算法和一組數(shù)據(jù)結(jié)構(gòu)封裝在一個對象中。因此,就形成了新的觀念:因此,就形成了新的觀念: 對象對象 = 算法算法 數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)程序程序 = (對象對象+對象對象+對象對象+) + 消息消息 或:或: 程序程序 = 對象對象s + 消息消息“對象對象s

21、”表示多個對象。消息的作用就是對對象的表示多個對象。消息的作用就是對對象的控制。程序設(shè)計(jì)的關(guān)鍵是設(shè)計(jì)好每一個對象,及確控制。程序設(shè)計(jì)的關(guān)鍵是設(shè)計(jì)好每一個對象,及確定向這些對象發(fā)出的命令,使各對象完成相應(yīng)操作。定向這些對象發(fā)出的命令,使各對象完成相應(yīng)操作。隨著軟件規(guī)模的迅速增大,軟件人員面臨的問題十隨著軟件規(guī)模的迅速增大,軟件人員面臨的問題十分復(fù)雜。需要規(guī)范整個軟件開發(fā)過程,明確軟件開分復(fù)雜。需要規(guī)范整個軟件開發(fā)過程,明確軟件開發(fā)過程中每個階段的任務(wù),在保證前一個階段工作發(fā)過程中每個階段的任務(wù),在保證前一個階段工作的正確性的情況下,再進(jìn)行下一階段的工作。這就的正確性的情況下,再進(jìn)行下一階段的工作

22、。這就是軟件工程學(xué)需要研究和解決的問題。是軟件工程學(xué)需要研究和解決的問題。面向?qū)ο蟮能浖こ贪ㄒ韵聨讉€部分:面向?qū)ο蟮能浖こ贪ㄒ韵聨讉€部分: 8.1.4 面向?qū)ο蟮能浖_發(fā)面向?qū)ο蟮能浖_發(fā)1. 面向?qū)ο蠓治雒嫦驅(qū)ο蠓治?object oriented analysis,OOA) 軟件工程中的系統(tǒng)分析階段,系統(tǒng)分析員要和用戶軟件工程中的系統(tǒng)分析階段,系統(tǒng)分析員要和用戶結(jié)合在一起,對用戶的需求作出精確的分析和明確結(jié)合在一起,對用戶的需求作出精確的分析和明確的描述,從宏觀的角度概括出系統(tǒng)應(yīng)該做什么的描述,從宏觀的角度概括出系統(tǒng)應(yīng)該做什么(而而不是怎么做不是怎么做)。面向?qū)ο蟮姆治?,要按照面?/p>

23、對象。面向?qū)ο蟮姆治?,要按照面向?qū)ο蟮母拍詈头椒ǎ趯θ蝿?wù)的分析中,從客觀存在的的概念和方法,在對任務(wù)的分析中,從客觀存在的事物和事物之間的關(guān)系,歸納出有關(guān)的對象事物和事物之間的關(guān)系,歸納出有關(guān)的對象(包括包括對象的屬性和行為對象的屬性和行為)以及對象之間的聯(lián)系,并將具以及對象之間的聯(lián)系,并將具有相同屬性和行為的對象用一個類有相同屬性和行為的對象用一個類(class)來表示。來表示。建立一個能反映真實(shí)工作情況的需求模型。建立一個能反映真實(shí)工作情況的需求模型。2. 面向?qū)ο笤O(shè)計(jì)面向?qū)ο笤O(shè)計(jì)(object oriented design,OOD)根據(jù)面向?qū)ο蠓治鲭A段形成的需求模型,對每一部根據(jù)面向

24、對象分析階段形成的需求模型,對每一部分分別進(jìn)行具體的設(shè)計(jì),首先是進(jìn)行類的設(shè)計(jì),類分分別進(jìn)行具體的設(shè)計(jì),首先是進(jìn)行類的設(shè)計(jì),類的設(shè)計(jì)可能包含多個層次的設(shè)計(jì)可能包含多個層次(利用繼承與派生利用繼承與派生)。然后。然后以這些類為基礎(chǔ)提出程序設(shè)計(jì)的思路和方法,包括以這些類為基礎(chǔ)提出程序設(shè)計(jì)的思路和方法,包括對算法的設(shè)計(jì)。在設(shè)計(jì)階段,并不牽涉某一種具體對算法的設(shè)計(jì)。在設(shè)計(jì)階段,并不牽涉某一種具體的計(jì)算機(jī)語言,而是用一種更通用的描述工具的計(jì)算機(jī)語言,而是用一種更通用的描述工具(如如偽代碼或流程圖偽代碼或流程圖)來描述。來描述。3. 面向?qū)ο缶幊堂嫦驅(qū)ο缶幊?object oriented programm

25、ing,OOP)根據(jù)面向?qū)ο笤O(shè)計(jì)的結(jié)果,用一種計(jì)算機(jī)語言把它根據(jù)面向?qū)ο笤O(shè)計(jì)的結(jié)果,用一種計(jì)算機(jī)語言把它寫成程序,顯然應(yīng)當(dāng)選用面向?qū)ο蟮挠?jì)算機(jī)語言寫成程序,顯然應(yīng)當(dāng)選用面向?qū)ο蟮挠?jì)算機(jī)語言(例如例如C+),否則無法實(shí)現(xiàn)面向?qū)ο笤O(shè)計(jì)的要求。否則無法實(shí)現(xiàn)面向?qū)ο笤O(shè)計(jì)的要求。4. 面向?qū)ο鬁y試面向?qū)ο鬁y試(object oriented test,OOT)在寫好程序后交給用戶使用前,必須對程序進(jìn)行嚴(yán)在寫好程序后交給用戶使用前,必須對程序進(jìn)行嚴(yán)格的測試。測試的目的是發(fā)現(xiàn)程序中的錯誤并改正格的測試。測試的目的是發(fā)現(xiàn)程序中的錯誤并改正它。面向?qū)ο鬁y試是用面向?qū)ο蟮姆椒ㄟM(jìn)行測試,它。面向?qū)ο鬁y試是用面向?qū)ο?/p>

26、的方法進(jìn)行測試,以類作為測試的基本單元。以類作為測試的基本單元。5. 面向?qū)ο缶S護(hù)面向?qū)ο缶S護(hù)(object oriented soft maintenance,OOSM)因?yàn)閷ο蟮姆庋b性,修改一個對象對其他對象影響因?yàn)閷ο蟮姆庋b性,修改一個對象對其他對象影響很小。利用面向?qū)ο蟮姆椒ňS護(hù)程序,大大提高了很小。利用面向?qū)ο蟮姆椒ňS護(hù)程序,大大提高了軟件維護(hù)的效率。軟件維護(hù)的效率?,F(xiàn)在設(shè)計(jì)一個大的軟件,是嚴(yán)格按照面向?qū)ο筌浖F(xiàn)在設(shè)計(jì)一個大的軟件,是嚴(yán)格按照面向?qū)ο筌浖こ痰墓こ痰?個階段進(jìn)行的,這個階段進(jìn)行的,這5個階段的工作不是由一個階段的工作不是由一個人從頭到尾完成的,而是由不同的人分別完成的

27、。個人從頭到尾完成的,而是由不同的人分別完成的。這樣,這樣,OOP階段的任務(wù)就比較簡單了,程序編寫階段的任務(wù)就比較簡單了,程序編寫者只需要根據(jù)者只需要根據(jù)OOD提出的思路用面向?qū)ο笳Z言編提出的思路用面向?qū)ο笳Z言編寫出程序即可。在一個大型軟件的開發(fā)中,寫出程序即可。在一個大型軟件的開發(fā)中,OOP只是面向?qū)ο箝_發(fā)過程中的一個很小的部分。只是面向?qū)ο箝_發(fā)過程中的一個很小的部分。如果所處理的是一個較簡單的問題,可以不必嚴(yán)格如果所處理的是一個較簡單的問題,可以不必嚴(yán)格按照以上按照以上5個階段進(jìn)行,往往由程序設(shè)計(jì)者按照面?zhèn)€階段進(jìn)行,往往由程序設(shè)計(jì)者按照面向?qū)ο蟮姆椒ㄟM(jìn)行程序設(shè)計(jì),包括類的設(shè)計(jì)向?qū)ο蟮姆椒ㄟM(jìn)

28、行程序設(shè)計(jì),包括類的設(shè)計(jì)(或選或選用已有的類用已有的類)和程序的設(shè)計(jì)。和程序的設(shè)計(jì)。每一個實(shí)體都是對象。有一些對象是具有相同的結(jié)每一個實(shí)體都是對象。有一些對象是具有相同的結(jié)構(gòu)和特性的。每個對象都屬于一個特定的類型。構(gòu)和特性的。每個對象都屬于一個特定的類型。在在C+中對象的類型稱為類中對象的類型稱為類(class)。類代表了某一類代表了某一批對象的共性和特征。前面已說明:批對象的共性和特征。前面已說明: 類是對象的類是對象的抽象,而對象是類的具體實(shí)例抽象,而對象是類的具體實(shí)例(instance)。正如同正如同結(jié)構(gòu)體類型和結(jié)構(gòu)體變量的關(guān)系一樣,人們先聲明結(jié)構(gòu)體類型和結(jié)構(gòu)體變量的關(guān)系一樣,人們先聲明

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

30、象的,不占用內(nèi)存,而對象是具體的,占用存儲空間。在一開始時弄清對象和類的關(guān)系是十分存儲空間。在一開始時弄清對象和類的關(guān)系是十分重要的。重要的。類是用戶自己指定的類型。如果程序中要用到類類類是用戶自己指定的類型。如果程序中要用到類類型,必須自己根據(jù)需要進(jìn)行聲明,或者使用別人已型,必須自己根據(jù)需要進(jìn)行聲明,或者使用別人已設(shè)計(jì)好的類。設(shè)計(jì)好的類。C+標(biāo)準(zhǔn)本身并不提供現(xiàn)成的類的名標(biāo)準(zhǔ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)體類型的方法:

31、struct Student /聲明了一個名為聲明了一個名為Student的結(jié)構(gòu)體類型的結(jié)構(gòu)體類型 int num;char name20;char sex;Student stud1,stud2; /定義了兩個結(jié)構(gòu)體變量定義了兩個結(jié)構(gòu)體變量stud1和和stud28.2.2 聲明類類型聲明類類型它只包括數(shù)據(jù),沒有包括操作?,F(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ù)

32、coutnum:numendl;coutname:nameendl; coutsex:sexendl; /以上以上4行是函數(shù)中的操作語句行是函數(shù)中的操作語句 ;Student stud1,stud2; /定義了兩個定義了兩個Student 類的對象類的對象stud1和和stud2 可以看到聲明類的方法是由聲明結(jié)構(gòu)體類型的方法可以看到聲明類的方法是由聲明結(jié)構(gòu)體類型的方法發(fā)展而來的。發(fā)展而來的。可以看到,類可以看到,類(class)就是對象的類型。實(shí)際上,類就是對象的類型。實(shí)際上,類是一種廣義的數(shù)據(jù)類型。類這種數(shù)據(jù)類型中的數(shù)據(jù)是一種廣義的數(shù)據(jù)類型。類這種數(shù)據(jù)類型中的數(shù)據(jù)既包含數(shù)據(jù),也包含操作數(shù)據(jù)的

33、函數(shù)。既包含數(shù)據(jù),也包含操作數(shù)據(jù)的函數(shù)。不能把類中的全部成員與外界隔離,一般是把數(shù)據(jù)不能把類中的全部成員與外界隔離,一般是把數(shù)據(jù)隱蔽起來,而把成員函數(shù)作為對外界的接口。隱蔽起來,而把成員函數(shù)作為對外界的接口??梢詫⑸厦骖惖穆暶鞲臑榭梢詫⑸厦骖惖穆暶鞲臑閏lass Student /聲明類類型聲明類類型 private: /聲明以下部分為私有的聲明以下部分為私有的int num;char name20; char sex; public: /聲明以下部分為公用的聲明以下部分為公用的void display( ) coutnum:numendl;coutname:nameendl;coutsex:

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

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

36、部分。如果在類體中既不寫關(guān)鍵字寫關(guān)鍵字private,又不寫又不寫public,就默認(rèn)為就默認(rèn)為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)pr

37、ivate部分,后出部分,后出現(xiàn)現(xiàn)public部分,如上面所示?,F(xiàn)在的部分,如上面所示。現(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)裝常用的基本的類

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

39、數(shù)據(jù)和函數(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合起來作為一個類名,用來定義合起來作為一個類名,用

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

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

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

43、擴(kuò)展了。而且把它的功能也擴(kuò)展了。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 display( ) /成員函數(shù)成員函數(shù)coutnum:numendl;

44、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)體,而是使它也具有類的特點(diǎn),的結(jié)構(gòu)體,而是使它也具有類的特點(diǎn),以便于用于面向?qū)ο蟪绦蛟O(shè)計(jì)。用以便于用于面向?qū)ο蟪绦蛟O(shè)計(jì)。用struct聲明的結(jié)聲明的結(jié)構(gòu)體類型實(shí)際上也就是類。構(gòu)體類型實(shí)際上也就是類。用用struct聲明的類,如果對其成員不作聲明的類,如果對其成員不作priv

45、ate或或public的聲明,系統(tǒng)將其默認(rèn)為的聲明,系統(tǒng)將其默認(rèn)為public。如果想分。如果想分別指定私有成員和公用成員,則應(yīng)用別指定私有成員和公用成員,則應(yīng)用private或或public作顯式聲明。而用作顯式聲明。而用class定義的類,如果不作定義的類,如果不作private或或public聲明,系統(tǒng)將其成員默認(rèn)為聲明,系統(tǒng)將其成員默認(rèn)為private,在需要時也可以自己用顯式聲明改變。在需要時也可以自己用顯式聲明改變。如果希望成員是公用的,使用如果希望成員是公用的,使用struct比較方便,如比較方便,如果希望部分成員是私有的,宜用果希望部分成員是私有的,宜用class。建議盡量使建

46、議盡量使用用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(私有的私有的)、public(公用的公用的)或或protected(受保護(hù)的受保護(hù)的)。在使用類函數(shù)時,要注意調(diào)。在使

47、用類函數(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ù)可以訪問本類中任何成員(包括私有的和包括私有的和公用的公用的),可以引用在本作用域中有效的數(shù)據(jù)。,可以引用在本作用域中有效的數(shù)據(jù)。一般的做法是將需要被外界調(diào)用的成員函數(shù)指定為一般的

48、做法是將需要被外界調(diào)用的成員函數(shù)指定為public,它們是類的對外接口。但應(yīng)注意,并非要它們是類的對外接口。但應(yīng)注意,并非要求把所有成員函數(shù)都指定為求把所有成員函數(shù)都指定為public。有的函數(shù)并不有的函數(shù)并不是準(zhǔn)備為外界調(diào)用的,而是為本類中的成員函數(shù)所是準(zhǔn)備為外界調(diào)用的,而是為本類中的成員函數(shù)所調(diào)用的,就應(yīng)該將它們指定為調(diào)用的,就應(yīng)該將它們指定為private。這種函數(shù)的這種函數(shù)的作用是支持其他函數(shù)的操作,是類中其他成員的工作用是支持其他函數(shù)的操作,是類中其他成員的工具函數(shù)具函數(shù)(utility function),類外用戶不能調(diào)用這些私類外用戶不能調(diào)用這些私有的工具函數(shù)。有的工具函數(shù)。 類

49、的成員函數(shù)是類體中十分重要的部分。如果一個類的成員函數(shù)是類體中十分重要的部分。如果一個類中不包含成員函數(shù),就等同于類中不包含成員函數(shù),就等同于C語言中的結(jié)構(gòu)體語言中的結(jié)構(gòu)體了,體現(xiàn)不出類在面向?qū)ο蟪绦蛟O(shè)計(jì)中的作用。了,體現(xiàn)不出類在面向?qū)ο蟪绦蛟O(shè)計(jì)中的作用。在前面已經(jīng)看到成員函數(shù)是在類體中定義的。也可在前面已經(jīng)看到成員函數(shù)是在類體中定義的。也可以在類體中只寫成員函數(shù)的聲明,而在類的外面進(jìn)以在類體中只寫成員函數(shù)的聲明,而在類的外面進(jìn)行函數(shù)定義。如行函數(shù)定義。如 class Student public:void display( ); /公用成員函數(shù)原型聲明公用成員函數(shù)原型聲明private:in

50、t 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ù)在類外定義成員函數(shù)注意:注意: 在類體中直接定義函數(shù)時,不需要在函數(shù)在類體中直接定義函數(shù)時,不需要在函數(shù)名前面加上類名,因?yàn)楹瘮?shù)屬于哪一個類是不言而名前面加上類名,因?yàn)楹瘮?shù)屬于

51、哪一個類是不言而喻的。但成員函數(shù)在類外定義時,必須在函數(shù)名前喻的。但成員函數(shù)在類外定義時,必須在函數(shù)名前面加上類名,予以限定面加上類名,予以限定(qualifed),“ ”是作用域是作用域限定符限定符(field qualifier)或稱作用域運(yùn)算符,用它聲或稱作用域運(yùn)算符,用它聲明函數(shù)是屬于哪個類的。明函數(shù)是屬于哪個類的。如果在作用域運(yùn)算符如果在作用域運(yùn)算符“ ”的前面沒有類名,或者的前面沒有類名,或者函數(shù)名前面既無類名又無作用域運(yùn)算符函數(shù)名前面既無類名又無作用域運(yùn)算符“ ”,如,如 display( ) 或或 display( )則表示則表示display函數(shù)不屬于任何類,這個函數(shù)不是成函

52、數(shù)不屬于任何類,這個函數(shù)不是成員函數(shù),而是全局函數(shù),即非成員函數(shù)的一般普通員函數(shù),而是全局函數(shù),即非成員函數(shù)的一般普通函數(shù)。函數(shù)。類函數(shù)必須先在類體中作原型聲明,然后在類外定類函數(shù)必須先在類體中作原型聲明,然后在類外定義,也就是說類體的位置應(yīng)在函數(shù)定義之前,否則義,也就是說類體的位置應(yīng)在函數(shù)定義之前,否則編譯時會出錯。編譯時會出錯。雖然函數(shù)在類的外部定義,但在調(diào)用成員函數(shù)時會雖然函數(shù)在類的外部定義,但在調(diào)用成員函數(shù)時會根據(jù)在類中聲明的函數(shù)原型找到函數(shù)的定義(函數(shù)根據(jù)在類中聲明的函數(shù)原型找到函數(shù)的定義(函數(shù)代碼),從而執(zhí)行該函數(shù)。代碼),從而執(zhí)行該函數(shù)。在類的內(nèi)部對成員函數(shù)作聲明,而在類體外定義

53、成在類的內(nèi)部對成員函數(shù)作聲明,而在類體外定義成員函數(shù),這是程序設(shè)計(jì)的一種良好習(xí)慣。如果一個員函數(shù),這是程序設(shè)計(jì)的一種良好習(xí)慣。如果一個函數(shù),其函數(shù)體只有函數(shù),其函數(shù)體只有23行,一般可在聲明類時在行,一般可在聲明類時在類體中定義。多于類體中定義。多于3行的函數(shù),一般在類體內(nèi)聲明,行的函數(shù),一般在類體內(nèi)聲明,在類外定義。在類外定義。關(guān)于內(nèi)置關(guān)于內(nèi)置(inline)函數(shù),已在第函數(shù),已在第4章第章第4.5節(jié)中作過介節(jié)中作過介紹。類的成員函數(shù)也可以指定為內(nèi)置函數(shù)。紹。類的成員函數(shù)也可以指定為內(nèi)置函數(shù)。在類體中定義的成員函數(shù)的規(guī)模一般都很小,而系在類體中定義的成員函數(shù)的規(guī)模一般都很小,而系統(tǒng)調(diào)用函數(shù)的

54、過程所花費(fèi)的時間開銷相對是比較大統(tǒng)調(diào)用函數(shù)的過程所花費(fèi)的時間開銷相對是比較大的。調(diào)用一個函數(shù)的時間開銷遠(yuǎn)遠(yuǎn)大于小規(guī)模函數(shù)的。調(diào)用一個函數(shù)的時間開銷遠(yuǎn)遠(yuǎn)大于小規(guī)模函數(shù)體中全部語句的執(zhí)行時間。為了減少時間開銷,如體中全部語句的執(zhí)行時間。為了減少時間開銷,如果在類體中定義的成員函數(shù)中不包括循環(huán)等控制結(jié)果在類體中定義的成員函數(shù)中不包括循環(huán)等控制結(jié)構(gòu),構(gòu),C+系統(tǒng)會自動將它們作為內(nèi)置系統(tǒng)會自動將它們作為內(nèi)置(inline)函數(shù)來函數(shù)來處理。也就是說,在程序調(diào)用這些成員函數(shù)時,并處理。也就是說,在程序調(diào)用這些成員函數(shù)時,并不是真正地執(zhí)行函數(shù)的調(diào)用過程不是真正地執(zhí)行函數(shù)的調(diào)用過程(如保留返回地址如保留返回地

55、址等處理等處理),而是把函數(shù)代碼嵌入程序的調(diào)用點(diǎn)。這,而是把函數(shù)代碼嵌入程序的調(diào)用點(diǎn)。這樣可以大大減少調(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ù),可以省略inline,因?yàn)橐驗(yàn)檫@些成員函數(shù)已被隱含地指定為內(nèi)置函數(shù)。如這些成員函數(shù)已被隱含地指定為內(nèi)置函數(shù)。如 class Student public: void display( ) coutnum:numendl;coutname:nameen

56、dl; coutsex:sexendl; private:int num;string name; char sex;其中第其中第3行行void display( )也可以寫成也可以寫成inline void display( )將將display函數(shù)顯式地聲明為內(nèi)置函數(shù)。以上兩種寫函數(shù)顯式地聲明為內(nèi)置函數(shù)。以上兩種寫法是等效的。對在類體內(nèi)定義的函數(shù),一般都省寫法是等效的。對在類體內(nèi)定義的函數(shù),一般都省寫inline。應(yīng)該注意的是:應(yīng)該注意的是: 如果成員函數(shù)不在類體內(nèi)定義,如果成員函數(shù)不在類體內(nèi)定義,而在類體外定義,系統(tǒng)并不把它默認(rèn)為內(nèi)置而在類體外定義,系統(tǒng)并不把它默認(rèn)為內(nèi)置(inline)

57、函數(shù),調(diào)用這些成員函數(shù)的過程和調(diào)用一般函數(shù)的函數(shù),調(diào)用這些成員函數(shù)的過程和調(diào)用一般函數(shù)的過程是相同的。如果想將這些成員函數(shù)指定為內(nèi)置過程是相同的。如果想將這些成員函數(shù)指定為內(nèi)置函數(shù),應(yīng)當(dāng)用函數(shù),應(yīng)當(dāng)用inline作顯式聲明。如作顯式聲明。如class Student public:inline void display( ); /聲明此成員函數(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ù)coutnu

58、m:numendl; coutname:nameendl; coutsex:sexabc;可以用下面的語句來輸出該類對象所占用的字節(jié)數(shù):可以用下面的語句來輸出該類對象所占用的字節(jié)數(shù):coutsizeof(Time)endl;輸出的值是輸出的值是12。這就證明了一個對象所占的空間大。這就證明了一個對象所占的空間大小只取決于該對象中數(shù)據(jù)成員所占的空間,而與成小只取決于該對象中數(shù)據(jù)成員所占的空間,而與成員函數(shù)無關(guān)。函數(shù)代碼是存儲在對象空間之外的。員函數(shù)無關(guān)。函數(shù)代碼是存儲在對象空間之外的。如果對同一個類定義了如果對同一個類定義了10個對象,這些對象的成員個對象,這些對象的成員函數(shù)對應(yīng)的是同一個函數(shù)代

59、碼段,而不是函數(shù)對應(yīng)的是同一個函數(shù)代碼段,而不是10個不同個不同的函數(shù)代碼段。的函數(shù)代碼段。需要注意的是:需要注意的是: 雖然調(diào)用不同對象的成員函數(shù)時雖然調(diào)用不同對象的成員函數(shù)時都是執(zhí)行同一段函數(shù)代碼,但是執(zhí)行結(jié)果一般是不都是執(zhí)行同一段函數(shù)代碼,但是執(zhí)行結(jié)果一般是不相同的。不同的對象使用的是同一個函數(shù)代碼段,相同的。不同的對象使用的是同一個函數(shù)代碼段,它怎么能夠分別對不同對象中的數(shù)據(jù)進(jìn)行操作呢?它怎么能夠分別對不同對象中的數(shù)據(jù)進(jìn)行操作呢?原來原來C+為此專門設(shè)立了一個名為為此專門設(shè)立了一個名為this的指針,用的指針,用來指向不同的對象。來指向不同的對象。需要說明:需要說明: (1) 不論成員

60、函數(shù)在類內(nèi)定義還是在類外定義,成不論成員函數(shù)在類內(nèi)定義還是在類外定義,成員函數(shù)的代碼段都用同一種方式存儲。員函數(shù)的代碼段都用同一種方式存儲。(2) 不要將成員函數(shù)的這種存儲方式和不要將成員函數(shù)的這種存儲方式和inline(內(nèi)置內(nèi)置)函數(shù)的概念混淆。函數(shù)的概念混淆。(3) 應(yīng)當(dāng)說明:應(yīng)當(dāng)說明: 常說的常說的“某某對象的成員函數(shù)某某對象的成員函數(shù)”,是從邏輯的角度而言的,而成員函數(shù)的存儲方式,是從邏輯的角度而言的,而成員函數(shù)的存儲方式,是從物理的角度而言的,二者是不矛盾的。是從物理的角度而言的,二者是不矛盾的。在程序中經(jīng)常需要訪問對象中的成員。訪問對象中在程序中經(jīng)常需要訪問對象中的成員。訪問對象中的成員可以有的成

溫馨提示

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

評論

0/150

提交評論