第8章類和對象的特性_第1頁
第8章類和對象的特性_第2頁
第8章類和對象的特性_第3頁
第8章類和對象的特性_第4頁
第8章類和對象的特性_第5頁
已閱讀5頁,還剩71頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、1第第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)用舉例28.1 面向?qū)ο蟪绦蛟O(shè)計方法概述面向?qū)ο蟪绦蛟O(shè)計方法概述 到目前為止,介紹的都是到目前為止,介紹的都是C+在面向過程的程序在面向過程的程序設(shè)計中的應(yīng)用。設(shè)計中的應(yīng)用。 對于規(guī)模比較小的程序,編程者可以直接編寫出對于規(guī)模比較小的程序,編程者可以直接編寫出一個面向過程的程序,詳細地描述每

2、一瞬時的數(shù)據(jù)結(jié)一個面向過程的程序,詳細地描述每一瞬時的數(shù)據(jù)結(jié)構(gòu)及對其的操作過程。構(gòu)及對其的操作過程。 但是當(dāng)程序規(guī)模較大時,就顯得力不從心了。但是當(dāng)程序規(guī)模較大時,就顯得力不從心了。C+就是就是為了解決編寫大程序過程中的困難而產(chǎn)生的為了解決編寫大程序過程中的困難而產(chǎn)生的。38.1.1 什么是面向?qū)ο蟮某绦蛟O(shè)計什么是面向?qū)ο蟮某绦蛟O(shè)計 面向?qū)ο蟮某绦蛟O(shè)計的思路和人們?nèi)粘I钪刑幟嫦驅(qū)ο蟮某绦蛟O(shè)計的思路和人們?nèi)粘I钪刑幚韱栴}的思路是相似的。在自然世界和社會生活中,理問題的思路是相似的。在自然世界和社會生活中,一個復(fù)雜的事物總是由許多部分組成的。一個復(fù)雜的事物總是由許多部分組成的。 當(dāng)人們生產(chǎn)汽車

3、時,分別設(shè)計和制造發(fā)動機、底當(dāng)人們生產(chǎn)汽車時,分別設(shè)計和制造發(fā)動機、底盤、車身和輪子,最后把它們組裝在一起。在組裝時,盤、車身和輪子,最后把它們組裝在一起。在組裝時,各部分之間有一定的聯(lián)系,以便協(xié)調(diào)工作。這就是面各部分之間有一定的聯(lián)系,以便協(xié)調(diào)工作。這就是面向?qū)ο蟮某绦蛟O(shè)計的基本思路。向?qū)ο蟮某绦蛟O(shè)計的基本思路。41. 對象對象 客觀世界中任何一個事物都可以看成一個對象客觀世界中任何一個事物都可以看成一個對象(object)。對象可大可小。對象是構(gòu)成系統(tǒng)的基本單位。對象可大可小。對象是構(gòu)成系統(tǒng)的基本單位。 任何一個對象都應(yīng)當(dāng)具有這兩個要素,即任何一個對象都應(yīng)當(dāng)具有這兩個要素,即屬性屬性(att

4、ribute)和行為和行為(behavior),它能根據(jù)外界給的信息,它能根據(jù)外界給的信息進行相應(yīng)的操作。一個對象往往是由一組屬性和一組行為進行相應(yīng)的操作。一個對象往往是由一組屬性和一組行為構(gòu)成的。一般來說,凡是具備屬性和行為這兩種要素的,構(gòu)成的。一般來說,凡是具備屬性和行為這兩種要素的,都可以作為對象。都可以作為對象。5 在一個系統(tǒng)中的多個對象之間通過一定的渠道相互在一個系統(tǒng)中的多個對象之間通過一定的渠道相互聯(lián)系,如圖示意。要使某一個對象實現(xiàn)某一種行為聯(lián)系,如圖示意。要使某一個對象實現(xiàn)某一種行為(即即操作操作),應(yīng)當(dāng)向它傳送相應(yīng)的消息。對象之間就是這樣通,應(yīng)當(dāng)向它傳送相應(yīng)的消息。對象之間就是

5、這樣通過發(fā)送和接收消息互相聯(lián)系的。過發(fā)送和接收消息互相聯(lián)系的。6 面向?qū)ο蟮某绦蛟O(shè)計采用了以上人們所熟悉面向?qū)ο蟮某绦蛟O(shè)計采用了以上人們所熟悉的的這種思路這種思路。 使用面向?qū)ο蟮某绦蛟O(shè)計方法設(shè)計一個復(fù)雜的軟件使用面向?qū)ο蟮某绦蛟O(shè)計方法設(shè)計一個復(fù)雜的軟件系統(tǒng)時,首要的問題是確定該系統(tǒng)是由哪些對象組成的,系統(tǒng)時,首要的問題是確定該系統(tǒng)是由哪些對象組成的,并且設(shè)計這些對象。并且設(shè)計這些對象。 在在C+中,每個對象都是由數(shù)據(jù)和函數(shù)中,每個對象都是由數(shù)據(jù)和函數(shù)(即操作代碼即操作代碼)這兩部分組成的這兩部分組成的。7如一個三角形對象,它的如一個三角形對象,它的3個邊長就是它的屬性個邊長就是它的屬性。函數(shù)

6、是用來對數(shù)據(jù)進行操作的,以便實現(xiàn)某些功能,函數(shù)是用來對數(shù)據(jù)進行操作的,以便實現(xiàn)某些功能,例如例如:可以通過邊長可以通過邊長計算計算出三角形的出三角形的面積面積 輸出輸出三角形的三角形的邊長和面積邊長和面積。計算三角形面積和輸出有關(guān)數(shù)據(jù)就是前面提到的行計算三角形面積和輸出有關(guān)數(shù)據(jù)就是前面提到的行為,在程序設(shè)計方法中也稱為方法為,在程序設(shè)計方法中也稱為方法(method)。調(diào)用對象中的函數(shù)就是向該對象傳送一個調(diào)用對象中的函數(shù)就是向該對象傳送一個消息消息(message),要求該對象實現(xiàn)某一行為,要求該對象實現(xiàn)某一行為(功能功能)。82. 封裝與信息隱蔽封裝與信息隱蔽 可以對一個對象進行封裝處理,把

7、它的一部分屬性可以對一個對象進行封裝處理,把它的一部分屬性和功能對外界屏蔽,也就是說從外界是看不到的和功能對外界屏蔽,也就是說從外界是看不到的,甚至是甚至是不可知的。好處是大大降低了操作對象的復(fù)雜程度。不可知的。好處是大大降低了操作對象的復(fù)雜程度。面向?qū)ο蟪绦蛟O(shè)計方法的一個重要特點就是面向?qū)ο蟪绦蛟O(shè)計方法的一個重要特點就是“封裝性封裝性”。所謂所謂“封裝封裝”,指兩方面的含義:,指兩方面的含義:一是將有關(guān)的數(shù)據(jù)和操作代碼封裝在一個對象中,形一是將有關(guān)的數(shù)據(jù)和操作代碼封裝在一個對象中,形成一個基本單位,各個對象之間相對獨立,互不干成一個基本單位,各個對象之間相對獨立,互不干擾。擾。二是將對象中某

8、些部分對外隱蔽,即隱蔽其內(nèi)部細節(jié),二是將對象中某些部分對外隱蔽,即隱蔽其內(nèi)部細節(jié),只留下少量接口,以便與外界聯(lián)系,接收外界的消只留下少量接口,以便與外界聯(lián)系,接收外界的消息。這種對外界隱蔽的做法稱為信息隱蔽。息。這種對外界隱蔽的做法稱為信息隱蔽。910信息隱蔽還有利于數(shù)據(jù)安全,防止無關(guān)的人了解和修信息隱蔽還有利于數(shù)據(jù)安全,防止無關(guān)的人了解和修改數(shù)據(jù)。改數(shù)據(jù)。C+的對象中的函數(shù)名就是對象的對外接口,外界可的對象中的函數(shù)名就是對象的對外接口,外界可以通過函數(shù)名來調(diào)用這些函數(shù)來實現(xiàn)某些行為以通過函數(shù)名來調(diào)用這些函數(shù)來實現(xiàn)某些行為(功能功能)。113.抽象抽象 抽象抽象的過程是將有關(guān)事物的共性歸納、集

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

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

11、。這就是面向?qū)ο蟪绦蛟O(shè)計中的繼承機制。計中的繼承機制。14利用繼承可以簡化程序設(shè)計的步驟。利用繼承可以簡化程序設(shè)計的步驟。“白馬白馬”繼承了繼承了“馬馬”的基本特征,又增加了新的特征的基本特征,又增加了新的特征(顏色顏色),“馬馬”是父類,或稱為基類,是父類,或稱為基類,“白馬白馬”是是從從“馬馬”派生派生出來的,稱為子類或派生類。出來的,稱為子類或派生類。C+提供了繼承機制,采用繼承的方法可以很方便地利提供了繼承機制,采用繼承的方法可以很方便地利用一個已有的類建立一個新的類。這就是常說的用一個已有的類建立一個新的類。這就是常說的“軟件軟件重用重用” 的思想。的思想。15 5.多態(tài)性多態(tài)性 如

12、果有幾個相似而不完全相同的對象,有時人們?nèi)绻袔讉€相似而不完全相同的對象,有時人們要求在向它們發(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í)行此程序,如果對象是一個文本文件,則啟動文本編輯器并打開該文件。文件,則啟動文本編輯器并打開該文件

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

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

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

16、218.1.3 類和對象的作用類和對象的作用 類類是是C+中十分重要的概念,它是實現(xiàn)面向?qū)ο蟪绦蛑惺种匾母拍睿菍崿F(xiàn)面向?qū)ο蟪绦蛟O(shè)計的基礎(chǔ)。類是所有面向?qū)ο蟮恼Z言的共同特征,所有設(shè)計的基礎(chǔ)。類是所有面向?qū)ο蟮恼Z言的共同特征,所有面向?qū)ο蟮恼Z言都提供了這種類型。面向?qū)ο蟮恼Z言都提供了這種類型。 基于基于對象就是基于類對象就是基于類。 程序程序的操作是圍繞對象進行的。的操作是圍繞對象進行的。22一組數(shù)據(jù)是和一組操作相對應(yīng)的。因此把相關(guān)的數(shù)據(jù)和一組數(shù)據(jù)是和一組操作相對應(yīng)的。因此把相關(guān)的數(shù)據(jù)和操作放在一起,行成一個整體,與外界相對分隔,這就操作放在一起,行成一個整體,與外界相對分隔,這就是面向?qū)?/p>

17、象程序設(shè)計中的對象。是面向?qū)ο蟪绦蛟O(shè)計中的對象。程序設(shè)計的關(guān)鍵程序設(shè)計的關(guān)鍵是設(shè)計好每一個對象,及確定向這些對是設(shè)計好每一個對象,及確定向這些對象發(fā)出的命令,使各對象完成相應(yīng)操作象發(fā)出的命令,使各對象完成相應(yīng)操作。238.1.4 面向?qū)ο蟮能浖_發(fā)面向?qū)ο蟮能浖_發(fā)不做要求不做要求24 8.2 類的聲明和對象的定義類的聲明和對象的定義8.2.1 類和對象的關(guān)系類和對象的關(guān)系 每一個實體都是對象。有一些對象是具有相同每一個實體都是對象。有一些對象是具有相同的結(jié)構(gòu)和特性的。每個對象都屬于一個特定的類型。的結(jié)構(gòu)和特性的。每個對象都屬于一個特定的類型。 類類代表了某一批對象的代表了某一批對象的共性和特

18、征共性和特征。25類是對象的抽象,而對象是類的具體實例。類是對象的抽象,而對象是類的具體實例。在在C+中也是先聲明一個類類型,然后用它去定義若中也是先聲明一個類類型,然后用它去定義若干個同類型的對象。干個同類型的對象。對象就是類類型的一個變量。可以說類是對象的模板,對象就是類類型的一個變量。可以說類是對象的模板,是用來定義對象的一種抽象類型。是用來定義對象的一種抽象類型。類是抽象的,不占用內(nèi)存,而對象是具體的,占用存儲類是抽象的,不占用內(nèi)存,而對象是具體的,占用存儲空間。空間。在一開始時弄清對象和類在一開始時弄清對象和類的關(guān)系是十分重要的。的關(guān)系是十分重要的。268.2.2 聲明類類型聲明類類

19、型類是用戶自己指定的類型。類是用戶自己指定的類型。如果程序中要用到類類型,必須自己根據(jù)需要進行聲如果程序中要用到類類型,必須自己根據(jù)需要進行聲明,或者使用別人已設(shè)計好的類。明,或者使用別人已設(shè)計好的類。C+標(biāo)準本身并不提供現(xiàn)成的類的名稱、結(jié)構(gòu)和內(nèi)容。標(biāo)準本身并不提供現(xiàn)成的類的名稱、結(jié)構(gòu)和內(nèi)容。27聲明一個類:聲明一個類: class Student /以以class開頭開頭 int num; char name20; char sex; /以上以上3行是數(shù)據(jù)成員行是數(shù)據(jù)成員 void display( ) /這是成員函數(shù)這是成員函數(shù) coutnum:numendl; coutname:name

20、endl; cout“sex:”sexendl; ; Student stud1,stud2; /定義了兩個定義了兩個Student 類的對象類的對象stud1和和stud228可以看到可以看到:類類(class )就是對象的類型。就是對象的類型。實際上,類是一種廣義的數(shù)據(jù)類型。實際上,類是一種廣義的數(shù)據(jù)類型。類這種數(shù)據(jù)類型中的數(shù)據(jù)既包含數(shù)據(jù),也包含操作數(shù)據(jù)的類這種數(shù)據(jù)類型中的數(shù)據(jù)既包含數(shù)據(jù),也包含操作數(shù)據(jù)的函數(shù)。函數(shù)。不能把類中的全部成員與外界隔離,一般是把數(shù)據(jù)隱蔽起不能把類中的全部成員與外界隔離,一般是把數(shù)據(jù)隱蔽起來,而把成員函數(shù)作為對外界的接口來,而把成員函數(shù)作為對外界的接口。29可以將

21、上面類的聲明改為可以將上面類的聲明改為class Student /聲明類類型聲明類類型 private : /聲明以下部分為私有的聲明以下部分為私有的 int num; char name20; char sex; public : /聲明以下部分為公用的聲明以下部分為公用的 void display( ) coutnum:numendl; coutname:nameendl; coutsex:sexendl; ;Student stud1,stud2;/定義了兩個定義了兩個Student類的對象類的對象30如果在類的定義中既不指定如果在類的定義中既不指定private,也不,也不指定指定p

22、ublic,則系統(tǒng)就默認為是私有的。則系統(tǒng)就默認為是私有的。歸納以上對類類型的聲明,可得到其一般形式如下:歸納以上對類類型的聲明,可得到其一般形式如下:class 類名類名 private : 私有的數(shù)據(jù)和成員函數(shù)私有的數(shù)據(jù)和成員函數(shù); public : 公用的數(shù)據(jù)和成員函數(shù)公用的數(shù)據(jù)和成員函數(shù);成員訪問限定符成員訪問限定符31 還有還有一種成員訪問限定符一種成員訪問限定符protected(受保護的受保護的),用用protected聲明的成員稱為受保護的成員,它不能聲明的成員稱為受保護的成員,它不能被類外訪問被類外訪問(這點與私有成員類似這點與私有成員類似),但可以被派生類的,但可以被派生類

23、的成員成員函數(shù)函數(shù)訪問。訪問。 在在聲明類類型時,聲明為聲明類類型時,聲明為private的成員和聲明的成員和聲明為為public的成員的成員的次序任意,既可以先出現(xiàn)的次序任意,既可以先出現(xiàn)private部分,部分,也也可以先出現(xiàn)可以先出現(xiàn)public部分。部分。 如果如果在類體中既不寫關(guān)鍵字在類體中既不寫關(guān)鍵字private,又不寫,又不寫public,就就默認為默認為private。32在一個類體中,關(guān)鍵字在一個類體中,關(guān)鍵字private和和public可以分別可以分別出現(xiàn)多次。每個部分的有效范圍到出現(xiàn)另一個訪問出現(xiàn)多次。每個部分的有效范圍到出現(xiàn)另一個訪問限定符或類體結(jié)束時限定符或類體結(jié)

24、束時(最后一個右花括號最后一個右花括號)為止。為止。但是為了使程序清晰,應(yīng)該但是為了使程序清晰,應(yīng)該養(yǎng)成這樣的習(xí)慣養(yǎng)成這樣的習(xí)慣: 使每一種成員訪問限定符在類定義體中只出現(xiàn)一次。使每一種成員訪問限定符在類定義體中只出現(xiàn)一次。在以前的在以前的C+程序中,常先出現(xiàn)程序中,常先出現(xiàn)private部分,后部分,后出現(xiàn)出現(xiàn)public部分部分。現(xiàn)在。現(xiàn)在的的C+ 程序多數(shù)先寫程序多數(shù)先寫public部分,部分,把把private部分放在類體的后部。部分放在類體的后部。這樣可以使用戶將注意力集中在能被外界調(diào)用的成員上這樣可以使用戶將注意力集中在能被外界調(diào)用的成員上,使使閱讀者的思路更清晰一些。閱讀者的思路

25、更清晰一些。338.2.3 定義對象的方法定義對象的方法用已聲明的用已聲明的Student類來定義對象,這種方法是很容類來定義對象,這種方法是很容易理解的。經(jīng)過定義后,易理解的。經(jīng)過定義后,stud1和和stud2就成為具有就成為具有Student類特征的對象。類特征的對象。stud1和和stud2這兩個對象都分別包括這兩個對象都分別包括Student類中定義的類中定義的數(shù)據(jù)和函數(shù)。數(shù)據(jù)和函數(shù)。定義對象的方法如下:定義對象的方法如下:1.先聲明類類型,然后再定義對象。先聲明類類型,然后再定義對象。如:如: Student stud1,stud2; /Student是已經(jīng)聲明的類類型是已經(jīng)聲明的

26、類類型34在在C+中,聲明了類類型后,定義對象有兩種形式:中,聲明了類類型后,定義對象有兩種形式:(1)class 類名類名 對象名對象名如如: class Student stud1,stud2;把把class和和Student合起來作為一個類名,用來定義對象。合起來作為一個類名,用來定義對象。(2)類名)類名 對象名對象名如如 : Student stud1,stud2;直接用類名定義對象。直接用類名定義對象。這兩種方法是等效的。這兩種方法是等效的。從從C語言繼承下來的語言繼承下來的是是C+的特色,更為簡捷方便的特色,更為簡捷方便352.在聲明類類型的同時定義對象在聲明類類型的同時定義對象

27、class Student /聲明類類型聲明類類型 public : /先聲明公用部分先聲明公用部分 void display( ) coutnum:numendl; coutname:nameendl; coutsex:sexendl; private : /后聲明私有部分后聲明私有部分 int num; char name20; char sex;stud1,stud2;/定義了兩個定義了兩個Student類的對象類的對象363.不出現(xiàn)類名,直接定義對象不出現(xiàn)類名,直接定義對象class /無類名無類名 private : public : stud1,stud2;/定義了兩個無類名的類對

28、象定義了兩個無類名的類對象這種方法在這種方法在C+中是合法的、允許的,中是合法的、允許的,很少用很少用,也不提倡用。,也不提倡用。37l在實際的程序開發(fā)中,一般都采用上面在實際的程序開發(fā)中,一般都采用上面3種方法中的種方法中的 第第1種方法。種方法。l在小型程序中或所聲明的類只用于本程序時,也可以在小型程序中或所聲明的類只用于本程序時,也可以用第用第2種方法。在定義一個對象時,編譯系統(tǒng)會為這個種方法。在定義一個對象時,編譯系統(tǒng)會為這個對象分配存儲空間,以存放對象中的成員對象分配存儲空間,以存放對象中的成員。388.3 類的成員函數(shù)類的成員函數(shù)8.3.1 成員函數(shù)的性質(zhì)成員函數(shù)的性質(zhì)類的成員函數(shù)

29、類的成員函數(shù)(簡稱類函數(shù)簡稱類函數(shù))是函數(shù)的一種,它的用是函數(shù)的一種,它的用法和作用和第法和作用和第4章介紹過的函數(shù)基本上是一樣的,它也有章介紹過的函數(shù)基本上是一樣的,它也有返回值和函數(shù)類型。返回值和函數(shù)類型。它它與一般函數(shù)的區(qū)別與一般函數(shù)的區(qū)別是:是: 它是屬于一個類的成員,出現(xiàn)在類體中。它是屬于一個類的成員,出現(xiàn)在類體中。它可以被指定它可以被指定為:為:private(私有的私有的)、public (公用的公用的)或或protected(受保護的受保護的)。在使用類函數(shù)時,要注意調(diào)用它的在使用類函數(shù)時,要注意調(diào)用它的權(quán)限權(quán)限(它能否被調(diào)用它能否被調(diào)用)以以及它的作用域及它的作用域(函數(shù)能使

30、用什么范圍中的數(shù)據(jù)和函數(shù)函數(shù)能使用什么范圍中的數(shù)據(jù)和函數(shù))。39例如私有的成員函數(shù)只能被本類中的其它成員函數(shù)例如私有的成員函數(shù)只能被本類中的其它成員函數(shù)所調(diào)用,而不能被類外調(diào)用。所調(diào)用,而不能被類外調(diào)用。成員函數(shù)可以訪問本類中任何成員成員函數(shù)可以訪問本類中任何成員(包括私有的和公用包括私有的和公用的的),可以引用在本作用域中有效的數(shù)據(jù)。,可以引用在本作用域中有效的數(shù)據(jù)。一般的做法是將需要被外界調(diào)用的成員函數(shù)指定為一般的做法是將需要被外界調(diào)用的成員函數(shù)指定為public,它們是類的對外接口。,它們是類的對外接口。40注意:注意:并非要求把所有成員函數(shù)都指定為并非要求把所有成員函數(shù)都指定為publ

31、ic。有的函數(shù)并不是準備為外界調(diào)用的,而是為本有的函數(shù)并不是準備為外界調(diào)用的,而是為本類類中中的成員函數(shù)所調(diào)用的,就應(yīng)該將它們指定為的成員函數(shù)所調(diào)用的,就應(yīng)該將它們指定為private。這種這種函數(shù)的作用是支持其它函數(shù)的操作,是類中函數(shù)的作用是支持其它函數(shù)的操作,是類中其它其它成員成員的工具函數(shù),類外用戶不能調(diào)用這些私有的的工具函數(shù),類外用戶不能調(diào)用這些私有的工具工具函數(shù)函數(shù)。 類類的成員函數(shù)是類體中十分重要的部分。如果的成員函數(shù)是類體中十分重要的部分。如果一一個個類中不包含成員函數(shù),就等同于類中不包含成員函數(shù),就等同于C語言中的語言中的結(jié)構(gòu)體結(jié)構(gòu)體了了,體現(xiàn)不出類在面向?qū)ο蟪绦蛟O(shè)計中的作用。

32、,體現(xiàn)不出類在面向?qū)ο蟪绦蛟O(shè)計中的作用。418.3.2 在類外定義成員函數(shù)在類外定義成員函數(shù)可以在類體中可以在類體中只寫成員函數(shù)的聲明,而在類的外面只寫成員函數(shù)的聲明,而在類的外面進行函數(shù)定義。進行函數(shù)定義。class Student public : void display( ); /公用成員函數(shù)原型聲明公用成員函數(shù)原型聲明 private : int num; char name20; char sex;42void Student display( ) /在類外定義在類外定義display類函數(shù)類函數(shù) coutnum:numendl; coutname:nameendl; coutse

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

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

35、員函數(shù)時會會根據(jù)根據(jù)在類中聲明的函數(shù)原型找到函數(shù)的定義,從而在類中聲明的函數(shù)原型找到函數(shù)的定義,從而執(zhí)行執(zhí)行該該函數(shù)。函數(shù)。 在類的內(nèi)部對成員函數(shù)作聲明,而在在類的內(nèi)部對成員函數(shù)作聲明,而在類體外定義成員函數(shù),這是程序設(shè)計的一種類體外定義成員函數(shù),這是程序設(shè)計的一種良好習(xí)慣。良好習(xí)慣。 如果一個函數(shù),其函數(shù)體只有如果一個函數(shù),其函數(shù)體只有2-3行,一行,一般可在聲明類時在類體中定義。多于般可在聲明類時在類體中定義。多于3行的函行的函數(shù),一般在類體內(nèi)聲明,在類外定義。數(shù),一般在類體內(nèi)聲明,在類外定義。45468.3.3 inline 成員函數(shù)成員函數(shù)類的成員函數(shù)也可以指定為內(nèi)置函數(shù)。類的成員函數(shù)

36、也可以指定為內(nèi)置函數(shù)。在類體中定義的成員函數(shù)的規(guī)模一般都很小在類體中定義的成員函數(shù)的規(guī)模一般都很小,為了,為了減少時減少時間開銷,如果在類體中定義的成員函數(shù)中不包括循環(huán)等間開銷,如果在類體中定義的成員函數(shù)中不包括循環(huán)等控制結(jié)構(gòu),控制結(jié)構(gòu),C+系統(tǒng)會自動將它們作為內(nèi)置系統(tǒng)會自動將它們作為內(nèi)置(inline )函數(shù)函數(shù)來處理。來處理。這樣可以大大減少調(diào)用成員函數(shù)的時間開銷。這樣可以大大減少調(diào)用成員函數(shù)的時間開銷。C+要求對要求對一般的內(nèi)置函數(shù)要用關(guān)鍵字一般的內(nèi)置函數(shù)要用關(guān)鍵字inline聲明,但對類內(nèi)定義的聲明,但對類內(nèi)定義的成員函數(shù),可以省略成員函數(shù),可以省略inline,因為這些成員函數(shù)已被,

37、因為這些成員函數(shù)已被隱含隱含地指定地指定為內(nèi)置函數(shù)。為內(nèi)置函數(shù)。47class Student public : void display( ) coutnum:numendl; coutname:nameendl; coutsex:sexendl; private : int num; char name20; char sex;48注意:注意:如果成員函數(shù)不在類體內(nèi)定義,而在類體外定如果成員函數(shù)不在類體內(nèi)定義,而在類體外定義,系統(tǒng)并不把它默認為內(nèi)置函數(shù),調(diào)用這些成員函義,系統(tǒng)并不把它默認為內(nèi)置函數(shù),調(diào)用這些成員函數(shù)的過程和調(diào)用一般函數(shù)的過程是相同的。如果想將數(shù)的過程和調(diào)用一般函數(shù)的過程是相

38、同的。如果想將這些成員函數(shù)指定為內(nèi)置函數(shù),應(yīng)當(dāng)用這些成員函數(shù)指定為內(nèi)置函數(shù),應(yīng)當(dāng)用inline作作顯式聲明顯式聲明。class Student public : inline void display( ); private : int num; char name20; char sex;將將display函數(shù)顯式地聲明為內(nèi)置函數(shù)。函數(shù)顯式地聲明為內(nèi)置函數(shù)。以上兩種寫法是等效的。對在類體內(nèi)定以上兩種寫法是等效的。對在類體內(nèi)定義的函數(shù),一般都省寫義的函數(shù),一般都省寫inline。49inline void Student display( ) / 在類外定義在類外定義display函數(shù)為內(nèi)置函

39、數(shù)函數(shù)為內(nèi)置函數(shù) coutnum:numendl; coutname:nameendl; coutsex:sexset_time(11,30,27);三者等價。三者等價。568.4.3 通過對象的引用變量來訪問對象中的成員通過對象的引用變量來訪問對象中的成員 如果為一個對象定義了一個引用變量,它們是如果為一個對象定義了一個引用變量,它們是共占同一段存儲單元的,實際上它們是同一個對象,共占同一段存儲單元的,實際上它們是同一個對象,只是用不同的名字表示而已。只是用不同的名字表示而已。因此完全可以通過引用變量來訪問對象中的成員。因此完全可以通過引用變量來訪問對象中的成員。 Time t1; /定義對

40、象定義對象t1 Time &t2=t1; /定義定義Time類引用變量類引用變量t2,并使之初始化為,并使之初始化為t1 couthour; cinminute; cinsecond;void Time:show_time( ) cout hour: minute: second endl;在類外定義在類外定義set_time函數(shù)函數(shù)在類外定義在類外定義show_time函數(shù)函數(shù)67int main( ) Time t1; t1.set_time( ); /向向t1對象的數(shù)據(jù)成員輸入數(shù)據(jù)對象的數(shù)據(jù)成員輸入數(shù)據(jù) t1.show_time( ); /輸出輸出t1對象的數(shù)據(jù)成員的值對象的數(shù)據(jù)成員的值

41、 Time t2; t2.set_time( ); /向向t2對象的數(shù)據(jù)成員輸入數(shù)據(jù)對象的數(shù)據(jù)成員輸入數(shù)據(jù) t2.show_time( ); /輸出輸出t2對象的數(shù)據(jù)成員的值對象的數(shù)據(jù)成員的值 return 0; 運行結(jié)果:運行結(jié)果:12 27 30 12:27:3017 50 26 17:50:2668注意:注意:(1) 在主函數(shù)中調(diào)用兩個成員函數(shù)時,應(yīng)指明對象名在主函數(shù)中調(diào)用兩個成員函數(shù)時,應(yīng)指明對象名 (t1,t2)。表示調(diào)用的是哪一個對象的成員函數(shù)。表示調(diào)用的是哪一個對象的成員函數(shù)。(2) 在類外定義函數(shù)時,應(yīng)指明函數(shù)的作用域,如:在類外定義函數(shù)時,應(yīng)指明函數(shù)的作用域,如: void

42、Time set_time( ) 在成員函數(shù)引用本對象的數(shù)據(jù)成員時,只需直接寫數(shù)據(jù)在成員函數(shù)引用本對象的數(shù)據(jù)成員時,只需直接寫數(shù)據(jù)成員名,這時成員名,這時C+系統(tǒng)會把它默認為本對象的數(shù)據(jù)成員。系統(tǒng)會把它默認為本對象的數(shù)據(jù)成員。(3) 應(yīng)注意區(qū)分什么場合用應(yīng)注意區(qū)分什么場合用域運算符域運算符“ ”,什么場合用,什么場合用成成員運算符員運算符“.”,不要搞混。,不要搞混。69例例8.4 找出一個整型數(shù)組中的元素的最大值。找出一個整型數(shù)組中的元素的最大值。用類來處理,比較不同方法的特點。用類來處理,比較不同方法的特點。class Array_max /聲明類聲明類 public : void set_value( ); /對數(shù)組元素設(shè)置值對數(shù)組元素設(shè)置值 void max_value(

溫馨提示

  • 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)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論