C++程序設(shè)計基礎(chǔ)課件第6-7講-類和對象(一)-_第1頁
C++程序設(shè)計基礎(chǔ)課件第6-7講-類和對象(一)-_第2頁
C++程序設(shè)計基礎(chǔ)課件第6-7講-類和對象(一)-_第3頁
C++程序設(shè)計基礎(chǔ)課件第6-7講-類和對象(一)-_第4頁
C++程序設(shè)計基礎(chǔ)課件第6-7講-類和對象(一)-_第5頁
已閱讀5頁,還剩64頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、C+程序設(shè)計基礎(chǔ)主講人:曹岳輝2011年春季學(xué)期第6-7講 類和對象(一)C+程序設(shè)計基礎(chǔ)主講人:曹岳輝2011年春季學(xué)期第6-7講 類的定義 對象的定義 對象的初始化 成員函數(shù)的特性 靜態(tài)成員 友元 局部類和嵌套類主 要 內(nèi) 容 類的定義主 要 內(nèi) 容1. 類的定義 面向?qū)ο蟮幕靖拍?類的定義格式 注意事項1. 類的定義 面向?qū)ο蟮幕靖拍钤诂F(xiàn)實中,類是對一組客觀對象的抽象,它將該組對象所具有的共同特征(包括屬性和服務(wù))封裝起來,以說明該組對象的能力和性質(zhì)。在系統(tǒng)中,類(class)是一種用戶自定義的數(shù)據(jù)類型。通過類使得現(xiàn)實中的抽象實體在程序中直接表示為一個標(biāo)識符,并可以進(jìn)行引用和操作。這

2、使得程序中的概念與應(yīng)用中的概念相互比較一致和對應(yīng)。面向?qū)ο蟮幕靖拍钤诂F(xiàn)實中,類是對一組客觀對象的抽象,它將該組對象所具有的共同1. 對象客觀世界中任何一個事物都可以看成一個對象(object)。對象可大可小。對象是構(gòu)成系統(tǒng)的基本單位。任何對象都具兩個要素,即屬性(attribute)和行為(behavior)它能根據(jù)外界給的信息進(jìn)行相應(yīng)的操作。一個對象往往是由一組屬性和一組行為構(gòu)成的。在一個系統(tǒng)中的多個對象之間通過一定的渠道相互聯(lián)系。要使某一個對象實現(xiàn)某一種行為(即操作),應(yīng)當(dāng)向它傳送相應(yīng)的消息。對象之間就是這樣通過發(fā)送和接收消息互相聯(lián)系的面向?qū)ο蟮幕靖拍?. 對象面向?qū)ο蟮幕靖拍蠲嫦驅(qū)?/p>

3、象的基本概念面向?qū)ο蟮幕靖拍頒+,每個對象都是由數(shù)據(jù)和函數(shù)(即操作代碼) 兩部分組成。數(shù)據(jù)體現(xiàn)了前面提到的“屬性”。如一個三角形對象,它的3個邊長就是它的屬性。函數(shù)是用來對數(shù)據(jù)進(jìn)行操作的,以便實現(xiàn)某些功能(即行為)。例如可以通過邊長計算出三角形的面積等,計算三角形面積就是前面提到的行為,在程序設(shè)計方法中也稱為方法(method)。調(diào)用對象中的函數(shù)就是向該對象傳送一個消息(message),要求該對象實現(xiàn)某一行為(功能)。面向?qū)ο蟮幕靖拍頒+,每個對象都是由數(shù)據(jù)和函數(shù)(即操作代碼) 兩部分組成。2. 封裝與信息隱蔽對一個對象進(jìn)行封裝處理,把它的一部分屬性和功能對外界屏蔽,也就是說從外界是看不

4、到的,甚至是不可知的。其好處是大大降低了操作對象的復(fù)雜程度。封裝:一是將有關(guān)的數(shù)據(jù)和操作代碼封裝在一個對象中,形成一個基本單位,各個對象之間相對獨立,互不干擾。二是將對象中某些部分對外隱蔽,即隱蔽其內(nèi)部細(xì)節(jié),只留下少量接口,以便與外界聯(lián)系,接收外界的消息。這種對外界隱蔽的做法稱為信息隱蔽(information hiding)。信息隱蔽還有利于數(shù)據(jù)安全,防止無關(guān)的人了解和修改數(shù)據(jù)。面向?qū)ο蟮幕靖拍?. 封裝與信息隱蔽面向?qū)ο蟮幕靖拍?. 抽象 抽象(abstraction)就是將有關(guān)事物的共性歸納、集中的過程。抽象的作用是表示同一類事物的本質(zhì)。C+中的數(shù)據(jù)類型就是對一批具體的數(shù)的抽象。對象

5、是具體存在的,類是對象的抽象;對象則是類的特例,或者說對象是類的具體表現(xiàn)形式。(如一個三角形可以作為一個對象,10個不同尺寸的三角形是10個對象。如果這10個三角形對象有相同的屬性和行為,可以將它們抽象為一種類型,稱為三角形類型。在C+中,這種類型就稱為“類(class)”。這10個三角形就是屬于同一“類”的對象。)面向?qū)ο蟮幕靖拍?. 抽象面向?qū)ο蟮幕靖拍?. 繼承與重用如果在軟件開發(fā)中已經(jīng)建立了一個名為A的“類”,又想另外建立一個名為B的“類”,而后者與前者內(nèi)容基本相同,只是在前者的基礎(chǔ)上增加一些屬性和行為,只需在類A的基礎(chǔ)上增加一些新內(nèi)容即可。這就是面向?qū)ο蟪绦蛟O(shè)計中的繼承機(jī)制。利用

6、繼承可以簡化程序設(shè)計的步驟。(舉例:白馬繼承馬的特征)C+提供了繼承機(jī)制,采用繼承的方法可以很方便地利用一個已有的類建立一個新的類。這就是常說的“軟件重用”(software reusability) 的思想。面向?qū)ο蟮幕靖拍?. 繼承與重用面向?qū)ο蟮幕靖拍?. 多態(tài)性如果有幾個相似而不完全相同的對象,有時人們要求在向它們發(fā)出同一個消息時,它們的反應(yīng)各不相同,分別執(zhí)行不同的操作,這就是多態(tài)現(xiàn)象。(在Windows下,用鼠標(biāo)雙擊一個文件對象(這就是向?qū)ο髠魉鸵粋€消息),如果對象是一個可執(zhí)行文件,則會執(zhí)行此程序,如果對象是一個文本文件,則啟動文本編輯器并打開該文件。)多態(tài)性(polymorph

7、ism)是指: 由繼承而產(chǎn)生的相關(guān)的不同的類,其對象對同一消息會作出不同的響應(yīng)。多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計的一個重要特征,能增加程序的靈活性。面向?qū)ο蟮幕靖拍?. 多態(tài)性面向?qū)ο蟮幕靖拍顐鹘y(tǒng)的面向過程程序設(shè)計是圍繞功能進(jìn)行的,用一個函數(shù)實現(xiàn)一個功能。所有的數(shù)據(jù)都是公用的,一個函數(shù)可以使用任何一組數(shù)據(jù),而一組數(shù)據(jù)又能被多個函數(shù)所使用。面向?qū)ο蟪绦蛟O(shè)計的特點傳統(tǒng)的面向過程程序設(shè)計是圍繞功能進(jìn)行的,用一個函數(shù)實現(xiàn)一面向?qū)ο蟪绦蛟O(shè)計面對的是一個個對象。其中每一組數(shù)據(jù)都是有特定的用途的,是某種操作的對象。也就是說,一組操作調(diào)用一組數(shù)據(jù)。程序設(shè)計者的任務(wù)包括: 一是設(shè)計所需的各種類和對象,即決定把哪些數(shù)

8、據(jù)和操作封裝在一起;二是考慮怎樣向有關(guān)對象發(fā)送消息,以完成所需的任務(wù)。對一個大型任務(wù)來說,面向?qū)ο蟪绦蛟O(shè)計方法是十分有效的,它能大大降低程序設(shè)計人員的工作難度,減少出錯機(jī)會。面向?qū)ο蟪绦蛟O(shè)計的特點面向?qū)ο蟪绦蛟O(shè)計面對的是一個個對象。其中每一組數(shù)據(jù)都是有面向?qū)ο蟮某绦蛟O(shè)計是以類和對象為基礎(chǔ)的,程序的操作是圍繞對象進(jìn)行的,在此基礎(chǔ)上利用了繼承機(jī)制和多態(tài)性等。面向過程的結(jié)構(gòu)化程序設(shè)計中,常用以下公式來表述程序: 程序=算法數(shù)據(jù)結(jié)構(gòu)面向?qū)ο蟪绦蛟O(shè)計就是把一個算法和一組數(shù)據(jù)結(jié)構(gòu)封裝在一個對象中。因此就形成了新的觀念: 對象 = 算法 數(shù)據(jù)結(jié)構(gòu)程序 = (對象+對象+對象+) + 消息 或: 程序 = 對

9、象s + 消息面向?qū)ο蟪绦蛟O(shè)計的特點面向?qū)ο蟮某绦蛟O(shè)計是以類和對象為基礎(chǔ)的,程序的操作是圍繞對象隨著軟件規(guī)模的迅速增大,軟件人員面臨的問題十分復(fù)雜。需要規(guī)范整個軟件開發(fā)過程,明確軟件開發(fā)過程中每個階段的任務(wù),在保證前一個階段工作的正確性的情況下,再進(jìn)行下一階段的工作。這就是軟件工程學(xué)需要研究和解決的問題。面向?qū)ο蟮能浖こ贪ㄒ韵聨讉€部分: 面向?qū)ο蟮能浖_發(fā)隨著軟件規(guī)模的迅速增大,軟件人員面臨的問題十分復(fù)雜。需要1. 面向?qū)ο蠓治?object oriented analysis,OOA) 軟件工程中的系統(tǒng)分析階段,系統(tǒng)分析員要和用戶結(jié)合在一起,對用戶的需求作出精確的分析和明確的描述,從宏觀

10、的角度概括出系統(tǒng)應(yīng)該做什么(而不是怎么做)。面向?qū)ο蟮姆治觯凑彰嫦驅(qū)ο蟮母拍詈头椒?,在對任?wù)的分析中,從客觀存在的事物和事物之間的關(guān)系,歸納出有關(guān)的對象(包括對象的屬性和行為)以及對象之間的聯(lián)系,并將具有相同屬性和行為的對象用一個類(class)來表示。建立一個能反映真實工作情況的需求模型。面向?qū)ο蟮能浖_發(fā)1. 面向?qū)ο蠓治?object oriented anal2. 面向?qū)ο笤O(shè)計(object oriented design,OOD)根據(jù)面向?qū)ο蠓治鲭A段形成的需求模型,對每一部分分別進(jìn)行具體的設(shè)計。首先是進(jìn)行類的設(shè)計,類的設(shè)計可能包含多個層次(利用繼承與派生)。然后以這些類為基礎(chǔ)提出

11、程序設(shè)計的思路和方法,包括對算法的設(shè)計。在設(shè)計階段,并不牽涉某一種具體的計算機(jī)語言,而是用一種更通用的描述工具(如偽代碼或流程圖)來描述。面向?qū)ο蟮能浖_發(fā)2. 面向?qū)ο笤O(shè)計(object oriented desi3. 面向?qū)ο缶幊蹋∣OP)用一種計算機(jī)語言把它寫成程序,顯然應(yīng)當(dāng)選用面向?qū)ο蟮挠嬎銠C(jī)語言(例如C+),否則無法實現(xiàn)面向?qū)ο笤O(shè)計的要求。4. 面向?qū)ο鬁y試(object oriented test,OOT)在寫好程序后交給用戶使用前,必須對程序進(jìn)行嚴(yán)格的測試。測試的目的是發(fā)現(xiàn)程序中的錯誤并改正它。面向?qū)ο鬁y試是用面向?qū)ο蟮姆椒ㄟM(jìn)行測試,以類作為測試的基本單元。面向?qū)ο蟮能浖_發(fā)3.

12、 面向?qū)ο缶幊蹋∣OP)4. 面向?qū)ο鬁y試(object類的定義格式類的定義格式一般分為說明部分和實現(xiàn)部分。說明部分:是用來說明類中的成員,包含數(shù)據(jù)成員的說明和成員函數(shù)的說明。成員函數(shù)是用來對數(shù)據(jù)成員進(jìn)行操作的,也稱為“方法”。實現(xiàn)部分:是用來對成員函數(shù)進(jìn)行定義。說明部分的一般格式為:class 類類型名 private: 私有成員說明 public: 公有成員說明 ;程序中的任何函數(shù)都可訪問私有訪問權(quán)限,為默認(rèn)值,可缺省除本類中的成員函數(shù)及友元外,其他類外函數(shù)不能訪問。公有訪問權(quán)限類的定義格式類的定義格式一般分為說明部分和實現(xiàn)部分。程序中的例如:定義一個person類,設(shè)person具有的特

13、征:屬性(姓名、年齡、性別),方法(輸出一個人的屬性);則對應(yīng)著有4個成員:三個數(shù)據(jù)成員,一個成員函數(shù)。這些數(shù)據(jù)成員一般不能由外界直接訪問,隨意修改。而只能通過成員函數(shù)進(jìn)行訪問。所以三個數(shù)據(jù)成員定義為私有成員,print成員函數(shù)定義為公有成員。則有:class Tperson private: char name10; int age; char sex; public: void print( ); ;成員函數(shù)的說明形式與一般函數(shù)的說明形式一致數(shù)據(jù)成員的說明形式與變量的定義形式相似類名通常用T字母開始,以區(qū)別其他標(biāo)識符例如:定義一個person類,設(shè)person具有的特征:屬性類的實現(xiàn)部分即

14、定義它的成員函數(shù),方式與定義普通函數(shù)大體相同。若在類說明外部定義成員函數(shù),則應(yīng)使用作用域限定符:指明該函數(shù)是哪個類中的成員函數(shù)。格式為:類型 類名:成員函數(shù)名(參數(shù)表) 函數(shù)體如:void Tperson:print( ) coutnameagesex數(shù)據(jù)成員或 指針名-成員函數(shù)例:Tdate date1; Tdate *Pdate=&date1; /指針指向?qū)ο骴ate1 Pdate1-day=30;Pdate1-Print( );類和對象關(guān)系如同整型 int 與整型變量 i 之間的關(guān)系。對象成員的表示方法通過對象可以訪問類中的公有類型數(shù)據(jù)和成員函注意:在成員函數(shù)中訪問成員無須加對象名來作為

15、前綴。如:void Tperson:print( )/自家人不客氣coutnameagesex。所以:age=a; this-age=a; s.age=a;一個類中所有對象調(diào)用的成員函數(shù)都是在同一代碼段。那么成員函數(shù)3. 對象的初始化 構(gòu)造函數(shù)和析構(gòu)函數(shù) 缺省構(gòu)造函數(shù)和缺省析構(gòu)函數(shù) 拷貝初始化構(gòu)造函數(shù)3. 對象的初始化 構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)是在類體中說明的兩種特殊的成員函數(shù)。構(gòu)造函數(shù)的功能是在創(chuàng)建對象時給對象分配內(nèi)存空間 ,并可使用給定值來初始化對象。析構(gòu)函數(shù)的功能是用來釋放一個對象的已分配空間。并可在對象被清除前,完成一些清理工作。構(gòu)造函數(shù)與析構(gòu)函數(shù)的功能正

16、好是對應(yīng)的。構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)是在類體中說明的兩種特殊對前面的日期類進(jìn)行修改,并將定義存放在tdate1.h文件中。如:class TDate1 public: TDate1(int y,int m,int d); TDate1( ); void Print( ); private: int year,month,day; ;構(gòu)造函數(shù)的說明析構(gòu)函數(shù)的說明一般成員函數(shù)的說明函數(shù)名與類名一致,無類型但可有參數(shù)名字與類名一致,前有,無類型無參數(shù)對前面的日期類進(jìn)行修改,并將定義存放在tdate1.h文件中TDate1:TDate1(int y,int m,int d) year=y;

17、month=m;day=d; coutConstructor called.n; TDate1:TDate1( ) coutDestructor called.n; void TDate1:Print( ) coutyear.month.dayendl;構(gòu)造函數(shù)的定義析構(gòu)函數(shù)的定義一般函數(shù)的定義與其他成員函數(shù)定義一樣,兩種函數(shù)的定義可放在類體內(nèi),也可放在類體外TDate1:TDate1(int y,int m,int構(gòu)造函數(shù)的特點有:程序中不能直接調(diào)用構(gòu)造函數(shù),在創(chuàng)建對象時系統(tǒng)自動調(diào)用構(gòu)造函數(shù)。構(gòu)造函數(shù)可以重載,即可定義多個參數(shù)個數(shù)不同的函數(shù)構(gòu)造函數(shù)有隱含的返回值,并由系統(tǒng)內(nèi)部使用析構(gòu)函數(shù)的特

18、點有:一個類中只能定義一個析構(gòu)函數(shù),即不能重載析構(gòu)函數(shù)可以被調(diào)用,也可系統(tǒng)調(diào)用被自動調(diào)用的情況有兩種:在一個函數(shù)體內(nèi)定義的一個對象,當(dāng)函數(shù)結(jié)束時用new運算符動態(tài)創(chuàng)建的一個對象,在使用delete釋放時構(gòu)造函數(shù)的特點有:#include #include tdate1.hvoid main( ) TDate1 today(2007,4,1),tomorrow(2007,4,2); couttoday is; today.Print( ); couttomorrow is; tomorrow.Print( ); 執(zhí)行程序后,輸出結(jié)果為:將含有類定義的頭文件包含進(jìn)來對象定義時,自動調(diào)用構(gòu)造函數(shù)函數(shù)

19、結(jié)束時,自動調(diào)用析構(gòu)Constructor Called.Constructor Called.today is 2007.4.1tomorrow is 2007.4.2Destructor called.Destructor called.#include 將含有類定義的頭文上機(jī)步驟1、建立New Project-Win32 Console Appliciation-C/C+ Header File;2、輸入頭文件內(nèi)容并保存;3、 New - C+ Source File ,輸入程序內(nèi)容并保存;4、編譯、構(gòu)建、執(zhí)行也可以先建立程序文件,編輯后再建立頭文件,并將它加入工程即可!注意:程序與頭文

20、件要在同一目錄!上機(jī)步驟1、建立New Project-Win32 C缺省構(gòu)造函數(shù)和缺省析構(gòu)函數(shù)在類定義中可以不定義任何構(gòu)造函數(shù),這時編譯器會自動生成一個不帶參數(shù)的缺省構(gòu)造函數(shù)。其格式為: :() (何時不能缺省?) 則在程序中定義一個對象而未指明初始化時,編譯器便按缺省構(gòu)造函數(shù)來初始化該對象。同理,若一個類中未定義析構(gòu)函數(shù),編譯系統(tǒng)也生成一個缺省析構(gòu)函數(shù)。其格式為: :() 這也是前面的程序中可以沒有構(gòu)造和析構(gòu)函數(shù)的原因函數(shù)體內(nèi)無代碼,也可自定義一個無參的構(gòu)造函數(shù)來替代缺省缺省構(gòu)造函數(shù)和缺省析構(gòu)函數(shù)在類定義中可以不定義任何構(gòu)造函數(shù),如:class CExample public: CExam

21、ple ( ) ; CExample ( int i ) ; CExample ( int x , int y ) ; private : int member1, member2 ; ;CExample : CExample ( ) member1 = 0; member2 = 0; CExample : CExample ( int i ) member1 = i ; member2 = 0 ; 自定義無參構(gòu)造函數(shù)重載構(gòu)造函數(shù)注:若有構(gòu)造函數(shù)的重載,則不會生成缺省構(gòu)造函數(shù),須自定義無參構(gòu)造函數(shù)!CExample ( int i=8 ) ;可否?如:class CExample自定義無參構(gòu)造

22、函數(shù)重載構(gòu)造對應(yīng)調(diào)用相應(yīng)的構(gòu)造函數(shù)不帶參數(shù)創(chuàng)建對象,調(diào)用無參構(gòu)造函數(shù)CExample : CExample ( int x , int y ) member1 = x ; member2 = y ; void main( ) CExample ex1; CExample ex2(1); CExample ex3( 2, 3 ); 對應(yīng)調(diào)用相應(yīng)的構(gòu)造函數(shù)不帶參數(shù)創(chuàng)建對象,調(diào)用無參構(gòu)造函數(shù)vo拷貝初始化構(gòu)造函數(shù)構(gòu)造函數(shù)除可以用基本數(shù)據(jù)類型初始化對象外,還可以使用已存在的同類型的對象即類類型的對象來初始化正在創(chuàng)建的對象。為此,必須在類中定義一個特殊的構(gòu)造函數(shù)來完成這個工作,這個構(gòu)造函數(shù)被稱為拷貝初始

23、化構(gòu)造函數(shù)。它實現(xiàn)了在初始化時將一個已知對象的數(shù)據(jù)成員的值拷貝給正在創(chuàng)建的另一個同類的對象。當(dāng)然,它具有一般構(gòu)造函數(shù)的所有特性。格式為::(&) 如:student:student(student & s) 每個類中必須有一個。若類中未說明,則編譯系統(tǒng)會自動生成缺省函數(shù)。函數(shù)名同類名只有一個引用參數(shù)配鑰匙拷貝初始化構(gòu)造函數(shù)構(gòu)造函數(shù)除可以用基本數(shù)據(jù)類型初始化對象外,class CMyClass public: CMyClass ( int x = 0 ) ; CMyClass ( CMyClass & c ) ; / private: int member ; ; CMyClass : CMyC

24、lass ( int x ) member = x ; CMyClass : CMyClass ( CMyClass & c ) member = c . member ; 拷貝初始化構(gòu)造函數(shù)帶缺省值的構(gòu)造函數(shù)class CMyClass拷貝初始化構(gòu)造函數(shù)帶缺省值的構(gòu)拷貝初始化構(gòu)造函數(shù)被自動調(diào)用有三種情況:一、是用一個已知對象初始化一個新對象時。二、是以值調(diào)用方式向一個函數(shù)傳遞對象參數(shù)時。如:void fun ( CMyClass a ) ;void main( ) CMyClass a; CMyClass b(3); CMyClass c(b); fun ( c ) ; 調(diào)用拷貝初始化構(gòu)造函

25、數(shù)調(diào)用帶缺省值的構(gòu)造函數(shù)調(diào)用帶缺省值的構(gòu)造函數(shù)結(jié)果為:a.member:0b.member:3c.member:3fun中的形參a中的數(shù)據(jù)成員a.member:3調(diào)用拷貝初始化構(gòu)造函數(shù)拷貝初始化構(gòu)造函數(shù)被自動調(diào)用有三種情況:調(diào)用拷貝初始化構(gòu)造函三、當(dāng)對象作為函數(shù)返回值時。如: student fn( ) student ms(randy); /創(chuàng)建一個ms對象 return ms; /將ms對象作為返回值 void main( ) student s; /創(chuàng)建一個s對象 s=fn( ); 則返回的ms對象將產(chǎn)生一個臨時對象。系統(tǒng)調(diào)用拷貝構(gòu)造函數(shù)將ms拷貝到新創(chuàng)建的臨時對象中。當(dāng)fn()返回時產(chǎn)

26、生的臨時對象拷貝給s后,臨時對象被析構(gòu)。三、當(dāng)對象作為函數(shù)返回值時。class CPoint float x, y ;/未指明的是private public: CPoint ( float a, float b ); CPoint Add ( CPoint A ); ;CPoint : CPoint ( float a, float b ) x = a ; y = b ;CPoint : Add ( CPoint A ) CPoint B; B.x = x + A.x ; B.y = y + A.y; return B; class CPoint4. 成員函數(shù)的特性 內(nèi)聯(lián)函數(shù)和外聯(lián)函數(shù) 成員

27、函數(shù)的重載性 設(shè)置參數(shù)的缺省值4. 成員函數(shù)的特性 內(nèi)聯(lián)函數(shù)和外聯(lián)函數(shù)內(nèi)聯(lián)函數(shù)和外聯(lián)函數(shù)內(nèi)聯(lián)函數(shù):指定義在類體內(nèi)的成員函數(shù)。外聯(lián)函數(shù):指說明在類體內(nèi),定義在類體外的成員函數(shù)。類外定義的函數(shù)缺省情況下都是外聯(lián)函數(shù),用關(guān)鍵字 inline 可以強(qiáng)制轉(zhuǎn)換。 對于內(nèi)聯(lián)函數(shù),不是在調(diào)用時才轉(zhuǎn)去執(zhí)行函數(shù)體,而是在編譯時對所有調(diào)用該函數(shù)的地方裝入實際的函數(shù)代碼。節(jié)省了調(diào)用開銷,提高了運行速度。內(nèi)聯(lián)函數(shù)必須在調(diào)用之前進(jìn)行定義。內(nèi)聯(lián)函數(shù)和外聯(lián)函數(shù)內(nèi)聯(lián)函數(shù):指定義在類體內(nèi)的成員函數(shù)。class CRectangle float height, width; public: void SetHeight ( flo

28、at x ) /內(nèi)聯(lián)函數(shù)之一 height= x ; void SetWidth ( float y ); ; inline void CRectangle : SetWidth( float y) width = y ; /內(nèi)聯(lián)函數(shù)之二class CRectangle一般的成員函數(shù)都可以進(jìn)行重載。構(gòu)造函數(shù)可以,但析構(gòu)函數(shù)不能。(至少參數(shù)類型或個數(shù)不同)C+會根據(jù)說明中的參數(shù)選擇合適的重載函數(shù)。例如:#include class tdate public: tdate( ); tdate(int d); tdate(int m, int d); private: int month; int

29、day; int year; ;tdate:tdate( ) month=4;day=5;year=1995;tdate:tdate(int d) month=4;day=d;year=1995;tdate:tdate(int m,int d) month=m;day=d;year=1995;void main( ) tdate aday, bday(10), cday(2,12); 重載性一般的成員函數(shù)都可以進(jìn)行重載。構(gòu)造函數(shù)可以,但析構(gòu)函數(shù)不能。一般的成員函數(shù)可以被設(shè)置參數(shù)的缺省值。構(gòu)造函數(shù)也可以,但析構(gòu)函數(shù)無參數(shù),也不能。C+在調(diào)用時會根據(jù)函數(shù)的形參型式配于相應(yīng)的實參值。例如:class

30、 CRectangle/缺省參數(shù)按從右往左的方式 CRectangle ( int Width = 10, int Height = 5 ) ; / ; 設(shè)置參數(shù)的缺省值函數(shù)設(shè)置參數(shù)的缺省值時要避免二義性!一般的成員函數(shù)可以被設(shè)置參數(shù)的缺省值。構(gòu)造函數(shù)也可以,但析構(gòu)5. 靜態(tài)成員 靜態(tài)數(shù)據(jù)成員 靜態(tài)成員函數(shù)5. 靜態(tài)成員 靜態(tài)數(shù)據(jù)成員靜態(tài)成員是在編譯時被創(chuàng)建,其空間只有一個,且與對象是否存在無關(guān),可為所有以后創(chuàng)建的該類對象共享。并且空間一直保存到程序結(jié)束。若想在同一個類的多個對象之間共享某個數(shù)據(jù)??蓪⒃擃惓蓡T聲明為static,使之成為靜態(tài)成員。而一般成員是在對象創(chuàng)建時由構(gòu)造函數(shù)分配空間,屬于

31、具體的某個對象,對象不同則成員空間也不同,并在函數(shù)結(jié)束時由析構(gòu)函數(shù)釋放對象空間而隨之釋放。例如:一個學(xué)生類,有一個對應(yīng)學(xué)生總數(shù)屬性的數(shù)據(jù)成員count。則對于每一個已有學(xué)生對象而言,一旦現(xiàn)有學(xué)生人數(shù)變化,那么已有學(xué)生對象中count所保存的數(shù)據(jù)就不適用,則要對每個對象逐個修改,顯然這是不實際的。而應(yīng)采用靜態(tài)成員。靜態(tài)成員是在編譯時被創(chuàng)建,其空間只有一個,且與對象是否存在無成員有數(shù)據(jù)成員和成員函數(shù)之分,靜態(tài)成員也有靜態(tài)數(shù)據(jù)成員和靜態(tài)成員函數(shù)之分。靜態(tài)數(shù)據(jù)成員的定義同一般的成員函數(shù)的定義相似,由說明部分和定義部分兩部分組成:說明部分為:static 數(shù)據(jù)類型 成員名;定義部分為:數(shù)據(jù)類型 類名:成

32、員名=初始值;如: class CTest public: static int count; /說明部分在類體內(nèi) ; int CTest:count = 0; /定義部分在類體外 注意:必須在定義時進(jìn)行初始化。成員有數(shù)據(jù)成員和成員函數(shù)之分,靜態(tài)成員也有靜態(tài)數(shù)據(jù)成員和靜態(tài)定義好靜態(tài)數(shù)據(jù)成員后,該成員不屬于任何一個對象,引用它的格式也要注意與引用一般成員的區(qū)別: 類名:靜態(tài)成員名 /而一般成員的引用格式為:對象名.成員名如:#include class CTest public: static int count; void Set ( int w ) ; void Display ( ) ;;

33、int CTest:count = 0;在public中,可被類外函數(shù)引用,若在private中,則只能被成員函數(shù)或友元引用定義好靜態(tài)數(shù)據(jù)成員后,該成員不屬于任何一個對象,引用它的格式void CTest : Set ( int w ) count += w ; void CTest : Display ( ) cout count = count endl ;void main( ) CTest a , b ; a . Set (10) ; cout Operating on a: ; a . Display( ) ; b . Set (10) ; cout Operating on b:

34、; b . Display( ) ; cout Operating on a: ; a . Display( ) ;運行結(jié)果:Operating on a: count = 10Operating on b: count = 20Operating on a: count = 20在同類的成員函數(shù)中引用,可省略類名:CTest:countvoid CTest : Set ( int w )運行靜態(tài)成員函數(shù)的定義及用法同靜態(tài)數(shù)據(jù)成員相似。靜態(tài)成員函數(shù)屬于類,而不是對象成員(無this指針用來存放對象的地址) ,對靜態(tài)成員的引用不需用對象名,也不能直接引用具體對象中的非靜態(tài)成員。須使用 (對象名

35、. 成員名)來引用。如:class Mpublic: M(int a) A=a; static void f1(M m); private: int A; static int B; ; int M:B=0; void M:f1(M m)coutm.ABendl; void main( )M p(5); M:f1(p); 靜態(tài)成員函數(shù)靜態(tài)成員聲明靜態(tài)成員定義引用靜態(tài)數(shù)據(jù)成員引用非靜態(tài)成員引用靜態(tài)成員函數(shù)靜態(tài)成員函數(shù)的定義及用法同靜態(tài)數(shù)據(jù)成員相似。靜態(tài)成員函數(shù)靜態(tài)class student public: static int number( ) return noofstudents; pri

36、vate: char name 10; static int noofstudents;int student:noofstudents=1;void main( ) student s; coutstudent:number( )endl;例如:class student例如:6. 友元 友元函數(shù) 友元類6. 友元 友元函數(shù)友元函數(shù)類的私有成員只能由本類的成員訪問,外部函數(shù)只能訪問類的成員函數(shù),再由成員函數(shù)訪問類的私有成員。但是,如果在某個類定義中用friend說明一個外部函數(shù)后,這個外部函數(shù)就可直接訪問該類的任何私有成員。則該外部函數(shù)稱為這個類的友元函數(shù)。采用友元的目的主要是為提高效率。顯

37、然它破壞了類的封裝性。注意:在某個類中說明的友元函數(shù)并不是該類的成員函數(shù)。它可以是外部的一個獨立函數(shù),也可以是另外一個類中的成員函數(shù)。友元函數(shù)類的私有成員只能由本類的成員訪問,外部函數(shù)只能訪問類class Aprivate: void func1() friend void gFunc1(A & p); /聲明友元函數(shù);友元為外部的獨立函數(shù)void gFunc1(A &p) /定義外部友元函數(shù),使用類對象引用作參數(shù)/注:不是成員函數(shù)不加類名: p.func1( ); /友元的使用,調(diào)用私有成員void gFunc2(A * p) p.func1( );/錯誤,gFunc2不是A的友元 clas

38、s A友元為外部的獨立函數(shù)void gFunc1(class B; class A int F1(B& b); /類中使用另一個類對象須先有其說明 int F2(B& b); ; class B private : int m; friend int A:F1(B& b) /把A中F1說明為友元 ; / 類B中的一個函數(shù)int A:F1(B& b) return b.m; /正確: 友元訪問私有成員Int A:F2(B& b) return b.m; /錯誤:A中F2不是友元友元為另一個類的成員函數(shù)class B; 友元為另一個類的成員函數(shù)友元類即一個類作為另一個類的友元。這意味著這個類的所有成員函數(shù)都是另一個類的友元函數(shù)。這只需先聲明而不一定需要先定義。但這種友元關(guān)系是單向的,并只在兩個類之間有效。如:class X friend class Y; public: private: ;class Y /則Y中的所有成員函數(shù)都可引用X中的任何成員。友元類即一個類作為另一個類的友元。7. 局部類和嵌套類 局部類 嵌套類7. 局部類和嵌套類 局部類局部類在一個函數(shù)體內(nèi)定義的類稱為局部類。局部類中只能使用它的外圍作用域中的對象和函數(shù)進(jìn)行聯(lián)系。注意:局部類中不能說明靜態(tài)成員函數(shù),且成員函數(shù)須為內(nèi)聯(lián)函數(shù)。即函數(shù)體定義在類體內(nèi)。int a;vo

溫馨提示

  • 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

提交評論