




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第第8章章 類和對象類和對象第第9章章 關于類和對象的進一步討論關于類和對象的進一步討論第第10章章 運算符重載運算符重載第第3 3篇篇基于對象的程序設計基于對象的程序設計第第8章章 類和對象類和對象8.1 面向對象程序設計方法概述面向對象程序設計方法概述8.2 類的聲明和對象的定義類的聲明和對象的定義8.3 類的成員函數類的成員函數8.4 對象成員的引用對象成員的引用8.5 類的封裝性和信息隱蔽類的封裝性和信息隱蔽8.6 類和對象的簡單應用舉例類和對象的簡單應用舉例到目前為止,我們介紹的是到目前為止,我們介紹的是C+在面向過程的程序設在面向過程的程序設計中的應用。對于規模比較小的程序,編程者
2、可以直計中的應用。對于規模比較小的程序,編程者可以直接編寫出一個面向過程的程序,詳細地描述每一瞬時接編寫出一個面向過程的程序,詳細地描述每一瞬時的數據結構及對其的操作過程。但是當程序規模較大的數據結構及對其的操作過程。但是當程序規模較大時,就顯得力不從心了。時,就顯得力不從心了。C+就是為了解決編寫大程就是為了解決編寫大程序過程中的困難而產生的。序過程中的困難而產生的。8.1 面向對象程序設計方法概述面向對象程序設計方法概述面向對象的程序設計的思路和人們日常生活中處理問面向對象的程序設計的思路和人們日常生活中處理問題的思路是相似的。在自然世界和社會生活中,一個題的思路是相似的。在自然世界和社會
3、生活中,一個復雜的事物總是由許多部分組成的。復雜的事物總是由許多部分組成的。當人們生產汽車時,分別設計和制造發動機、底盤、當人們生產汽車時,分別設計和制造發動機、底盤、車身和輪子,最后把它們組裝在一起。在組裝時,各車身和輪子,最后把它們組裝在一起。在組裝時,各部分之間有一定的聯系,以便協調工作。部分之間有一定的聯系,以便協調工作。這就是面向對象的程序設計的基本思路。這就是面向對象的程序設計的基本思路。為了進一步說明問題,下面先討論幾個有關的概念。為了進一步說明問題,下面先討論幾個有關的概念。8.1.1 什么是面向對象的程序設計什么是面向對象的程序設計1. 對象對象客觀世界中任何一個事物都可以看
4、成一個對象客觀世界中任何一個事物都可以看成一個對象(object)。對象可大可小。對象是構成系統的基本單位。對象可大可小。對象是構成系統的基本單位。任何一個對象都應當具有這兩個要素,即屬性任何一個對象都應當具有這兩個要素,即屬性(attribute)和行為和行為(behavior),它能根據外界給的信息它能根據外界給的信息進行相應的操作。一個對象往往是由一組屬性和一組進行相應的操作。一個對象往往是由一組屬性和一組行為構成的。一般來說,凡是具備屬性和行為這兩種行為構成的。一般來說,凡是具備屬性和行為這兩種要素的,都可以作為對象。要素的,都可以作為對象。在一個系統中的多個對象之間通過一定的渠道相互
5、聯在一個系統中的多個對象之間通過一定的渠道相互聯系,如圖系,如圖8.1示意。要使某一個對象實現某一種行為示意。要使某一個對象實現某一種行為(即操作即操作),應當向它傳送相應的消息。對象之間就是,應當向它傳送相應的消息。對象之間就是這樣通過發送和接收消息互相聯系的。這樣通過發送和接收消息互相聯系的。圖圖8.1 圖圖8.2面向對象的程序設計采用了以上人們所熟悉的這種思面向對象的程序設計采用了以上人們所熟悉的這種思路。使用面向對象的程序設計方法設計一個復雜的軟路。使用面向對象的程序設計方法設計一個復雜的軟件系統時,首要的問題是確定該系統是由哪些對象組件系統時,首要的問題是確定該系統是由哪些對象組成的
6、,并且設計這些對象。在成的,并且設計這些對象。在C+中,每個對象都是中,每個對象都是由數據和函數由數據和函數(即操作代碼即操作代碼)這兩部分組成的這兩部分組成的,見圖見圖8.2。數據體現了前面提到的數據體現了前面提到的“屬性屬性”,如一個三角形對象,如一個三角形對象,它的它的3個邊長就是它的屬性。函數是用來對數據進行個邊長就是它的屬性。函數是用來對數據進行操作的,以便實現某些功能,例如可以通過邊長計算操作的,以便實現某些功能,例如可以通過邊長計算出三角形的面積,并且輸出三角形的邊長和面積。計出三角形的面積,并且輸出三角形的邊長和面積。計算三角形面積和輸出有關數據就是前面提到的行為,算三角形面積
7、和輸出有關數據就是前面提到的行為,在程序設計方法中也稱為方法在程序設計方法中也稱為方法(method)。調用對象中調用對象中的函數就是向該對象傳送一個消息的函數就是向該對象傳送一個消息(message),要求要求該對象實現某一行為該對象實現某一行為(功能功能)。2. 封裝與信息隱蔽封裝與信息隱蔽可以對一個對象進行封裝處理,把它的一部分屬性和可以對一個對象進行封裝處理,把它的一部分屬性和功能對外界屏蔽,也就是說從外界是看不到的功能對外界屏蔽,也就是說從外界是看不到的,甚至甚至是不可知的。是不可知的。這樣做的好處是大大降低了操作對象的復雜程度。這樣做的好處是大大降低了操作對象的復雜程度。面向對象程
8、序設計方法的一個重要特點就是面向對象程序設計方法的一個重要特點就是“封裝性封裝性” (encapsulation),所謂所謂“封裝封裝”,指兩方面的含義:,指兩方面的含義: 一是將有關的數據和操作代碼封裝在一個對象中,形一是將有關的數據和操作代碼封裝在一個對象中,形成一個基本單位,各個對象之間相對獨立,互不干擾。成一個基本單位,各個對象之間相對獨立,互不干擾。二是將對象中某些部分對外隱蔽,即隱蔽其內部細節,二是將對象中某些部分對外隱蔽,即隱蔽其內部細節,只留下少量接口,以便與外界聯系,接收外界的消息。只留下少量接口,以便與外界聯系,接收外界的消息。這種對外界隱蔽的做法稱為信息隱蔽這種對外界隱蔽
9、的做法稱為信息隱蔽(imformation hiding)。信息隱蔽還有利于數據安全,防止無關的信息隱蔽還有利于數據安全,防止無關的人了解和修改數據。人了解和修改數據。C+的對象中的函數名就是對象的對外接口,外界可的對象中的函數名就是對象的對外接口,外界可以通過函數名來調用這些函數來實現某些行為以通過函數名來調用這些函數來實現某些行為(功能功能)。這些將在以后詳細介紹。這些將在以后詳細介紹。3. 抽象抽象在程序設計方法中,常用到抽象在程序設計方法中,常用到抽象(abstraction)這一這一名詞。抽象的過程是將有關事物的共性歸納、集中的名詞。抽象的過程是將有關事物的共性歸納、集中的過程。過程
10、。抽象的作用是表示同一類事物的本質。抽象的作用是表示同一類事物的本質。C和和C+中的中的數據類型就是對一批具體的數的抽象。數據類型就是對一批具體的數的抽象。對象是具體存在的,如一個三角形可以作為一個對象,對象是具體存在的,如一個三角形可以作為一個對象,10個不同尺寸的三角形是個不同尺寸的三角形是10個對象。如果這個對象。如果這10個三角個三角形對象有相同的屬性和行為,可以將它們抽象為一種形對象有相同的屬性和行為,可以將它們抽象為一種類型,稱為三角形類型。在類型,稱為三角形類型。在C+中,這種類型就稱為中,這種類型就稱為“類類(class)”。這這10個三角形就是屬于同一個三角形就是屬于同一“類
11、類”的的對象。類是對象的抽象,而對象則是類的特例,或者對象。類是對象的抽象,而對象則是類的特例,或者說是類的具體表現形式。說是類的具體表現形式。4. 繼承與重用繼承與重用如果在軟件開發中已經建立了一個名為如果在軟件開發中已經建立了一個名為A的的“類類”,又想另外建立一個名為又想另外建立一個名為B的的“類類”,而后者與前者內,而后者與前者內容基本相同,只是在前者的基礎上增加一些屬性和行容基本相同,只是在前者的基礎上增加一些屬性和行為,只需在類為,只需在類A的基礎上增加一些新內容即可。這就的基礎上增加一些新內容即可。這就是面向對象程序設計中的繼承機制。利用繼承可以簡是面向對象程序設計中的繼承機制。
12、利用繼承可以簡化程序設計的步驟。化程序設計的步驟。“白馬白馬”繼承了繼承了“馬馬”的基本特征,又增加了新的特的基本特征,又增加了新的特征征(顏色顏色),“馬馬”是父類,或稱為基類,是父類,或稱為基類,“白馬白馬”是是從從“馬馬”派生出來的,稱為子類或派生類。派生出來的,稱為子類或派生類。C+提供了繼承機制,采用繼承的方法可以很方便地提供了繼承機制,采用繼承的方法可以很方便地利用一個已有的類建立一個新的類。這就是常說的利用一個已有的類建立一個新的類。這就是常說的“軟件重用軟件重用”(software reusability) 的思想。的思想。5. 多態性多態性如果有幾個相似而不完全相同的對象,有
13、時人們要求如果有幾個相似而不完全相同的對象,有時人們要求在向它們發出同一個消息時,它們的反應各不相同,在向它們發出同一個消息時,它們的反應各不相同,分別執行不同的操作。這種情況就是多態現象。如,分別執行不同的操作。這種情況就是多態現象。如,在在Windows環境下,用鼠標雙擊一個文件對象環境下,用鼠標雙擊一個文件對象(這就這就是向對象傳送一個消息是向對象傳送一個消息),如果對象是一個可執行文,如果對象是一個可執行文件,則會執行此程序,如果對象是一個文本文件,則件,則會執行此程序,如果對象是一個文本文件,則啟動文本編輯器并打開該文件。啟動文本編輯器并打開該文件。在在C+中,所謂多態性中,所謂多態
14、性(polymorphism)是指:是指: 由繼承由繼承而產生的相關的不同的類,其對象對同一消息會作出而產生的相關的不同的類,其對象對同一消息會作出不同的響應。多態性是面向對象程序設計的一個重要不同的響應。多態性是面向對象程序設計的一個重要特征,能增加程序的靈活性。特征,能增加程序的靈活性。傳統的面向過程程序設計是圍繞功能進行的,用一個傳統的面向過程程序設計是圍繞功能進行的,用一個函數實現一個功能。所有的數據都是公用的,一個函函數實現一個功能。所有的數據都是公用的,一個函數可以使用任何一組數據,而一組數據又能被多個函數可以使用任何一組數據,而一組數據又能被多個函數所使用(見圖數所使用(見圖8.
15、3)。)。 圖圖8.38.1.2 面向對象程序設計的特點面向對象程序設計的特點面向對象程序設計采取的是另外一種思路。它面對的面向對象程序設計采取的是另外一種思路。它面對的是一個個對象。實際上,每一組數據都是有特定的用是一個個對象。實際上,每一組數據都是有特定的用途的,是某種操作的對象。也就是說,一組操作調用途的,是某種操作的對象。也就是說,一組操作調用一組數據。一組數據。程序設計者的任務包括兩個方面:程序設計者的任務包括兩個方面: 一是設計所需的一是設計所需的各種類和對象,即決定把哪些數據和操作封裝在一起;各種類和對象,即決定把哪些數據和操作封裝在一起;二是考慮怎樣向有關對象發送消息,以完成所
16、需的任二是考慮怎樣向有關對象發送消息,以完成所需的任務。這時他如同一個總調度,不斷地向各個對象發出務。這時他如同一個總調度,不斷地向各個對象發出命令,讓這些對象活動起來命令,讓這些對象活動起來(或者說激活這些對象或者說激活這些對象),完成自己職責范圍內的工作。各個對象的操作完成了,完成自己職責范圍內的工作。各個對象的操作完成了,整體任務也就完成了。顯然,對一個大型任務來說,整體任務也就完成了。顯然,對一個大型任務來說,面向對象程序設計方法是十分有效的,它能大大降低面向對象程序設計方法是十分有效的,它能大大降低程序設計人員的工作難度,減少出錯機會。程序設計人員的工作難度,減少出錯機會。類是類是C
17、+中十分重要的概念,它是實現面向對象程序中十分重要的概念,它是實現面向對象程序設計的基礎。類是所有面向對象的語言的共同特征,設計的基礎。類是所有面向對象的語言的共同特征,所有面向對象的語言都提供了這種類型。一個有一定所有面向對象的語言都提供了這種類型。一個有一定規模的規模的C+程序是由許多類所構成的。程序是由許多類所構成的。C+支持面向過程的程序設計,也支持基于對象的程支持面向過程的程序設計,也支持基于對象的程序設計,又支持面向對象的程序設計。在本章到第序設計,又支持面向對象的程序設計。在本章到第10章將介紹基于對象的程序設計。包括類和對象的概念、章將介紹基于對象的程序設計。包括類和對象的概念
18、、類的機制和聲明、類對象的定義與使用等。這是面向類的機制和聲明、類對象的定義與使用等。這是面向對象的程序設計的基礎。對象的程序設計的基礎。8.1.3 類和對象的作用類和對象的作用基于對象就是基于類。與面向過程的程序不同,基于基于對象就是基于類。與面向過程的程序不同,基于對象的程序是以類和對象為基礎的,程序的操作是圍對象的程序是以類和對象為基礎的,程序的操作是圍繞對象進行的。在此基礎上利用了繼承機制和多態性,繞對象進行的。在此基礎上利用了繼承機制和多態性,就成為面向對象的程序設計就成為面向對象的程序設計(有時不細分基于對象程有時不細分基于對象程序設計和面向對象程序設計,而把二者合稱為面向對序設計
19、和面向對象程序設計,而把二者合稱為面向對象的程序設計象的程序設計)。基于對象程序設計所面對的是一個個對象。所有的數基于對象程序設計所面對的是一個個對象。所有的數據分別屬于不同的對象。據分別屬于不同的對象。在面向過程的結構化程序設計中,人們常使用這樣的在面向過程的結構化程序設計中,人們常使用這樣的公式來表述程序:公式來表述程序: 程序程序=算法數據結構算法數據結構算法和數據結構兩者是互相獨立、分開設計的,面向算法和數據結構兩者是互相獨立、分開設計的,面向過程的程序設計是以算法為主體的。在實踐中人們逐過程的程序設計是以算法為主體的。在實踐中人們逐漸認識到算法和數據結構是互相緊密聯系不可分的,漸認識
20、到算法和數據結構是互相緊密聯系不可分的,應當以一個算法對應一組數據結構,而不宜提倡一個應當以一個算法對應一組數據結構,而不宜提倡一個算法對應多組數據結構,以及一組數據結構對應多個算法對應多組數據結構,以及一組數據結構對應多個算法。基于對象和面向對象程序設計就是把一個算法算法。基于對象和面向對象程序設計就是把一個算法和一組數據結構封裝在一個對象中。因此,就形成了和一組數據結構封裝在一個對象中。因此,就形成了新的觀念:新的觀念: 對象對象 = 算法算法 數據結構數據結構程序程序 = (對象對象+對象對象+對象對象+) + 消息消息 或:或: 程序程序 = 對象對象s + 消息消息“對象對象s”表示
21、多個對象。消息的作用就是對對象的控表示多個對象。消息的作用就是對對象的控制。程序設計的關鍵是設計好每一個對象,及確定向制。程序設計的關鍵是設計好每一個對象,及確定向這些對象發出的命令,使各對象完成相應操作。這些對象發出的命令,使各對象完成相應操作。隨著軟件規模的迅速增大,軟件人員面臨的問題十分隨著軟件規模的迅速增大,軟件人員面臨的問題十分復雜。需要規范整個軟件開發過程,明確軟件開發過復雜。需要規范整個軟件開發過程,明確軟件開發過程中每個階段的任務,在保證前一個階段工作的正確程中每個階段的任務,在保證前一個階段工作的正確性的情況下,再進行下一階段的工作。這就是軟件工性的情況下,再進行下一階段的工
22、作。這就是軟件工程學需要研究和解決的問題。程學需要研究和解決的問題。面向對象的軟件工程包括以下幾個部分:面向對象的軟件工程包括以下幾個部分: 8.1.4 面向對象的軟件開發面向對象的軟件開發1. 面向對象分析面向對象分析(object oriented analysis,OOA) 軟件工程中的系統分析階段,系統分析員要和用戶結軟件工程中的系統分析階段,系統分析員要和用戶結合在一起,對用戶的需求作出精確的分析和明確的描合在一起,對用戶的需求作出精確的分析和明確的描述,從宏觀的角度概括出系統應該做什么述,從宏觀的角度概括出系統應該做什么(而不是怎而不是怎么做么做)。面向對象的分析,要按照面向對象的
23、概念和。面向對象的分析,要按照面向對象的概念和方法,在對任務的分析中,從客觀存在的事物和事物方法,在對任務的分析中,從客觀存在的事物和事物之間的關系,歸納出有關的對象之間的關系,歸納出有關的對象(包括對象的屬性和包括對象的屬性和行為行為)以及對象之間的聯系,并將具有相同屬性和行以及對象之間的聯系,并將具有相同屬性和行為的對象用一個類為的對象用一個類(class)來表示。建立一個能反映真來表示。建立一個能反映真實工作情況的需求模型。實工作情況的需求模型。2. 面向對象設計面向對象設計(object oriented design,OOD)根據面向對象分析階段形成的需求模型,對每一部分根據面向對象
24、分析階段形成的需求模型,對每一部分分別進行具體的設計,首先是進行類的設計,類的設分別進行具體的設計,首先是進行類的設計,類的設計可能包含多個層次計可能包含多個層次(利用繼承與派生利用繼承與派生)。然后以這些。然后以這些類為基礎提出程序設計的思路和方法,包括對算法的類為基礎提出程序設計的思路和方法,包括對算法的設計。在設計階段,并不牽涉某一種具體的計算機語設計。在設計階段,并不牽涉某一種具體的計算機語言,而是用一種更通用的描述工具言,而是用一種更通用的描述工具(如偽代碼或流程如偽代碼或流程圖圖)來描述。來描述。3. 面向對象編程面向對象編程(object oriented programming
25、,OOP)根據面向對象設計的結果,用一種計算機語言把它寫根據面向對象設計的結果,用一種計算機語言把它寫成程序,顯然應當選用面向對象的計算機語言成程序,顯然應當選用面向對象的計算機語言(例如例如C+),否則無法實現面向對象設計的要求。否則無法實現面向對象設計的要求。4. 面向對象測試面向對象測試(object oriented test,OOT)在寫好程序后交給用戶使用前,必須對程序進行嚴格在寫好程序后交給用戶使用前,必須對程序進行嚴格的測試。測試的目的是發現程序中的錯誤并改正它。的測試。測試的目的是發現程序中的錯誤并改正它。面向對象測試是用面向對象的方法進行測試,以類作面向對象測試是用面向對象
26、的方法進行測試,以類作為測試的基本單元。為測試的基本單元。5. 面向對象維護面向對象維護(object oriented soft maintenance,OOSM)因為對象的封裝性,修改一個對象對其他對象影響很因為對象的封裝性,修改一個對象對其他對象影響很小。利用面向對象的方法維護程序,大大提高了軟件小。利用面向對象的方法維護程序,大大提高了軟件維護的效率。維護的效率。現在設計一個大的軟件,是嚴格按照面向對象軟件工現在設計一個大的軟件,是嚴格按照面向對象軟件工程的程的5個階段進行的,這個階段進行的,這5個階段的工作不是由一個人個階段的工作不是由一個人從頭到尾完成的,而是由不同的人分別完成的。
27、這樣,從頭到尾完成的,而是由不同的人分別完成的。這樣,OOP階段的任務就比較簡單了,程序編寫者只需要階段的任務就比較簡單了,程序編寫者只需要根據根據OOD提出的思路用面向對象語言編寫出程序即提出的思路用面向對象語言編寫出程序即可。在一個大型軟件的開發中,可。在一個大型軟件的開發中,OOP只是面向對象只是面向對象開發過程中的一個很小的部分。開發過程中的一個很小的部分。如果所處理的是一個較簡單的問題,可以不必嚴格按如果所處理的是一個較簡單的問題,可以不必嚴格按照以上照以上5個階段進行,往往由程序設計者按照面向對個階段進行,往往由程序設計者按照面向對象的方法進行程序設計,包括類的設計象的方法進行程序
28、設計,包括類的設計(或選用已有或選用已有的類的類)和程序的設計。和程序的設計。每一個實體都是對象。有一些對象是具有相同的結構每一個實體都是對象。有一些對象是具有相同的結構和特性的。每個對象都屬于一個特定的類型。和特性的。每個對象都屬于一個特定的類型。在在C+中對象的類型稱為類中對象的類型稱為類(class)。類代表了某一批類代表了某一批對象的共性和特征。前面已說明:對象的共性和特征。前面已說明: 類是對象的抽象,類是對象的抽象,而對象是類的具體實例而對象是類的具體實例(instance)。正如同結構體類正如同結構體類型和結構體變量的關系一樣,人們先聲明一個結構體型和結構體變量的關系一樣,人們先
29、聲明一個結構體類型,然后用它去定義結構體變量。同一個結構體類類型,然后用它去定義結構體變量。同一個結構體類型可以定義出多個不同的結構體變量。型可以定義出多個不同的結構體變量。8.2 類的聲明和對象的定義類的聲明和對象的定義 8.2.1 類和對象的關系類和對象的關系在在C+中也是先聲明一個類類型,然后用它去定義若中也是先聲明一個類類型,然后用它去定義若干個同類型的對象。對象就是類類型的一個變量。可干個同類型的對象。對象就是類類型的一個變量。可以說類是對象的模板,是用來定義對象的一種抽象類以說類是對象的模板,是用來定義對象的一種抽象類型。型。類是抽象的,不占用內存,而對象是具體的,占用存類是抽象的
30、,不占用內存,而對象是具體的,占用存儲空間。在一開始時弄清對象和類的關系是十分重要儲空間。在一開始時弄清對象和類的關系是十分重要的。的。類是用戶自己指定的類型。如果程序中要用到類類型,類是用戶自己指定的類型。如果程序中要用到類類型,必須自己根據需要進行聲明,或者使用別人已設計好必須自己根據需要進行聲明,或者使用別人已設計好的類。的類。C+標準本身并不提供現成的類的名稱、結構標準本身并不提供現成的類的名稱、結構和內容。和內容。在在C+中聲明一個類類型和聲明一個結構體類型是相中聲明一個類類型和聲明一個結構體類型是相似的。似的。下面是聲明一個結構體類型的方法:下面是聲明一個結構體類型的方法: str
31、uct Student /聲明了一個名為聲明了一個名為Student的結構體類型的結構體類型 int num;char name20;char sex;Student stud1,stud2; /定義了兩個結構體變量定義了兩個結構體變量stud1和和stud28.2.2 聲明類類型聲明類類型它只包括數據,沒有包括操作。現在聲明一個類:它只包括數據,沒有包括操作。現在聲明一個類: class Student /以以class開頭開頭 int num;char name20; char sex; /以上以上3行是數據成員行是數據成員 void display( ) /這是成員函數這是成員函數cou
32、tnum:numendl;coutname:nameendl; coutsex:sexendl; /以上以上4行是函數中的操作語句行是函數中的操作語句 ;Student stud1,stud2; /定義了兩個定義了兩個Student 類的對象類的對象stud1和和stud2 可以看到聲明類的方法是由聲明結構體類型的方法發可以看到聲明類的方法是由聲明結構體類型的方法發展而來的。展而來的。可以看到,類可以看到,類(class)就是對象的類型。實際上,類是就是對象的類型。實際上,類是一種廣義的數據類型。類這種數據類型中的數據既包一種廣義的數據類型。類這種數據類型中的數據既包含數據,也包含操作數據的函
33、數。含數據,也包含操作數據的函數。不能把類中的全部成員與外界隔離,一般是把數據隱不能把類中的全部成員與外界隔離,一般是把數據隱蔽起來,而把成員函數作為對外界的接口。蔽起來,而把成員函數作為對外界的接口。可以將上面類的聲明改為可以將上面類的聲明改為class Student /聲明類類型聲明類類型 private: /聲明以下部分為私有的聲明以下部分為私有的int num;char name20; char sex; public: /聲明以下部分為公用的聲明以下部分為公用的void display( ) coutnum:numendl;coutname:nameendl;coutsex:sex
34、endl; ;Student stud1,stud2; /定義了兩個定義了兩個Student 類的對象類的對象如果在類的定義中既不指定如果在類的定義中既不指定private,也不指定也不指定public,則系統就默認為是私有的。則系統就默認為是私有的。歸納以上對類類型的聲明,可得到其一般形式如下:歸納以上對類類型的聲明,可得到其一般形式如下: class 類名類名 private:私有的數據和成員函數私有的數據和成員函數; public:公用的數據和成員函數公用的數據和成員函數;private和和public稱為成員訪問限定符稱為成員訪問限定符(member access specifier)
35、。除了除了private和和public之外,還有一種成員訪問限定符之外,還有一種成員訪問限定符protected(受保護的受保護的),用,用protected聲明的成員稱為受聲明的成員稱為受保護的成員,它不能被類外訪問保護的成員,它不能被類外訪問(這點與私有成員類這點與私有成員類似似),但可以被派生類的成員函數訪問。,但可以被派生類的成員函數訪問。在聲明類類型時,聲明為在聲明類類型時,聲明為private的成員和聲明為的成員和聲明為public的成員的次序任意,既可以先出現的成員的次序任意,既可以先出現private部分,部分,也可以先出現也可以先出現public部分。如果在類體中既不寫關鍵
36、部分。如果在類體中既不寫關鍵字字private,又不寫又不寫public,就默認為就默認為private。在一個在一個類體中,關鍵字類體中,關鍵字private和和public可以分別出現多次。可以分別出現多次。每個部分的有效范圍到出現另一個訪問限定符或類體每個部分的有效范圍到出現另一個訪問限定符或類體結束時結束時(最后一個右花括號最后一個右花括號)為止。但是為了使程序清為止。但是為了使程序清晰,應該養成這樣的習慣:晰,應該養成這樣的習慣: 使每一種成員訪問限定使每一種成員訪問限定符在類定義體中只出現一次。符在類定義體中只出現一次。在以前的在以前的C+程序中,常先出現程序中,常先出現priva
37、te部分,后出現部分,后出現public部分,如上面所示。現在的部分,如上面所示。現在的C+程序多數先寫程序多數先寫public部分,把部分,把private部分放在類體的后部。這樣可部分放在類體的后部。這樣可以使用戶將注意力集中在能被外界調用的成員上,使以使用戶將注意力集中在能被外界調用的成員上,使閱讀者的思路更清晰一些。閱讀者的思路更清晰一些。在在C+程序中,經常可以看到類。為了用戶方便,常程序中,經常可以看到類。為了用戶方便,常用的用的C+編譯系統往往向用戶提供類庫編譯系統往往向用戶提供類庫(但不屬于但不屬于C+語言的組成部分語言的組成部分),內裝常用的基本的類,供用,內裝常用的基本的類
38、,供用戶使用。不少用戶也把自己或本單位經常用到的類放戶使用。不少用戶也把自己或本單位經常用到的類放在一個專門的類庫中,需要用時直接調用,這樣就減在一個專門的類庫中,需要用時直接調用,這樣就減少了程序設計的工作量。少了程序設計的工作量。8.2.2節的程序段中,最后一行用已聲明的節的程序段中,最后一行用已聲明的Student類類來定義對象,這種方法是很容易理解的。經過定義后,來定義對象,這種方法是很容易理解的。經過定義后,stud1和和stud2就成為具有就成為具有Student類特征的對象。類特征的對象。stud1和和stud2這兩個對象都分別包括這兩個對象都分別包括Student類中定義類中定
39、義的數據和函數。的數據和函數。定義對象也可以有幾種方法。定義對象也可以有幾種方法。8.2.3 定義對象的方法定義對象的方法1. 先聲明類類型,然后再定義對象先聲明類類型,然后再定義對象前面用的就是這種方法,如前面用的就是這種方法,如Student stud1,stud2; /Student是已經聲明的類類型是已經聲明的類類型在在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;coutse
41、x:sexendl; private: /后聲明私有部分后聲明私有部分int num;char name20; char sex; stud1,stud2; /定義了兩個定義了兩個Student類的對象類的對象在定義在定義Student類的同時,定義了兩個類的同時,定義了兩個Student 類的對類的對象。象。3. 不出現類名,直接定義對象不出現類名,直接定義對象class /無類名無類名private: /聲明以下部分為私有的聲明以下部分為私有的 public: /聲明以下部分為公用的聲明以下部分為公用的 stud1,stud2; /定義了兩個無類名的類對象定義了兩個無類名的類對象直接定義對
42、象,在直接定義對象,在C+中是合法的、允許的,但卻很中是合法的、允許的,但卻很少用,也不提倡用。在實際的程序開發中,一般都采少用,也不提倡用。在實際的程序開發中,一般都采用上面用上面3種方法中的第種方法中的第1種方法。在小型程序中或所聲種方法。在小型程序中或所聲明的類只用于本程序時,也可以用第明的類只用于本程序時,也可以用第2種方法。種方法。在定義一個對象時,編譯系統會為這個對象分配存儲在定義一個對象時,編譯系統會為這個對象分配存儲空間,以存放對象中的成員。空間,以存放對象中的成員。C+增加了增加了class類型后,仍保留了結構體類型類型后,仍保留了結構體類型(struct),而且把它的功能也
43、擴展了。而且把它的功能也擴展了。C+允許用允許用struct來定義來定義一個類型。如可以將前面用關鍵字一個類型。如可以將前面用關鍵字class聲明的類類型聲明的類類型改為用關鍵字改為用關鍵字struct: struct Student /用關鍵字用關鍵字struct來聲明一個類類型來聲明一個類類型private: /聲明以下部分為私有的聲明以下部分為私有的int num; /以下以下3行為數據成員行為數據成員char name20; char sex; public: /聲明以下部分為公用的聲明以下部分為公用的 void display( ) /成員函數成員函數coutnum:numendl;
44、coutname:nameendl;coutsex:sexendl; ;Student stud1,stud2; /定義了兩個定義了兩個Student類的對象類的對象8.2.4 類和結構體類型的異同類和結構體類型的異同為了使結構體類型也具有封裝的特征,為了使結構體類型也具有封裝的特征,C+不是簡單不是簡單地繼承地繼承C的結構體,而是使它也具有類的特點,以便的結構體,而是使它也具有類的特點,以便于用于面向對象程序設計。用于用于面向對象程序設計。用struct聲明的結構體類聲明的結構體類型實際上也就是類。型實際上也就是類。用用struct聲明的類,如果對其成員不作聲明的類,如果對其成員不作priv
45、ate或或public的聲明,系統將其默認為的聲明,系統將其默認為public。如果想分別。如果想分別指定私有成員和公用成員,則應用指定私有成員和公用成員,則應用private或或public作作顯式聲明。而用顯式聲明。而用class定義的類,如果不作定義的類,如果不作private或或public聲明,系統將其成員默認為聲明,系統將其成員默認為private,在需要時,在需要時也可以自己用顯式聲明改變。也可以自己用顯式聲明改變。如果希望成員是公用的,使用如果希望成員是公用的,使用struct比較方便,如果比較方便,如果希望部分成員是私有的,宜用希望部分成員是私有的,宜用class。建議盡量使
46、用建議盡量使用class來建立類,寫出完全體現來建立類,寫出完全體現C+風格的程序。風格的程序。類的成員函數類的成員函數(簡稱類函數簡稱類函數)是函數的一種,它的用法是函數的一種,它的用法和作用和第和作用和第4章介紹過的函數基本上是一樣的,它也章介紹過的函數基本上是一樣的,它也有返回值和函數類型,它與一般函數的區別只是:有返回值和函數類型,它與一般函數的區別只是: 它是屬于一個類的成員,出現在類體中。它可以被指它是屬于一個類的成員,出現在類體中。它可以被指定為定為private(私有的私有的)、public(公用的公用的)或或protected(受受保護的保護的)。在使用類函數時,要注意調用它
47、的權限。在使用類函數時,要注意調用它的權限(它它能否被調用能否被調用)以及它的作用域以及它的作用域(函數能使用什么范圍中函數能使用什么范圍中的數據和函數的數據和函數)。例如私有的成員函數只能被本類中。例如私有的成員函數只能被本類中的其他成員函數所調用,而不能被類外調用。的其他成員函數所調用,而不能被類外調用。8.3 類的成員函數類的成員函數 8.3.1 成員函數的性質成員函數的性質成員函數可以訪問本類中任何成員成員函數可以訪問本類中任何成員(包括私有的和公包括私有的和公用的用的),可以引用在本作用域中有效的數據。,可以引用在本作用域中有效的數據。一般的做法是將需要被外界調用的成員函數指定為一般
48、的做法是將需要被外界調用的成員函數指定為public,它們是類的對外接口。但應注意,并非要求它們是類的對外接口。但應注意,并非要求把所有成員函數都指定為把所有成員函數都指定為public。有的函數并不是準有的函數并不是準備為外界調用的,而是為本類中的成員函數所調用的,備為外界調用的,而是為本類中的成員函數所調用的,就應該將它們指定為就應該將它們指定為private。這種函數的作用是支這種函數的作用是支持其他函數的操作,是類中其他成員的工具函數持其他函數的操作,是類中其他成員的工具函數(utility function),類外用戶不能調用這些私有的工具類外用戶不能調用這些私有的工具函數。函數。
49、類的成員函數是類體中十分重要的部分。如果一個類類的成員函數是類體中十分重要的部分。如果一個類中不包含成員函數,就等同于中不包含成員函數,就等同于C語言中的結構體了,語言中的結構體了,體現不出類在面向對象程序設計中的作用。體現不出類在面向對象程序設計中的作用。在前面已經看到成員函數是在類體中定義的。也可以在前面已經看到成員函數是在類體中定義的。也可以在類體中只寫成員函數的聲明,而在類的外面進行函在類體中只寫成員函數的聲明,而在類的外面進行函數定義。如數定義。如 class Student public:void display( ); /公用成員函數原型聲明公用成員函數原型聲明private:i
50、nt num;string name; char sex; /以上以上3行是私有數據成員行是私有數據成員 ;void Student display( ) /在類外定義在類外定義display類函數類函數coutnum:numendl; /函數體函數體coutname:nameendl; coutsex:sexendl; Student stud1,stud2; /定義兩個類對象定義兩個類對象8.3.2 在類外定義成員函數在類外定義成員函數注意:注意: 在類體中直接定義函數時,不需要在函數名在類體中直接定義函數時,不需要在函數名前面加上類名,因為函數屬于哪一個類是不言而喻的。前面加上類名,因為
51、函數屬于哪一個類是不言而喻的。但成員函數在類外定義時,必須在函數名前面加上類但成員函數在類外定義時,必須在函數名前面加上類名,予以限定名,予以限定(qualifed),“ ”是作用域限定符是作用域限定符(field qualifier)或稱作用域運算符,用它聲明函數是屬于哪或稱作用域運算符,用它聲明函數是屬于哪個類的。個類的。如果在作用域運算符如果在作用域運算符“ ”的前面沒有類名,或者函的前面沒有類名,或者函數名前面既無類名又無作用域運算符數名前面既無類名又無作用域運算符“ ”,如,如 display( ) 或或 display( )則表示則表示display函數不屬于任何類,這個函數不是成
52、函數不屬于任何類,這個函數不是成員函數,而是全局函數,即非成員函數的一般普通函員函數,而是全局函數,即非成員函數的一般普通函數。數。類函數必須先在類體中作原型聲明,然后在類外定義,類函數必須先在類體中作原型聲明,然后在類外定義,也就是說類體的位置應在函數定義之前,否則編譯時也就是說類體的位置應在函數定義之前,否則編譯時會出錯。會出錯。雖然函數在類的外部定義,但在調用成員函數時會根雖然函數在類的外部定義,但在調用成員函數時會根據在類中聲明的函數原型找到函數的定義(函數代據在類中聲明的函數原型找到函數的定義(函數代碼),從而執行該函數。碼),從而執行該函數。在類的內部對成員函數作聲明,而在類體外定
53、義成員在類的內部對成員函數作聲明,而在類體外定義成員函數,這是程序設計的一種良好習慣。如果一個函數,函數,這是程序設計的一種良好習慣。如果一個函數,其函數體只有其函數體只有23行,一般可在聲明類時在類體中定行,一般可在聲明類時在類體中定義。多于義。多于3行的函數,一般在類體內聲明,在類外定行的函數,一般在類體內聲明,在類外定義。義。關于內置關于內置(inline)函數,已在第函數,已在第4章第章第4.5節中作過介紹。節中作過介紹。類的成員函數也可以指定為內置函數。類的成員函數也可以指定為內置函數。在類體中定義的成員函數的規模一般都很小,而系統在類體中定義的成員函數的規模一般都很小,而系統調用函
54、數的過程所花費的時間開銷相對是比較大的。調用函數的過程所花費的時間開銷相對是比較大的。調用一個函數的時間開銷遠遠大于小規模函數體中全調用一個函數的時間開銷遠遠大于小規模函數體中全部語句的執行時間。為了減少時間開銷,如果在類體部語句的執行時間。為了減少時間開銷,如果在類體中定義的成員函數中不包括循環等控制結構,中定義的成員函數中不包括循環等控制結構,C+系系統會自動將它們作為內置統會自動將它們作為內置(inline)函數來處理。也就函數來處理。也就是說,在程序調用這些成員函數時,并不是真正地執是說,在程序調用這些成員函數時,并不是真正地執行函數的調用過程行函數的調用過程(如保留返回地址等處理如保
55、留返回地址等處理),而是把,而是把函數代碼嵌入程序的調用點。這樣可以大大減少調用函數代碼嵌入程序的調用點。這樣可以大大減少調用成員函數的時間開銷。成員函數的時間開銷。8.3.3 inline 成員函數成員函數C+要求對一般的內置函數要用關鍵字要求對一般的內置函數要用關鍵字inline聲明,聲明,但對類內定義的成員函數,可以省略但對類內定義的成員函數,可以省略inline,因為這因為這些成員函數已被隱含地指定為內置函數。如些成員函數已被隱含地指定為內置函數。如 class Student public: void display( ) coutnum:numendl;coutname:namee
56、ndl; coutsex:sexendl; private:int num;string name; char sex;其中第其中第3行行void display( )也可以寫成也可以寫成inline void display( )將將display函數顯式地聲明為內置函數。以上兩種寫函數顯式地聲明為內置函數。以上兩種寫法是等效的。對在類體內定義的函數,一般都省寫法是等效的。對在類體內定義的函數,一般都省寫inline。應該注意的是:應該注意的是: 如果成員函數不在類體內定義,而如果成員函數不在類體內定義,而在類體外定義,系統并不把它默認為內置在類體外定義,系統并不把它默認為內置(inline
57、)函函數,調用這些成員函數的過程和調用一般函數的過程數,調用這些成員函數的過程和調用一般函數的過程是相同的。如果想將這些成員函數指定為內置函數,是相同的。如果想將這些成員函數指定為內置函數,應當用應當用inline作顯式聲明。如作顯式聲明。如class Student public:inline void display( ); /聲明此成員函數為內置函數聲明此成員函數為內置函數private:int num;string name; char sex; ;inline void Student display( ) / 在類外定義在類外定義display函數為內置函數函數為內置函數coutn
58、um:numendl; coutname:nameendl; coutsex:sexabc;可以用下面的語句來輸出該類對象所占用的字節數:可以用下面的語句來輸出該類對象所占用的字節數:coutsizeof(Time)endl;輸出的值是輸出的值是12。這就證明了一個對象所占的空間大小。這就證明了一個對象所占的空間大小只取決于該對象中數據成員所占的空間,而與成員函只取決于該對象中數據成員所占的空間,而與成員函數無關。函數代碼是存儲在對象空間之外的。如果對數無關。函數代碼是存儲在對象空間之外的。如果對同一個類定義了同一個類定義了10個對象,這些對象的成員函數對應個對象,這些對象的成員函數對應的是同
59、一個函數代碼段,而不是的是同一個函數代碼段,而不是10個不同的函數代碼個不同的函數代碼段。段。需要注意的是:需要注意的是: 雖然調用不同對象的成員函數時都雖然調用不同對象的成員函數時都是執行同一段函數代碼,但是執行結果一般是不相同是執行同一段函數代碼,但是執行結果一般是不相同的。不同的對象使用的是同一個函數代碼段,它怎么的。不同的對象使用的是同一個函數代碼段,它怎么能夠分別對不同對象中的數據進行操作呢?原來能夠分別對不同對象中的數據進行操作呢?原來C+為此專門設立了一個名為為此專門設立了一個名為this的指針,用來指向不同的指針,用來指向不同的對象。的對象。需要說明:需要說明: (1) 不論成
60、員函數在類內定義還是在類外定義,成員不論成員函數在類內定義還是在類外定義,成員函數的代碼段都用同一種方式存儲。函數的代碼段都用同一種方式存儲。(2) 不要將成員函數的這種存儲方式和不要將成員函數的這種存儲方式和inline(內置內置)函函數的概念混淆。數的概念混淆。(3) 應當說明:應當說明: 常說的常說的“某某對象的成員函數某某對象的成員函數”,是,是從邏輯的角度而言的,而成員函數的存儲方式,是從從邏輯的角度而言的,而成員函數的存儲方式,是從物理的角度而言的,二者是不矛盾的。物理的角度而言的,二者是不矛盾的。在程序中經常需要訪問對象中的成員。訪問對象中的在程序中經常需要訪問對象中的成員。訪問
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《GBT17989.5-2022生產過程質量控制統計方法控制圖第5部分:特殊控制圖》(2025版)深度解析
- 人物繪畫少兒美術課件
- 企業客車司機安全培訓體系構建
- 音樂教育培訓課件
- 手術后膈疝的臨床護理
- 藥品不合格管理體系建設
- 《知識產權分析法》課件
- 軟件開發助理工作流程
- 質量管理的常用方法
- 《輕客系統概述》課件
- 2024年陜西省普通高中學業水平合格性考試歷史試題(解析版)
- 中國干眼臨床診療專家共識(2024年)解讀
- 一年級家長會課件2024-2025學年
- 拉美文化學習通超星期末考試答案章節答案2024年
- 文藝復興經典名著選讀智慧樹知到期末考試答案章節答案2024年北京大學
- 小小科學家《物理》模擬試卷A(附答案)
- GB/T 18175-2014水處理劑緩蝕性能的測定旋轉掛片法
- 燃氣工程竣工驗收報告
- 固化飛灰填埋工程施工方案(共16頁)
- 電力定額問題解答匯總
- 《World Holidays》RAZ分級閱讀繪本pdf資源
評論
0/150
提交評論