《面向?qū)ο蟪绦蛟O(shè)計》教案_第1頁
《面向?qū)ο蟪绦蛟O(shè)計》教案_第2頁
《面向?qū)ο蟪绦蛟O(shè)計》教案_第3頁
《面向?qū)ο蟪绦蛟O(shè)計》教案_第4頁
《面向?qū)ο蟪绦蛟O(shè)計》教案_第5頁
已閱讀5頁,還剩102頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、精選文檔 教 案分 院 (部) 信息學(xué)院 教 研 室 計算機科學(xué)與技術(shù)課 程 名 稱 面向?qū)ο蟪绦蛟O(shè)計教 師 姓 名 金淑娟 職 稱 講 師 使 用 教 材 C+語言程序設(shè)計 教 務(wù) 處 制授課內(nèi)容:第一章 面向?qū)ο蟪绦蛟O(shè)計概念授課時數(shù)6教學(xué)目的及要求:了解:程序設(shè)計方法的發(fā)展過程,面向?qū)ο笳Z言的特點。掌握:面向?qū)ο蟮母拍?,面向?qū)ο蟮某绦蜷_發(fā)過程。教學(xué)基本內(nèi)容:程序設(shè)計方法的發(fā)展過程;面向?qū)ο蟪绦蛟O(shè)計的基本思想及概念,面向?qū)ο蟪绦蛟O(shè)計的要點及開發(fā)過程。重點及難點:面向?qū)ο蟮母拍?,面向?qū)ο蟮某绦蜷_發(fā)過程。教學(xué)方法:講授法 討論法 自學(xué)指導(dǎo)法 其他 教學(xué)手段:多媒體 實物 模型 掛圖 音像 其他板

2、書設(shè)計:討論、思考題、作業(yè):1 敘述面向?qū)ο蠡舅枷氲奶攸c。2 敘述面向?qū)ο蟮某绦蛟O(shè)計方法與傳統(tǒng)面向過程的程序設(shè)計方法有何不同。3 什么是類,什么是對象,類和對象是怎樣的關(guān)系?4 抽象包括哪兩方面的含義?5 什么是封裝,它具有怎樣的特點?6 什么是多態(tài)?多態(tài)的實現(xiàn)方式及作用有哪些?7 什么叫對象的封裝性?什么叫信息隱藏?C+語言是怎樣實現(xiàn)信息隱藏的?8 什么叫繼承?什么叫派生?9 什么叫多態(tài)性?多態(tài)性主要有哪幾種?10. 什么叫運行時的多態(tài)性?C+語言中是怎樣實現(xiàn)運行時的多態(tài)性的?參考資料(含參考書目、文獻(xiàn)等):1、Harvey M.Deitel及Paul James Deitel著,C+大學(xué)

3、教程(第三版),電子工業(yè)出版社。2、劉正林,面向?qū)ο蟪绦蛟O(shè)計,華中科技大學(xué)出版社。3、周生炳等,面向?qū)ο蟪绦蛟O(shè)計,清華大學(xué)出版社。4、揣錦華,面向?qū)ο蟪绦蛟O(shè)計與VC+實踐,西安電子科技大學(xué)出版社。5、王育堅編,面向?qū)ο缶幊探坛? 清華大學(xué)出版社。6、王萍編著,C+面向?qū)ο蟪绦蛟O(shè)計, 清華大學(xué)出版社出版。7、徐孝凱等編,面向?qū)ο蟪绦蛟O(shè)計實驗, 中央廣播電視大學(xué)出版社出版。 第一節(jié) 面向?qū)ο蟮姆椒ㄒ弧⒚嫦驅(qū)ο蟮恼Z言出發(fā)點:更直接地描述客觀世界中存在的事物(對象)以及它們之間的關(guān)系。特點:是高級語言。將客觀事物看作具有屬性和行為的對象。通過抽象找出同一類對象的共同屬性和行為,形成類。通過類的繼承與多

4、態(tài)實現(xiàn)代碼重用。優(yōu)點:使程序能夠比較直接地反問題域的本來面目,軟件開發(fā)人員能夠利用人類認(rèn)識事物所采用的一般思維方法來進(jìn)行軟件開發(fā)。二、程序設(shè)計方法的發(fā)展歷程1面向過程的程序設(shè)計方法程序的目的:用于數(shù)學(xué)計算。主要工作:設(shè)計求解問題的過程。缺點:對于龐大、復(fù)雜的程序難以開發(fā)和維護。2面向過程的結(jié)構(gòu)化程序設(shè)計方法設(shè)計思路:自頂向下、逐步求精。采用模塊分解與功能抽象,自頂向下、分而治之。程序結(jié)構(gòu):按功能劃分為若干個基本模塊,形成一個樹狀結(jié)構(gòu)。各模塊間的關(guān)系盡可能簡單,功能上相對獨立;每一模塊內(nèi)部均是由順序、選擇和循環(huán)三種基本結(jié)構(gòu)組成。其模塊化實現(xiàn)的具體方法是使用子程序。優(yōu)點:有效地將一個較復(fù)雜的程序系

5、統(tǒng)設(shè)計任務(wù)分解成許多易于控制和處理的子任務(wù),便于開發(fā)和維護。缺點:可重用性差、數(shù)據(jù)安全性差、難以開發(fā)大型軟件和圖形界面的應(yīng)用軟件。具體有以下幾點: 把數(shù)據(jù)和處理數(shù)據(jù)的過程分離為相互獨立的實體。 當(dāng)數(shù)據(jù)結(jié)構(gòu)改變時,所有相關(guān)的處理過程都要進(jìn)行相應(yīng)的修改。 每一種相對于老問題的新方法都要帶來額外的開銷,程序的可重用性差。 圖形用戶界面的應(yīng)用程序,很難用過程來描述和實現(xiàn),開發(fā)和維護也都很困難。3面向?qū)ο蟮姆椒?方法: 將數(shù)據(jù)及對數(shù)據(jù)的操作方法封裝在一起,作為一個相互依存、不可分離的整體對象。 對同類型對象抽象出其共性,形成類。 類通過一個簡單的外部接口,與外界發(fā)生關(guān)系。 對象與對象之間通過消息進(jìn)行通訊

6、。優(yōu)點: 程序模塊間的關(guān)系更為簡單,程序模塊的獨立性、數(shù)據(jù)的安全性就有了良好的保障。 通過繼承與多態(tài)性,可以大大提高程序的可重用性,使得軟件的開發(fā)和維護都更為方便。 三、面向?qū)ο蟮幕靖拍?一般意義上的對象: 是現(xiàn)實世界中一個實際存在的事物。 可以是有形的(比如一輛汽車),也可以是無形的(比如一項計劃)。 是構(gòu)成世界的一個獨立單位,具有: 靜態(tài)特征-可以用某種數(shù)據(jù)來描述 動態(tài)特征-對象所表現(xiàn)的行為或具有的功能2 面向?qū)ο蠓椒ㄖ械膶ο螅?是系統(tǒng)中用來描述客觀事物的一個實體,它是用來構(gòu)成系統(tǒng)的一個基本單位。對象由一組屬性和一組行為構(gòu)成。 屬性-用來描述對象靜態(tài)特征的數(shù)據(jù)項。 行為-用來描述對象動態(tài)

7、特征的操作序列。3分類所依據(jù)的原則抽象 忽略事物的非本質(zhì)特征,只注意那些與當(dāng)前目標(biāo)有關(guān)的本質(zhì)特征,從而找出事物的共性,把具有共同性質(zhì)的事物劃分為一類,得出一個抽象的概念。例如,石頭、樹木、汽車、分類人類通常的思維方法。 房屋等都是人們在長期的生產(chǎn)和生活實踐中抽象出的概念。4面向?qū)ο蠓椒ㄖ械念?具有相同屬性和服務(wù)的一組對象的集合。 為屬于該類的全部對象提供了抽象的描述,包括屬性和行為兩個主要部分。 類與對象的關(guān)系:猶如模具與鑄件之間的關(guān)系,一個屬于某類的對象稱為該類的一個實例。5 面向?qū)ο蠓椒ㄖ械姆庋b 把對象的屬性和服務(wù)結(jié)合成一個獨立的系統(tǒng)單元。 盡可能隱蔽對象的內(nèi)部細(xì)節(jié)。對外形成一個邊界(或者

8、說一道屏障),只保留有限的對外接口使之與外部發(fā)生聯(lián)系。6面向?qū)ο蠓椒ㄖ械睦^承 繼承對于軟件復(fù)用有著重要意義,是面向?qū)ο蠹夹g(shù)能夠提高軟件開發(fā)效率的重要原因之一。 定義:特殊類的對象擁有其一般類的全部屬性與服務(wù),稱作特殊類對一般類的繼承。例如:將輪船作為一個一般類,客輪便是一個特殊類。7 面向?qū)ο蠓椒ㄖ械亩鄳B(tài)性 多態(tài)是指在一般類中定義的屬性或行為,被特殊類繼承之后,可以具有不同的數(shù)據(jù)類型或表現(xiàn)出不同的行為。這使得同一個屬性或行為在一般類及其各個特殊類中具有不同的語義。例如:數(shù)的加法-實數(shù)的加法-復(fù)數(shù)的加法第二節(jié) 面向?qū)ο蟮能浖_發(fā)面向?qū)ο蟮能浖こ蹋ㄜ浖_發(fā))是面向?qū)ο蠓椒ㄔ谲浖こ填I(lǐng)域的全面應(yīng)用

9、。它包括: 面向?qū)ο蟮姆治觯∣OA) 面向?qū)ο蟮脑O(shè)計(OOD) 面向?qū)ο蟮木幊蹋∣OP) 面向?qū)ο蟮臏y試(OOT) 面向?qū)ο蟮能浖S護(OOSM)一、系統(tǒng)分析 系統(tǒng)分析階段應(yīng)該扼要精確地抽象出系統(tǒng)必須做什么,但是不關(guān)心如何去實現(xiàn)。 面向?qū)ο蟮南到y(tǒng)分析,直接用問題域中客觀存在的事物建立模型中的對象,對單個事物及事物之間的關(guān)系,都保留他們的原貌,不做轉(zhuǎn)換,也不打破原有界限而重新組合,因此能夠很好地映射客觀事物。二、設(shè)計 針對系統(tǒng)的一個具體實現(xiàn)運用面向?qū)ο蟮姆椒?。其中包括兩方面的工作?把OOA模型直接搬到OOD,作為OOD的一部分。 針對具體實現(xiàn)中的人機界面、數(shù)據(jù)存儲、任務(wù)管理等因素補充一些與實現(xiàn)

10、有關(guān)的部分。 三、編程OOP工作就是用一種面向?qū)ο蟮木幊陶Z言把OOD模型中的每個成分書寫出來,是面向?qū)ο蟮能浖_發(fā)最終落實的重要階段。四、測試 測試的任務(wù)是發(fā)現(xiàn)軟件中的錯誤。 在面向?qū)ο蟮能浖y試中繼續(xù)運用面向?qū)ο蟮母拍钆c原則來組織測試,以對象的類作為基本測試單位,可以更準(zhǔn)確的發(fā)現(xiàn)程序錯誤并提高測試效率。 五、維護將軟件交付使用后,工作并沒有完結(jié),還要根據(jù)軟件的運行情況和用戶需求,不 斷改進(jìn)系統(tǒng)。使用面向?qū)ο蟮姆椒ㄩ_發(fā)的軟件,其程序與問題域是一致的,因此,在維護階段運用面向?qū)ο蟮姆椒梢源蟠筇岣哕浖S護的效率。 授課內(nèi)容:第二章 類與對象授課時數(shù)18教學(xué)目的及要求:掌握:類定義的方法和存取級別

11、。 掌握:類的成員變量和成員函數(shù)的定義和使用,以及對象的定義。 了解:友元函數(shù)和友元類。 掌握:構(gòu)造函數(shù)和析構(gòu)函數(shù)。 掌握:靜態(tài)類成員變量和成員函數(shù)的定義和使用方法。 掌握:內(nèi)聯(lián)函數(shù)的定義和使用方法。 掌握:對象指針及對象引用的使用。 了解:容器類的定義。 掌握:在函數(shù)中對象傳遞的機制。教學(xué)基本內(nèi)容: 類的聲明,對象的定義,構(gòu)造函數(shù)、析構(gòu)函數(shù),對象指針,對象引用,靜態(tài)成員,友元,標(biāo)識符的作用域,對象數(shù)組,成員對象,對象的存儲類等。重點與難點: 類及類對象的定義,構(gòu)造函數(shù)、析構(gòu)函數(shù)的定義,對象指針及對象引用的使用,容器類的定義。教學(xué)方法:講授法 討論法 自學(xué)指導(dǎo)法 其他 教學(xué)手段:多媒體 實物

12、模型 掛圖 音像 其他板書設(shè)計:討論、思考題:1. 什么是類,什么是對象,類和對象是怎樣的關(guān)系?2敘述靜態(tài)成員和一般成員的區(qū)別。3什么叫友元? 什么叫友元類?什么叫友元函數(shù)?什么叫友元成員函數(shù)? 4敘述友元與類的封裝性之間的關(guān)系。5友元方法有什么優(yōu)點?有什么缺點?作業(yè):見書中第四章練習(xí)參考資料(含參考書目、文獻(xiàn)等):1、Harvey M.Deitel及Paul James Deitel著,C+大學(xué)教程(第三版),電子工業(yè)出版社。2、劉正林,面向?qū)ο蟪绦蛟O(shè)計,華中科技大學(xué)出版社。3、周生炳等,面向?qū)ο蟪绦蛟O(shè)計,清華大學(xué)出版社。4、揣錦華,面向?qū)ο蟪绦蛟O(shè)計與VC+實踐,西安電子科技大學(xué)出版社。5、

13、王育堅編,面向?qū)ο缶幊探坛? 清華大學(xué)出版社。6、王萍編著,C+面向?qū)ο蟪绦蛟O(shè)計, 清華大學(xué)出版社出版。7、徐孝凱等編,面向?qū)ο蟪绦蛟O(shè)計實驗, 中央廣播電視大學(xué)出版社出版。第一節(jié) C+的面向?qū)ο蟮母拍钜?、抽象的概念抽象是對具體對象(問題)進(jìn)行概括,抽出這一類對象的公共性質(zhì)并加以描述的過程。 先注意問題的本質(zhì)及描述,其次是實現(xiàn)過程或細(xì)節(jié)。 數(shù)據(jù)抽象:描述某類對象的屬性或狀態(tài)(對象相互區(qū)別的物理量)。 代碼抽象:描述某類對象的共有的行為特征或具有的功能。 抽象的實現(xiàn):通過類的聲明。二、抽象實例1日期 抽象實例 數(shù)據(jù)抽象:int Year, int Month, int Day 代碼抽象:SetDa

14、te(), /設(shè)置年、月、日IsLeapYear(),/計算某年是否為閏年ShowDate(),/顯示年、月、日的值抽象實例日期類class Datepublic: void SetDate(int y, int m, int d); int IsLeapDate();void ShowDate();private: int Year,Month,Day; 2鐘表 抽象實例-鐘表 數(shù)據(jù)抽象:int Hour, int Minute, int Second代碼抽象:SetTime(), ShowTime()抽象實例鐘表類class Clock public: void SetTime(int N

15、ewH, int New, int NewS); void ShowTime();private: int Hour,Minute,Second; 3抽象實例人數(shù)據(jù)抽象:char *name,char *gender,int age,int id代碼抽象:生物屬性角度:GetCloth(), Eat(), Step(),社會屬性角度:Work(), Promote() ,二、封裝將抽象出的數(shù)據(jù)成員、代碼成員相結(jié)合,將它們視為一個整體。 目的是曾強安全性和簡化編程,使用者不必了解具體的實現(xiàn)細(xì)節(jié),而只需要通過外部接口,以特定的訪問權(quán)限,來使用類的成員。 實現(xiàn)封裝:類聲明中的實例:class Clo

16、ckpublic: void SetTime(int NewH, int NewM, int NewS); void ShowTime();private:int Hour,Minute,Second;三、繼承與派生是C+中支持層次分類的一種機制,允許程序員在保持原有類特性的基礎(chǔ)上,進(jìn)行更具體的說明。實現(xiàn):聲明派生類第七章四、多態(tài)性 多態(tài):同一名稱,不同的功能實現(xiàn)方式。 目的:達(dá)到行為標(biāo)識統(tǒng)一,減少程序中標(biāo)識符的個數(shù)。 實現(xiàn):重載函數(shù)和虛函數(shù)第八章五、c+中的類 類是具有相同屬性和行為的一組對象的集合,它為屬于該類的全部對象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和行為兩個主要部分。 利用類可以實

17、現(xiàn)數(shù)據(jù)的封裝、隱藏、繼承與派生。 利用類易于編寫大型復(fù)雜程序,其模塊化程度比C中采用函數(shù)更高。第二節(jié) 類的定義格式一、類的聲明類是一種用戶自定義類型,聲明形式:class 類名稱 public: 公有成員(外部接口) private: 私有成員 protected: 保護型成員;(1)類的定義格式分為說明部分和實現(xiàn)部分,說明部分用來描述該類中的成員,包括數(shù)據(jù)成員和成員函數(shù),成員函數(shù)使用來對數(shù)據(jù)成員進(jìn)行操作的即“方法”,實現(xiàn)部分用來定義各種成員函數(shù),描述這些成員函數(shù)如何實現(xiàn)隊數(shù)據(jù)成員的操作。(2)類由類頭和類體兩部分組成。類頭由關(guān)鍵字class和類名組成,類名是由用戶定義的標(biāo)識符,類頭用來向便宜

18、系統(tǒng)聲明定義了一個新的class類型;而類體是對類的組織形式進(jìn)行具體的描述,它由訪問限制符(private,protected,public)、數(shù)據(jù)成員和成員函數(shù)組成,整個類體用一對大括號括起來,完整地表達(dá)對類的描述。(3)class允許隱藏內(nèi)部成員,它依靠類定義中的3個訪問限制符publicprivateprotected來確定隱藏的程度,它們將類體分成3 個大部分。(4)類的定義只是定義了某種類的組織形式,類似于結(jié)構(gòu)體的定義,編譯系統(tǒng)并不給class類型的每個數(shù)據(jù)成員分配具體的內(nèi)存空間。二、類成員的訪問控制3個訪問限制符將類體分成3個大部分,每一部分都可以有數(shù)據(jù)成員和成員函數(shù),也可以只有數(shù)

19、據(jù)成員或只有成員函數(shù),但不同的訪問限制符規(guī)定了該部分所具有的訪問權(quán)限。1Public(公有類型的成員) 在關(guān)鍵字public后面聲明,這一部分是透明的,它的數(shù)據(jù)成員和成員函數(shù)是開放的,即可以由本類的成員函數(shù)直接訪問,也可以由任何外部函數(shù)來訪問,它們是類與外部的接口。外部訪問是通過“對象名.公有成員名”進(jìn)行。2Private(私有類型的成員)在關(guān)鍵字private后面聲明,這一部分象一個黑盒子,完全隱藏的。它只允許本類中的成員函數(shù)直接訪問(既在成員函數(shù)體內(nèi)直呼其名寫出成員名),象日期類Date的SetDate( )成員函數(shù)體內(nèi),可以直接寫“year=y;month=m,day=d;”等語句;而類

20、外部的任何函數(shù)都不能訪問。如不允許編寫成”對象名.私有成員名“形式。如果緊跟在類名稱的后面聲明私有成員,則關(guān)鍵字private可以省略。3Protected(保護類型成員)這一部分是半透明的,與private類似,其差別表現(xiàn)在繼承與派生時對派生類的影響不同。它可由本類成員函數(shù)或它的派生類成員函數(shù)直接訪問,而其它的函數(shù)不允許訪問此部分。三、數(shù)據(jù)成員與一般的變量聲明相同,但需要將它放在類的聲明體中。class Clockpublic: void SetTime(int NewH, int NewM, int NewS);/聲明設(shè)置時鐘的成員函數(shù) void ShowTime();/聲明顯示時鐘的成員

21、函數(shù)private: int Hour, Minute, Second;void Clock : SetTime(int NewH, int NewM, int NewS) /設(shè)置時鐘的成員函數(shù)在類體外的實現(xiàn) Hour=NewH; Minute=NewM; Second=NewS;void Clock : ShowTime() /顯示時鐘的成員函數(shù)在類體外的實現(xiàn) coutHour:Minute:Second; 通常,總是將數(shù)據(jù)成員指定為私有的,以實現(xiàn)數(shù)據(jù)隱藏,這些數(shù)據(jù)成員用來描述該類對象的屬性,編程者無法直接訪問它們而隱藏起來。四、成員函數(shù) 1)成員函數(shù)說明 在類中說明原形,可以在類外給出函數(shù)

22、體實現(xiàn),并在函數(shù)名前使用類名加以限定。也可以直接在類中給出函數(shù)體,形成內(nèi)聯(lián)成員函數(shù)。 允許聲明重載函數(shù)和帶默認(rèn)形參值的函數(shù)。(見上面例子中成員函數(shù)的定義) 2)內(nèi)聯(lián)成員函數(shù) 為了提高運行時的效率,對于較簡單的函數(shù)可以聲明為內(nèi)聯(lián)形式。 內(nèi)聯(lián)函數(shù)體中不要有復(fù)雜結(jié)構(gòu)(如循環(huán)語句和switch語句)。 在類中聲明內(nèi)聯(lián)成員函數(shù)的方式: 將函數(shù)體放在類的聲明中。 使用inline關(guān)鍵字。舉例1:class Point public: void Init(int initX,int initY) X=initX; Y=initY; int GetX() return X; int GetY() return

23、 Y; private: int X,Y;舉例2class Point public: void Init(int initX,int initY); int GetX(); int GetY(); private: int X,Y;inline void Point: Init(int initX,int initY) X=initX; Y=initY;inline int Point:GetX() return X;inline int Point:GetY() return Y;一般將成員函數(shù)指定為公有的,作為該類對象訪問私有數(shù)據(jù)成員的一個接口界面,即對象訪問私有數(shù)據(jù)成員的一條消息通道提

24、供給外界使用。因此,一個類的對象只能通過公有成員函數(shù)訪問它的私有數(shù)據(jù)成員,從而隱藏了處理這些數(shù)據(jù)的具體實現(xiàn)細(xì)節(jié),使得類對數(shù)據(jù)的描述和類提供給外界來處理數(shù)據(jù)的界面互相獨立,這就給出了面向?qū)ο蟮闹匾匦浴H缛掌陬怐ate封裝在一個程序?qū)嶓w內(nèi)(定義日期類Date的程序代碼),將它的私有數(shù)據(jù)成員year ,month,day 等隱藏起來,不讓對象隨意訪問,對象要訪問這些私有數(shù)據(jù)成員,也只有通過公有的成員函數(shù)SetDate()、IsLeapYear()和PrintDate()等才能實現(xiàn)。舉例:Counter類用類定義一個計數(shù)器的抽象數(shù)據(jù)類型,計數(shù)器允許的取值范圍為04294967295的正整數(shù),可進(jìn)行的

25、操作是計數(shù)器加1、減1和讀計數(shù)器的值。數(shù)據(jù)抽象:int value;代碼抽象:Counter( );/給計數(shù)器賦初值 Increament( );/在計數(shù)器允許取值范圍內(nèi)對計數(shù)器加1 Decrement( );/ 在計數(shù)器允許取值范圍內(nèi)對計數(shù)器減1 ReadValue( );/讀計數(shù)器的值 Counter( );/撤消Counter類的對象程序?qū)崿F(xiàn):見jsj的11.2#include 第三節(jié) 對象的定義一、對象的定義格式類的對象是該類的某一特定實體,即類類型的變量。 聲明形式類名 對象名;例 Clock myClock; 訪問對象成員類中成員互訪:直接使用成員名。類外訪問:使用“對象名.成員名

26、”方式訪問 public 屬性的成員。類應(yīng)用舉例:#includeusing namespace std;class Clock ./類的聲明略/.類的實現(xiàn)略int main() Clock myClock; myClock.SetTime(8,30,30); myClock.ShowTime();二、對象指針和對象引用的定義格式 1、對象指針 聲明形式類名 *對象指針名;例Point A(5,10);Piont *ptr;ptr=&A; 通過指針訪問對象成員對象指針名-成員名ptr-getx() 相當(dāng)于 (*ptr).getx();對象指針應(yīng)用舉例:int main() Point A(5,

27、10); Point *ptr; ptr=&A; int x; x=ptr-GetX(); coutxendl; return 0; 2、對象引用( 聲明形式類名 &對象名=已存在的同類對象名;/給已有的對象另外取一個別名 例:Point A;Piont &B=A; 通過對象引用訪問對象成員使用“對象引用名.成員名”方式訪問 public屬性 的成員(與使用對象名.成員名方式訪問是等價的)。 舉例說明:#includeusing namespace std;class Clock ./類的聲明略/.類的實現(xiàn)略int main() Clock Clock1; Clock &myClock=Clo

28、ck1;/定義對象引用 myClock.SetTime(8,30,30);/等同于Clock1. etTime(8,30,30); myClock.ShowTime();/等同于Clock1. ShowTime();第四節(jié) 對象的初始化一、構(gòu)造函數(shù) 1、構(gòu)造函數(shù)說明構(gòu)造函數(shù)的作用是在對象被創(chuàng)建時使用特定的值構(gòu)造對象,或者說將對象初始化為一個特定的狀態(tài)。在對象創(chuàng)建時由系統(tǒng)自動調(diào)用。如果程序中未聲明,則系統(tǒng)自動產(chǎn)生出一個默認(rèn)形式的構(gòu)造函數(shù)允許為內(nèi)聯(lián)函數(shù)、重載函數(shù)、帶默認(rèn)形參值的函數(shù)。構(gòu)造函數(shù)舉例:class Clockpublic: Clock (int NewH, int NewM, int N

29、ewS);/構(gòu)造函數(shù) void SetTime(int NewH, int NewM, int NewS); void ShowTime();private: int Hour,Minute,Second;構(gòu)造函數(shù)的實現(xiàn):Clock:Clock(int NewH, int NewM, int NewS) Hour= NewH; Minute= NewM; Second= NewS;建立對象時構(gòu)造函數(shù)的作用:int main() Clock c (0,0,0); /隱含調(diào)用構(gòu)造函數(shù),將初始值作為實參。 c.ShowTime();2、復(fù)制構(gòu)造函數(shù)(拷貝構(gòu)造函數(shù))拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),其

30、形參為本類的對象引用。class 類名 public : 類名(形參);/構(gòu)造函數(shù) 類名(類名 &對象名);/拷貝構(gòu)造函數(shù) .;類名: 類名(類名 &對象名)/拷貝構(gòu)造函數(shù)的實現(xiàn) 函數(shù)體 拷貝構(gòu)造函數(shù)舉例1:class Point public: Point(int xx=0,int yy=0)X=xx; Y=yy; Point(Point& p); int GetX() return X; int GetY() return Y; private: int X,Y;Point:Point (Point& p) X=p.X; Y=p.Y; cout拷貝構(gòu)造函數(shù)被調(diào)用endl;復(fù)制構(gòu)造函數(shù)舉例2

31、:當(dāng)用類的一個對象去初始化該類的另一個對象時系統(tǒng)自動調(diào)用拷貝構(gòu)造函數(shù)實現(xiàn)拷貝賦值。int main() Point A(1,2); Point B(A); /拷貝構(gòu)造函數(shù)被調(diào)用 coutB.GetX()endl;復(fù)制構(gòu)造函數(shù)舉例3:若函數(shù)的形參為類對象,調(diào)用函數(shù)時,實參賦值給形參,系統(tǒng)自動調(diào)用拷貝構(gòu)造函數(shù)。例如:void fun1(Point p) coutp.GetX()endl; int main() Point A(1,2); fun1(A); /調(diào)用拷貝構(gòu)造函數(shù) 復(fù)制構(gòu)造函數(shù)舉例4: 當(dāng)函數(shù)的返回值是類對象時,系統(tǒng)自動調(diào)用拷貝構(gòu)造函數(shù)。例如:Point fun2() Point A(1

32、,2); return A; /調(diào)用拷貝構(gòu)造函數(shù)int main() Point B; B=fun2(); 如果程序員沒有為類聲明拷貝初始化構(gòu)造函數(shù),則編譯器自己生成一個拷貝構(gòu)造函數(shù)。這個構(gòu)造函數(shù)執(zhí)行的功能是:用作為初始值的對象的每個數(shù)據(jù)成員的值,初始化將要建立的對象的對應(yīng)數(shù)據(jù)成員。二、析構(gòu)函數(shù)完成對象被刪除前的一些清理工作。在對象的生存期結(jié)束的時刻系統(tǒng)自動調(diào)用它,然后再釋放此對象所屬的空間。如果程序中未聲明析構(gòu)函數(shù),編譯器將自動產(chǎn)生一個默認(rèn)的析構(gòu)函數(shù)。 構(gòu)造函數(shù)和析構(gòu)函數(shù)舉例:#includeusing namespace std;class Point public: Point(int

33、xx,int yy); Point(); /.其它函數(shù)原形 private: int X,int Y;Point:Point(int xx,int yy) X=xx; Y=yy;Point:Point()/.其它函數(shù)的實現(xiàn)略類的應(yīng)用舉例:一圓型游泳池如圖所示,現(xiàn)在需在其周圍建一圓型過道,并在其四周圍上柵欄。柵欄價格為35元/米,過道造價為20元/平方米。過道寬度為3米,游泳池半徑由鍵盤輸入。要求編程計算并輸出過道和柵欄的造價。#include using namespace std;const float PI = 3.14159;const float FencePrice = 35;con

34、st float ConcretePrice = 20;/聲明類Circle 及其數(shù)據(jù)和方法class Circle private: float radius; public: Circle(float r); /構(gòu)造函數(shù) float Circumference() const; /圓周長 float Area() const; /圓面積;/ 類的實現(xiàn)/ 構(gòu)造函數(shù)初始化數(shù)據(jù)成員radiusCircle:Circle(float r)radius=r/ 計算圓的周長float Circle:Circumference() const return 2 * PI * radius;/ 計算圓的面

35、積 float Circle:Area() const return PI * radius * radius;void main () float radius; float FenceCost, ConcreteCost; / 提示用戶輸入半徑 coutradius; / 聲明 Circle 對象 Circle Pool(radius); Circle PoolRim(radius + 3); / 計算柵欄造價并輸出 FenceCost = PoolRim.Circumference() * FencePrice; cout Fencing Cost is ¥ FenceCost endl

36、; / 計算過道造價并輸出 ConcreteCost = (PoolRim.Area() - Pool.Area()*ConcretePrice; cout Concrete Cost is ¥ ConcreteCost X=xx;this-Y=yy; 2、指向類的非靜態(tài)成員的指針通過指向成員的指針只能訪問公有成員。1)聲明指向成員的指針聲明指向公有數(shù)據(jù)成員的指針。類型說明符 類名:*指針名;聲明指向公有函數(shù)成員的指針)類型說明符 (類名:*指針名)(參數(shù)表);指向數(shù)據(jù)成員的指針(說明指針應(yīng)該指向哪個成員)指針名=&類名:數(shù)據(jù)成員名;2)通過對象名(或?qū)ο笾羔槪┡c成員指針結(jié)合來訪問數(shù)據(jù)成員對象

37、名.* 類成員指針名或: 對象指針名*類成員指針名 指向函數(shù)成員的指針初始化指針名=類名:函數(shù)成員名;3)通過對象名(或?qū)ο笾羔槪┡c成員指針結(jié)合來訪問函數(shù)成員(對象名.* 類成員指針名)(參數(shù)表)或:(對象指針名*類成員指針名)(參數(shù)表)舉例說明:訪問對象的公有成員函數(shù)的不同方式int main()/主函數(shù)Point A(4,5);/聲明對象APoint *p1=&A;/聲明對象指針并初始化 /聲明成員函數(shù)指針并初始化int (Point:*p_GetX)()=Point:GetX; /(1)使用成員函數(shù)指針訪問成員函數(shù)cout(A.*p_GetX)()endl; /(2)使用對象指針訪問成員

38、函數(shù)coutGetX)()endl; /(3)使用對象名訪問成員函數(shù) coutA.GetX()endl; 3、指向類的靜態(tài)成員的指針 對類的靜態(tài)成員的訪問不依賴于對象 可以用普通的指針來指向和訪問靜態(tài)成員例6-14通過指針訪問類的靜態(tài)數(shù)據(jù)成員#include using namespace std;class Point/Point類聲明public:/外部接口Point(int xx=0, int yy=0) X=xx;Y=yy;countP+;/構(gòu)造函數(shù)Point(Point &p);/拷貝構(gòu)造函數(shù)int GetX() return X;int GetY() return Y;static

39、 int countP;/靜態(tài)數(shù)據(jù)成員引用性說明private:/私有數(shù)據(jù)成員int X,Y;Point:Point(Point &p)X=p.X; Y=p.Y; countP+; int Point:countP=0;/靜態(tài)數(shù)據(jù)成員定義性說明int main()/主函數(shù) /聲明一個int型指針,指向類的靜態(tài)成員int *count=&Point:countP; Point A(4,5);/聲明對象AcoutPoint A,A.GetX(),A.GetY(); /直接通過指針訪問靜態(tài)數(shù)據(jù)成員cout Object id=*countendl;Point B(A);/聲明對象BcoutPoint

40、 B,B.GetX() ,B.GetY(); /直接通過指針訪問靜態(tài)數(shù)據(jù)成員cout Object id=*countendl; 例6-15通過指針訪問類的靜態(tài)函數(shù)成員#include using namespace std;class Point/Point類聲明 public:/外部接口/其它函數(shù)略static void GetC() /靜態(tài)函數(shù)成員 cout Object id=countPendl; private:/私有數(shù)據(jù)成員int X,Y;static int countP;/靜態(tài)數(shù)據(jù)成員引用性說明;/ 函數(shù)實現(xiàn)略int Point:countP=0;/靜態(tài)數(shù)據(jù)成員定義性說明in

41、t main()/主函數(shù) /指向函數(shù)的指針,指向類的靜態(tài)成員函數(shù)void (*gc)()=Point:GetC;Point A(4,5);/聲明對象AcoutPoint A,A.GetX(),A.GetY();gc(); /輸出對象序號,通過指針訪問靜態(tài)函數(shù)成員Point B(A);/聲明對象BcoutPoint B,B.GetX(),B.GetY();gc(); /輸出對象序號,通過指針訪問靜態(tài)函數(shù)成員四、遞歸類第六節(jié) 動態(tài)內(nèi)存分配一、動態(tài)申請內(nèi)存操作符 new new 類型名T(初值列表)功能:在程序執(zhí)行期間,申請用于存放T類型對象的內(nèi)存空間,并依初值列表賦以初值。結(jié)果值:成功:T類型的指

42、針,指向新分配的內(nèi)存。失?。?(NULL)二、釋放內(nèi)存操作符delete delete 指針P功能:釋放指針P所指向的內(nèi)存。P必須是new操作的返回值。例6-16 動態(tài)創(chuàng)建對象舉例#includeusing namespace std;class Point public: Point() X=Y=0; coutDefault Constructor called.n; Point(int xx,int yy) X=xx; Y=yy; cout Constructor called.n; Point() coutDestructor called.n; int GetX() return X;

43、 int GetY() return Y; void Move(int x,int y) X=x; Y=y; private: int X,Y;int main() coutStep One:endl; Point *Ptr1=new Point; delete Ptr1; coutStep Two:endl; Ptr1=new Point(1,2); delete Ptr1; return 0;運行結(jié)果:Step One:Default Constructor called.Destructor called.Step Two:Constructor called.Destructor ca

44、lled.三、淺拷貝與深拷貝 淺拷貝 實現(xiàn)對象間數(shù)據(jù)元素的一一對應(yīng)復(fù)制。 深拷貝 當(dāng)被復(fù)制的對象數(shù)據(jù)成員是指針類型時,不是復(fù)制該指針成員本身,而是將指針?biāo)傅膶ο筮M(jìn)行復(fù)制。 例6-20對象的淺拷貝 #includeusing namespace std;class Point /類的聲明同例6-16 /;class ArrayOfPoints /類的聲明同例6-18 /;int main()int number;cinnumber; ArrayOFPoints pointsArray1(number); pointsArray1.Element(0).Move(5,10); pointsArr

45、ay1.Element(1).Move(15,20); ArrayOfPoints pointsArray2(pointsArray1); coutCopy of pointsArray1:endl; coutPoint_0 of array2: pointsArray2.Element(0).GetX() , pointsArray2.Element(0).GetY()endl; coutPoint_1 of array2: pointsArray2.Element(1).GetX() , pointsArray2.Element(1).GetY()endl;pointsArray1.Ele

46、ment(0).Move(25,30); pointsArray1.Element(1).Move(35,40); coutAfter the moving of pointsArray1:endl; coutPoint_0 of array2: pointsArray2.Element(0).GetX() , pointsArray2.Element(0).GetY()endl; coutPoint_1 of array2: pointsArray2.Element(1).GetX() , pointsArray2.Element(1).GetY()endl;運行結(jié)果如下:Please enter the number of points:2Default Constructor called.Default Constructor called.Copy of pointsArray1:Point_0 of array2: 5, 10Point_1 of array2: 15, 20After the moving of pointsArray1:Point_0 of array2: 25, 30Poi

溫馨提示

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

最新文檔

評論

0/150

提交評論