C+程序設(shè)計語言》--第四講類ppt課件_第1頁
C+程序設(shè)計語言》--第四講類ppt課件_第2頁
C+程序設(shè)計語言》--第四講類ppt課件_第3頁
C+程序設(shè)計語言》--第四講類ppt課件_第4頁
C+程序設(shè)計語言》--第四講類ppt課件_第5頁
已閱讀5頁,還剩46頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計第一節(jié) 面向?qū)ο蟪绦蛟O(shè)計思想第二節(jié) 面向?qū)ο蟮姆椒ǖ谌?jié) 面向?qū)ο蟮臉?biāo)志第四節(jié) 類和對象第五節(jié) 構(gòu)造函數(shù)與析構(gòu)函數(shù)第六節(jié) 類的組合第七節(jié) 類模板2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計第一節(jié) 面向?qū)ο蟪绦蛟O(shè)計思想一、軟件系統(tǒng)開發(fā)方法 如今常用的軟件系統(tǒng)開發(fā)的方法有:傳統(tǒng)方法、構(gòu)造化方法、信息建模方法、面向?qū)ο蠓椒?。以下圖是系統(tǒng)開發(fā)方法論技術(shù)和工具:方法系統(tǒng)流數(shù)據(jù)與用戶的溝通處置邏輯傳統(tǒng)系統(tǒng)流程圖表格、版面、網(wǎng)格圖采訪英語、腳本、程序流程圖構(gòu)造化數(shù)據(jù)流圖數(shù)據(jù)詞典、數(shù)據(jù)構(gòu)造圖、E-R圖采訪、用戶審查、討

2、論斷定樹/表,構(gòu)造化英語、構(gòu)造圖 數(shù)據(jù)建模(信息工程)商業(yè)領(lǐng)域分析、處置模型商業(yè)領(lǐng)域分析、E-R圖采訪、用戶審查、討論,頭腦風(fēng)暴商業(yè)系統(tǒng)設(shè)計面向?qū)ο髮ο竽P蛯ο竽P汀傩圆稍L、用戶審查、討論,頭腦風(fēng)暴對象、模型、效力、場景、斷定樹/表,構(gòu)造化英語2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計教材中強(qiáng)調(diào)了兩種方法:構(gòu)造化程序設(shè)計面向?qū)ο蟪绦蛟O(shè)計詳細(xì)內(nèi)容參看教材p95-962021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計二 面向?qū)ο蟪绦蛟O(shè)計的根本特點(diǎn) 面向?qū)ο筌浖_發(fā)方法是吸收了軟件工程領(lǐng)域有益的概念和有效的方法而開展起來的一種軟件開發(fā)方法。它集籠統(tǒng)性、封

3、裝性、承繼性和多態(tài)性于一體,可以協(xié)助人們開發(fā)出模塊化、數(shù)據(jù)籠統(tǒng)程度高的,表達(dá)信息隱蔽、可復(fù)用、易修正、易擴(kuò)展等特性的程序。 在系統(tǒng)分析與設(shè)計中,籠統(tǒng)用來確定必要的信息系統(tǒng)需求,刪除不用要的部分。為了突出重點(diǎn),籠統(tǒng)有意地忽略信息系統(tǒng)的某些性質(zhì)、屬性或功能?;\統(tǒng)是一種突出重點(diǎn)、去掉細(xì)節(jié)的總結(jié)。例如:地圖的籠統(tǒng),根據(jù)籠統(tǒng)的層次,地圖可分為國家地圖、行政省或地域地圖、城市地圖、郵政代碼地圖等。參看教材p972021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計封裝或信息隱蔽 封裝或信息隱蔽指軟件的組成部分模塊、子程序、方法等應(yīng)該相互獨(dú)立,或者隱藏設(shè)計的細(xì)節(jié)。 在系統(tǒng)分析和設(shè)計中,系統(tǒng)分析

4、員把問題域分解為小的封裝單元,這些分析和設(shè)計決議最終成為軟件模塊,封裝就是有利于靈敏地部分修正和維護(hù)軟件模塊。2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計封裝或信息隱蔽用于以下兩種情況1、當(dāng)人們只能運(yùn)用或接觸整個系統(tǒng)的某個子集時。例如:當(dāng)開發(fā)一個信息系統(tǒng)時,開發(fā)小組成員授命開發(fā)系統(tǒng)的某個部分,不需接觸其它成員開發(fā)的部分。所以,封裝或信息隱蔽適宜于團(tuán)隊開發(fā)。2. 有意防止信息系統(tǒng)的某些部件留意或利用系統(tǒng)的其它部件。這涉及到封裝的另外一個方面-分配責(zé)任。正如現(xiàn)實(shí)生活中一個人負(fù)有某種責(zé)任,信息系統(tǒng)中的一個部件也有本人的責(zé)任,比如自動取款機(jī)的付鈔功能,系統(tǒng)其它部件那么擔(dān)任付鈔以

5、外的其它責(zé)任。留意:在傳統(tǒng)方法中,封裝通常局限于將功能和數(shù)據(jù)分開封裝;而在面向?qū)ο蟮姆椒ㄖ?,封裝將功能和數(shù)據(jù)同時裝入對象中。2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計承繼 承繼是表示類似性質(zhì)的機(jī)制。正如一個人同時承繼父母的外貌特點(diǎn)一樣,信息系統(tǒng)組成成分也從有關(guān)部件承繼某些特點(diǎn)。例如:右圖顯示了人和教師、學(xué)生及管理者之間的承繼關(guān)系。 人和教師、學(xué)生及管理者之間是承繼父子 關(guān)系, 教師、學(xué)生、管理者之間是兄弟關(guān)系。 人的特點(diǎn)如姓名、性別、年齡等,為承繼層次中一切子節(jié)點(diǎn)承繼;有些特點(diǎn)那么為子節(jié)點(diǎn)獨(dú)有,如授課時間只對教師適用,平均分?jǐn)?shù)只對學(xué)生適用,頭銜只對管理者適用。同樣,一

6、些人能做的事也對教師、學(xué)生及管理者適用,例如吃飯、睡覺等,同樣,有些事那么為子節(jié)點(diǎn)獨(dú)有。留意:承繼在層次中是自上而下單向進(jìn)展的。管理者人學(xué)生教師2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計多態(tài)多態(tài)普通指具有多種形狀的才干。如:水有三種形狀,液體、氣體和固體。在某種程度上,在車?yán)锊炜唇煌舻姆错懯嵌鄳B(tài)的,當(dāng)交通燈閃現(xiàn)不同顏色時,人的反響是不同的。又如打印程序可以打印字符、數(shù)字、圖形和圖像,打印程序由于知道如何打印圖文,因此是多態(tài)的。2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計第二節(jié) 面向?qū)ο蟮姆椒?面向?qū)ο笫且环N軟件開發(fā)方法,軟件開發(fā)的目的是為了進(jìn)

7、展數(shù)據(jù)處置,所以程序中包含了數(shù)據(jù)以及對數(shù)據(jù)的操作代碼。面向?qū)ο蟮木幊烫幚韱栴}的思緒從對象人、地方、事情等角度入手,而不像傳統(tǒng)方法與構(gòu)造化方法一樣從功能入手。 面向?qū)ο蟮拈_發(fā)強(qiáng)調(diào)從問題域的概念到軟件程序和界面的直接映射;心思學(xué)的研討也闡明,把客觀世界看成是許多對象更接近人類的自然思想方式。對象比函數(shù)更為穩(wěn)定;軟件需求的變動往往是功能相關(guān)的變動,而其功能的執(zhí)行者-對象-通常不會有大的變動。另外,面向?qū)ο蟮拈_發(fā)也支持、鼓勵軟件工程實(shí)際中的信息隱藏、數(shù)據(jù)籠統(tǒng)和封裝。在一個對象內(nèi)部的修正被部分隔離。面向?qū)ο箝_發(fā)的軟件易于修正、擴(kuò)展和維護(hù)。2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)

8、計面向?qū)ο缶幊?根本概念 在面向?qū)ο缶幊讨?,程序被看作是相互協(xié)作的對象集合,每個對象都是某個類的實(shí)例,一切的類構(gòu)成一個經(jīng)過承繼關(guān)系相聯(lián)絡(luò)的層次構(gòu)造。面向?qū)ο蟮难哉Z經(jīng)常具有以下特征:對象生勝利能、音訊傳送機(jī)制、類和遺傳機(jī)制。這些概念當(dāng)然可以并且也曾經(jīng)在其他編程言語中單獨(dú)出現(xiàn),但只需在面向?qū)ο笱哉Z中,他們才共同出現(xiàn),以一種獨(dú)特的協(xié)作方式相互協(xié)作、相互補(bǔ)充。 過程化編程方式: 參數(shù)輸入- | 代 碼 | -結(jié)果輸出 為實(shí)現(xiàn)某個功能,參數(shù)被傳入某個處置過程,最后傳回計算結(jié)果。 面向?qū)ο缶幊谭绞剑?界面 - | 對象數(shù)據(jù)構(gòu)造和 操作2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計 O

9、O編程中,功能是經(jīng)過與對象的通訊獲得的。 對象可以被定義為一個封裝了形狀和行為的實(shí)體;或者說是數(shù)據(jù)構(gòu)造或?qū)傩院筒僮鳌?形狀實(shí)踐上是為執(zhí)行行為而必需存于對象之中的數(shù)據(jù)、信息。 對象的界面,也可稱之為協(xié)議,是一組對象可以呼應(yīng)的音訊的集合。 音訊是對象通訊的方式,因此也是獲得功能的方式。對象遭到發(fā)給他的音訊后,或者執(zhí)行一個內(nèi)部操作有時成為方法或過程,或者再去調(diào)用其他對象的操作。一切對象都是類的實(shí)例。類是具有一樣特點(diǎn)的對象的集合,或者也可以說,類是可用于產(chǎn)生對象的一個模版。對象呼應(yīng)一個音訊而調(diào)用的方法,由接受該音訊的對象本人決議。 類可以以一種層次構(gòu)造來安排。2021-11-52021-11-5面向?qū)?/p>

10、象程序設(shè)計面向?qū)ο蟪绦蛟O(shè)計第三節(jié) 面向?qū)ο蟮臉?biāo)志參看教材p100-1012021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計第四節(jié) 類與對象一一 類和類定義類和類定義對象和對象定義對象和對象定義初始化問題初始化問題靜態(tài)成員靜態(tài)成員小結(jié)小結(jié)2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計一一 類和類定義類和類定義-1-1、類的聲明、類的聲明 類和對象是面向?qū)ο蟪绦蛟O(shè)計OOP的兩個最根本概念。所謂對象就是客觀事物在計算機(jī)中的籠統(tǒng)描畫;類是對具有類似屬性和行為的一組對象的一致描畫。 類的定義 C+的類是在構(gòu)造體的根底上擴(kuò)展而來的。類是把各種不同類型的數(shù)據(jù)稱為數(shù)據(jù)成

11、員和對數(shù)據(jù)的操作成員函數(shù)組織在一同而構(gòu)成的用戶自定義的數(shù)據(jù)類型。 C+中,類定義包括類闡明和類實(shí)現(xiàn)兩大部分。闡明部分提供了對該類一切數(shù)據(jù)成員和成員函數(shù)的描畫,而實(shí)現(xiàn)部分提供了一切成員函數(shù)的實(shí)現(xiàn)代碼。2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計類定義的普通方式為: class 類名private: 數(shù)據(jù)成員或成員函數(shù) protected: 數(shù)據(jù)成員或成員函數(shù) public: 數(shù)據(jù)成員或成員函數(shù); /留意:此處分號不要少定義類時,當(dāng)未指明成員是哪部分時,默許是屬于private成員,但普通不要采用默許方式。2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計

12、幾點(diǎn)闡明1大括號的部分是類的成員數(shù)據(jù)成員和函數(shù)成員,它們分成三部分,分別由private、public、proctected三個關(guān)鍵字后跟冒號來指定。這三部分可以任何順序出現(xiàn),且在一個類的定義中,這三部分并非必需同時出現(xiàn)。2類的數(shù)據(jù)成員可以使任何數(shù)據(jù)類型;3類的數(shù)據(jù)成員允許運(yùn)用存儲類型static,但其它三種存儲類型不能運(yùn)用;4類中數(shù)據(jù)成員不允許運(yùn)用表達(dá)式進(jìn)展初始化;5類中數(shù)據(jù)成員與成員函數(shù)可用const修飾。6經(jīng)常習(xí)慣地將類定義的闡明部分或者整個定義部分(包含實(shí)現(xiàn)部分)放到一個頭文件中。2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計如:下例中定義描畫圖書的類定義 cla

13、ss Record private: /private成員 char bookname20; /數(shù)據(jù)成員bookname, / 用于表示圖書的稱號 int number; /數(shù)據(jù)成員number,表示圖書編號 public:/public成員 void regist(char *a,int b); /成員函數(shù)regist,用于給 /各數(shù)據(jù)成員賦值 void show(); /成員函數(shù)show,顯示各數(shù)據(jù)成員的值 ;2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計 根據(jù)類的定義,可看出:類是實(shí)現(xiàn)封裝的工具,所謂封裝就是將類的成員按運(yùn)用或存取的方式分類,有條件地限制對類成員的運(yùn)

14、用,而封裝是經(jīng)過public和private與成員函數(shù)實(shí)現(xiàn)的。private的成員構(gòu)成類的內(nèi)部形狀,public的成員那么構(gòu)成與外界通訊的接口,經(jīng)過public的成員函數(shù)來運(yùn)用private的數(shù)據(jù)成員,從而在C+中實(shí)現(xiàn)了封裝。2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計2、類成員的訪問控制 從訪問權(quán)限上來分,類的成員又分為:公有的(public)、私有的(private)和維護(hù)的(protected)三類。 公有的成員用public來闡明,公有部分往往是一些操作(即成員函數(shù)),它是提供應(yīng)用戶的接口功能。這部分成員可以在程序中援用。 私有的成員用private來闡明,私有

15、部分通常是一些數(shù)據(jù)成員,這些成員是用來描畫該類中的對象的屬性的,用戶是無法訪問它們的,只需成員函數(shù)或經(jīng)特殊闡明的函數(shù)才可以援用它們,它們是被用來隱藏的部分。 維護(hù)的成員用protected來闡明,這種成員只需該類的派生類可以訪問,其他的在這個類外不能訪問。維護(hù)類(protected)將在以后引見。2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計Who可以直接訪問Who不能直接訪問目的與用途private本類Public成員函數(shù)、本類維護(hù)成員函數(shù)、類的友元對象數(shù)據(jù)成員普通放在私有部分,實(shí)現(xiàn)信息隱蔽。protected本類公有成員函數(shù)、 本類派生類公有和私有派生成員函數(shù)本類對象

16、、派生類對象便于子類訪問的成員普通放在維護(hù)部分。public本類公有成員函數(shù)、派生類成員函數(shù)、 公有派生類對象私有派生類對象成員函數(shù)普通放在公有部分,實(shí)現(xiàn)共享。類成員的訪問權(quán)限表2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計前往前往類名:私有部分的成員維護(hù)部分的成員公有部分的成員 對于一個無承繼關(guān)系的單一類獨(dú)立類,其訪問權(quán)限可參考以下圖:該類的對象2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計3、類成員函數(shù)的特性 類的成員函數(shù)可以分為內(nèi)聯(lián)函數(shù)和外聯(lián)函數(shù)。內(nèi)聯(lián)函數(shù)是指那些定義在類體內(nèi)的成員函數(shù),即該函數(shù)的函數(shù)體放在類體內(nèi)。而闡明在類體內(nèi),定義在類體外的

17、成員函數(shù)叫外聯(lián)函數(shù)。外聯(lián)函數(shù)的函數(shù)體在類的實(shí)現(xiàn)部分。 引入內(nèi)聯(lián)函數(shù)的目的是為理處理程序中函數(shù)調(diào)用的效率問題。由于內(nèi)聯(lián)函數(shù)在調(diào)用時不是像普通函數(shù)那樣要轉(zhuǎn)去執(zhí)行被調(diào)用函數(shù)的函數(shù)體,執(zhí)行完成后再轉(zhuǎn)回調(diào)用函數(shù)中,執(zhí)行其后語句,而是在調(diào)用函數(shù)處用內(nèi)聯(lián)函數(shù)體的代碼來交換,這樣將會節(jié)省調(diào)用開銷,提高運(yùn)轉(zhuǎn)速度。 2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計 在程序編譯時,編譯器將程序中出現(xiàn)的內(nèi)聯(lián)函數(shù)的調(diào)用表達(dá)式用內(nèi)聯(lián)函數(shù)的函數(shù)體來進(jìn)展交換。顯然,這種做法不會產(chǎn)生轉(zhuǎn)去轉(zhuǎn)回的問題,但是由于在編譯時將函數(shù)休中的代碼被替代到程序中,因此會添加目的程序代碼量,進(jìn)而添加空間開銷,而在時間代銷上不象

18、函數(shù)調(diào)用時那么大,可見它是以目的代碼的添加為代價來換取時間的節(jié)省。 內(nèi)聯(lián)函數(shù)的定義方法 內(nèi)聯(lián)函數(shù)的定義方法與普通函數(shù)一樣,只是在函數(shù)定義的頭前加上關(guān)鍵字inline即可。如: inline int add_int (int x, int y, int z) return x+y+z; 前往前往2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計二二 對象和對象定義對象和對象定義-1-1、對象的創(chuàng)、對象的創(chuàng)建建類是籠統(tǒng)的概念,而對象是詳細(xì)的,類只是一種數(shù)據(jù)類型,而對象是屬于該類數(shù)據(jù)類型的一個變量,占用了各自的存儲單元,每個對象各自具有了該類的一套數(shù)據(jù)成員靜態(tài)成員除外,而一切成員函

19、數(shù)是一切對象共有的。每個對象的函數(shù)成員都經(jīng)過指針指向同一個代碼空間。參看教材p124圖對象的定義格式: 1class 類名 對象1,對象2, ,對象n ; 2類名 對象1,對象2, ,對象n ; 3類名 對象1參數(shù)表, ,對象n 參數(shù)表 ; 如: TDate date1, date2, *Pdate, date31;2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計2、對象成員的運(yùn)用 訪問對象的成員包括讀寫對象的數(shù)據(jù)成員和調(diào)用它的成員函數(shù),其訪問格式是: . 或者 .() 前者用來表示數(shù)據(jù)成員的,后者用來表示成員函數(shù)的。如:上例中已定義了類Record,那么: Record

20、book1,book2; /此處的book1,book2就是Record /類型,也就是類的兩個對象 可參看教材p125程序5-3-1 2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計如上例中,對象的主函數(shù)如下:void main() Record book1,book2; /定義對象book1和book2 /調(diào)用成員函數(shù)regist,給book1的兩個數(shù)據(jù)成員 /bookname和number賦值 book1.regist(“C+編程教程, 1001); /調(diào)用成員函數(shù)regist,給book2的兩個數(shù)據(jù)成員賦值 book2.regist(“C+言語參考, 1002);

21、/調(diào)用成員函數(shù)show,顯示book1對象的數(shù)據(jù)成員 /bookname和number的值 book1.show(); /調(diào)用成員函數(shù)show,顯示book2對象的數(shù)據(jù)成員 /bookname和number的值 book2.show();2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計如改為下面的代碼,那么錯誤:void main() Record book1,book2; /由于bookname和number是類Record的私有成員,在類外不能直接運(yùn)用,即對象不能直接運(yùn)用。 strcpy(book1.bookname,“C+編程教程); book1.number=100

22、1; strcpy(book2.bookname,“C+言語參考); book2.number=1002; book1.show(); book2.show();2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計訪問對象的成員需留意以下幾點(diǎn):訪問對象的成員需留意以下幾點(diǎn):對于類的私有成員,只能經(jīng)過其成員函數(shù)來訪問,不能在類外對私有成員訪問。2. 調(diào)用成員函數(shù)時要在函數(shù)名之前加上對象名和.即可,即先指明對象,再指明成員。也可以采用指向?qū)ο蟮闹羔榿碓L問,但要在函數(shù)名前加上指針變量名和“-。3. 任何對對象私有數(shù)據(jù)的訪問都必需經(jīng)過向?qū)ο蟀l(fā)送音訊來實(shí)現(xiàn),而且所發(fā)送的音訊還必需是該對象

23、可以識別和接受的。在C+中,音訊發(fā)送正是經(jīng)過公有成員函數(shù)的調(diào)用來實(shí)現(xiàn)的。由于類接口隱藏了對象的內(nèi)部細(xì)節(jié),用戶只能經(jīng)過類接口訪問對象,因此,在類設(shè)計中必需提供足夠的公有接口以捕獲對象的全部行為,這正是類設(shè)計中的一個最根本的要求。前往前往2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計3、對象數(shù)組參看教材p305-3062021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計第五節(jié)第五節(jié) 構(gòu)造函數(shù)河析構(gòu)函數(shù)構(gòu)造函數(shù)河析構(gòu)函數(shù) 全局變量和靜態(tài)變量在定義時,將自動賦初值為0;部分變量在定義時,其初始值不固定的。而當(dāng)對象被定義時,由于對象的意義表達(dá)了現(xiàn)實(shí)世界的實(shí)體,所以一

24、旦定義對象,就必需有一個有意義的初始值,在C+中,在定義對象的同時,給該對象初始化的方法就是利用構(gòu)造函數(shù)。下面分別從三個方面講述初始化問題: 1、類中數(shù)據(jù)成員的初始化:構(gòu)造函數(shù)和析構(gòu)函數(shù) 由于在類的定義中不能對數(shù)據(jù)成員初始化,那么類中數(shù)據(jù)成員利用構(gòu)造函數(shù)進(jìn)展初始化。 2、類中常量和援用的初始化:初始化表 3、類中數(shù)據(jù)成員的初始化:初始化表 4、類的對象初始化:拷貝構(gòu)造函數(shù)2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計1、構(gòu)造函數(shù)和析構(gòu)函數(shù) 構(gòu)造函數(shù)和析構(gòu)函數(shù)是在類體中闡明的兩種特殊的成員函數(shù)。構(gòu)造函數(shù)的功能是在創(chuàng)建對象時,運(yùn)用給定的值來將對象初始化。析構(gòu)函數(shù)的功能是用來釋

25、放一個對象的,在對象刪除前,用它來做一些清理任務(wù),它與構(gòu)造函數(shù)的功能正好相反。 下面舉一例子來闡明構(gòu)造函數(shù)和析構(gòu)函數(shù)的特點(diǎn): 程序5-12021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計class TDatepublic: TDate(int y, int m, int d); TDate(); int IsLeapYear(); void Print();private: int year, month, day;2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計/類的實(shí)現(xiàn)部分TDate:TDate(int y, int m, int d) year =

26、y; month = m; day = d; cout構(gòu)造函數(shù)已被調(diào)用。n;TDate:TDate() cout析構(gòu)函數(shù)被調(diào)用。n;int TDate:IsLeapYear() return(year%4=0 & year%100!=0) | (year%400=0);void TDate:Print()coutyear.month.dayendl;2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計構(gòu)造函數(shù)的特點(diǎn)如下: 1) 構(gòu)造函數(shù)是成員函數(shù),函數(shù)體可寫在類體內(nèi),也可定在類體外。2) 構(gòu)造函數(shù)是一個特殊的函數(shù), 該函數(shù)的名字與類名一樣; 該函數(shù)不指定類型闡明,它有隱

27、含的前往值,該值由系統(tǒng)內(nèi)部運(yùn)用。 該函數(shù)可以一個參數(shù),也可以有多個參數(shù)。3)可以定義多個構(gòu)造函數(shù)。即構(gòu)造函數(shù)可以重載,也就是可以定義多個參數(shù)個數(shù)不同的函數(shù)。.。 4) 程序中不能直接調(diào)用構(gòu)造函數(shù),在創(chuàng)建對象時系統(tǒng)自動調(diào)用構(gòu)造函數(shù)。2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計析構(gòu)函數(shù)的特點(diǎn)如下:1析構(gòu)函數(shù)是成員函數(shù),函數(shù)體可寫在類體內(nèi),也可定在類體外。2析構(gòu)函數(shù)也是一個特殊的函數(shù) 它的名字同類名,并在前面加“字符,用來與構(gòu)造函數(shù)加以區(qū)別; 析構(gòu)函數(shù)不指定數(shù)據(jù)類型,并且也沒有參數(shù)。3一個類中只能夠定義一個析構(gòu)函數(shù)。4析構(gòu)函數(shù)可以被調(diào)用,也可以系統(tǒng)調(diào)用。在下面兩種情況下,析構(gòu)

28、函數(shù)會被自動調(diào)用。 假設(shè)一個對象被定義在一個函數(shù)體內(nèi),那么當(dāng)這個函數(shù)終了時,該對象的析構(gòu)函數(shù)被自動調(diào)用。 當(dāng)一個對象是運(yùn)用new運(yùn)算符被動態(tài)創(chuàng)建的,在運(yùn)用delete運(yùn)算符釋放它時,delete將會自動調(diào)用析構(gòu)函數(shù)。2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計缺省構(gòu)造函數(shù)和缺省析構(gòu)函數(shù)缺省構(gòu)造函數(shù)和缺省析構(gòu)函數(shù) 在類定義時沒有定義任何構(gòu)造函數(shù)時,那么編譯器自動生成一個不帶參數(shù)的缺省構(gòu)造函數(shù),其格式如下: :() 同理,假設(shè)一個類中沒有定義析構(gòu)函數(shù)時,那么編譯系統(tǒng)也生成一個稱為缺省析構(gòu)函數(shù),缺省析構(gòu)函數(shù)是一個空函數(shù),其格式如下: : 2021-11-52021-11-5面

29、向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計2、類中常量和援用的初始化 上一小節(jié)講述了運(yùn)用析構(gòu)函數(shù)對數(shù)據(jù)成員變量的初始化,那么如何初始化常量和援用?運(yùn)用初始化表,留意在類定義中不能直接用。前往前往#includeclass initi_data private: int x; int ℞ const float pi; public: initi_data(int x1):rx(x),pi(3.14) x=x1; void display ( ) cout x= x , rx= rx , pi= pi endl; ; void main( ) initi_data ob(100); ob.di

30、splay( ); 結(jié)果:結(jié)果: x= 100, rx=100, pi=3.14那么,從左邊例子中可以看出,初始化表的格式:析構(gòu)函數(shù):援用名變量,常量名常數(shù), 2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計3、類中對象成員的初始化1. 對象成員的概念 C+中允許將一個已定義的類的對象作為另一個類的數(shù)據(jù)成員,這稱為類的組合。當(dāng)一個類的成員是某一個類的對象時,那么稱該對象為對象成員或子對象)。如:class A ;class Bprivate: A a; public: ; 在類中出現(xiàn)了子對象或稱對象成員時,該類的構(gòu)造函數(shù)要包含對子對象的初始化,通常采用成員初始化表的方法來初

31、始化子對象。在成員初始化表中包含對子對象的初始化和對類中其他成員的初始化。下面舉一例子闡明成員初始化的構(gòu)造。2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計#include class A private: int A1, A2; public: A(int i, int j) A1=i; A2=j; void print() coutA1“,A2endl; ;class Bprivate: A a; /對象成員 int b;public: B(int i, int j, int k):a(i, j), b(k) void print();void B:print() a.

32、print(); coutbendl;void main() B b(6, 7, 8); b.print();該程序的輸出結(jié)果為: 6,7 82021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計其中,a(i, j), b(k)是成員初始化表,它有二項,前一項為哪一項給子對象a初始化,其格式如下: () 后一項為哪一項給類B的數(shù)據(jù)成員b初始化。這一項也可以寫在構(gòu)造函數(shù)的函數(shù)體內(nèi),運(yùn)用賦值表達(dá)式語句b = k; 給類B的數(shù)據(jù)成員初始化。2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計4、類的對象初始化 拷貝構(gòu)造函數(shù)是C+中引入的一種新的構(gòu)造函數(shù)。定義一個拷貝構(gòu)造

33、函數(shù)的方式是: 類名const 類名 &方式參數(shù) 函數(shù)體 由此可看出: 1拷貝構(gòu)造函數(shù)的稱號與類的稱號一樣,且它只需一個參數(shù),該參數(shù)就是對該類對象的援用。 2拷貝構(gòu)造函數(shù)的功能是用于實(shí)現(xiàn)對象值的拷貝,經(jīng)過將一個同類對象的值拷貝給一個新對象,來完成對新對象的初始化,即用一個對象去構(gòu)造另外一個對象。2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計 在下述三種情況下,需求用拷貝初始化構(gòu)造函數(shù)來用一個對象初始化另一個對象。 1明確表示由一個對象初始化另一個對象時,如:TPoint P2(P1); 2當(dāng)對象作為函數(shù)實(shí)參傳送給函數(shù)形參時,如:上例 P = f(N); 3當(dāng)對象用

34、為函數(shù)前往值時。 假設(shè)類中沒有闡明拷貝初始化構(gòu)造函數(shù),那么編譯系統(tǒng)自動生成一個具有上術(shù)方式的缺省拷貝初始化構(gòu)造函數(shù)。作為該類的公有成員。2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計實(shí)例 Example是一個人員信息類。用普通構(gòu)造函數(shù)生成obj1,用拷貝構(gòu)造函數(shù)生成obj2。 # include # include class Example private: char *name; int num; public: example(int i, char *str ) / 構(gòu)造函數(shù)定義 name=str; num=i; 2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)

35、計面向?qū)ο蟪绦蛟O(shè)計example(const Example &x) / 拷貝構(gòu)造函數(shù)定義 num=x.num; void list() / 定義顯示函數(shù)list cout數(shù)據(jù)成員num的值=numendlendl; ;void main () example obj1(215, “張立三); /調(diào)用函數(shù)Example(int i,char *str )構(gòu)造obj1 example obj2(obj1); /運(yùn)用拷貝構(gòu)造函數(shù)構(gòu)造obj2 obj2.list(); /顯示obj2的值 /其它程序部分 2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計程序的執(zhí)行結(jié)果是:數(shù)

36、據(jù)成員num的值=215數(shù)據(jù)成員num的值=215闡明:1上例中在main函數(shù)中的語句Example obj2(obj1);在執(zhí)行時,系統(tǒng)會自動調(diào)用類Example的拷貝構(gòu)造函數(shù)完成對obj2對象的構(gòu)造。2假設(shè)程序員沒有為所設(shè)計的類提供顯式的拷貝構(gòu)造函數(shù),那么系統(tǒng)會自動提供一個默許的拷貝構(gòu)造函數(shù),其功能是:把作為參數(shù)的對象的數(shù)據(jù)成員逐個拷貝到目的變量中,這稱為成員級復(fù)制或淺拷貝。前往前往2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計第六節(jié) 類的組合 2021-11-52021-11-5面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計第七節(jié) 類模板 模板就是使程序可以對不同類型的數(shù)據(jù)進(jìn)展一樣方式的處置。C+中的模板分為類模板

溫馨提示

  • 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

提交評論