《面向?qū)ο蟪绦蛟O(shè)計(jì)》教案.doc
《《面向?qū)ο蟪绦蛟O(shè)計(jì)》教案.doc》由會(huì)員分享,可在線閱讀,更多相關(guān)《《面向?qū)ο蟪绦蛟O(shè)計(jì)》教案.doc(104頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
教 案分 院 (部) 信息學(xué)院 教 研 室 計(jì)算機(jī)科學(xué)與技術(shù)課 程 名 稱 面向?qū)ο蟪绦蛟O(shè)計(jì)教 師 姓 名 金淑娟 職 稱 講 師 使 用 教 材 C+語(yǔ)言程序設(shè)計(jì) 教 務(wù) 處 制授課內(nèi)容:第一章 面向?qū)ο蟪绦蛟O(shè)計(jì)概念授課時(shí)數(shù)6教學(xué)目的及要求:了解:程序設(shè)計(jì)方法的發(fā)展過(guò)程,面向?qū)ο笳Z(yǔ)言的特點(diǎn)。掌握:面向?qū)ο蟮母拍?,面向?qū)ο蟮某绦蜷_發(fā)過(guò)程。教學(xué)基本內(nèi)容:程序設(shè)計(jì)方法的發(fā)展過(guò)程;面向?qū)ο蟪绦蛟O(shè)計(jì)的基本思想及概念,面向?qū)ο蟪绦蛟O(shè)計(jì)的要點(diǎn)及開發(fā)過(guò)程。重點(diǎn)及難點(diǎn):面向?qū)ο蟮母拍?,面向?qū)ο蟮某绦蜷_發(fā)過(guò)程。教學(xué)方法:講授法 討論法 自學(xué)指導(dǎo)法 其他 教學(xué)手段:多媒體 實(shí)物 模型 掛圖 音像 其他板書設(shè)計(jì):討論、思考題、作業(yè):1 敘述面向?qū)ο蠡舅枷氲奶攸c(diǎn)。2 敘述面向?qū)ο蟮某绦蛟O(shè)計(jì)方法與傳統(tǒng)面向過(guò)程的程序設(shè)計(jì)方法有何不同。3 什么是類,什么是對(duì)象,類和對(duì)象是怎樣的關(guān)系?4 抽象包括哪兩方面的含義?5 什么是封裝,它具有怎樣的特點(diǎn)?6 什么是多態(tài)?多態(tài)的實(shí)現(xiàn)方式及作用有哪些?7 什么叫對(duì)象的封裝性?什么叫信息隱藏?C+語(yǔ)言是怎樣實(shí)現(xiàn)信息隱藏的?8 什么叫繼承?什么叫派生?9 什么叫多態(tài)性?多態(tài)性主要有哪幾種?10. 什么叫運(yùn)行時(shí)的多態(tài)性?C+語(yǔ)言中是怎樣實(shí)現(xiàn)運(yùn)行時(shí)的多態(tài)性的?參考資料(含參考書目、文獻(xiàn)等):1、Harvey M.Deitel及Paul James Deitel著,C+大學(xué)教程(第三版),電子工業(yè)出版社。2、劉正林,面向?qū)ο蟪绦蛟O(shè)計(jì),華中科技大學(xué)出版社。3、周生炳等,面向?qū)ο蟪绦蛟O(shè)計(jì),清華大學(xué)出版社。4、揣錦華,面向?qū)ο蟪绦蛟O(shè)計(jì)與VC+實(shí)踐,西安電子科技大學(xué)出版社。5、王育堅(jiān)編,面向?qū)ο缶幊探坛? 清華大學(xué)出版社。6、王萍編著,C+面向?qū)ο蟪绦蛟O(shè)計(jì), 清華大學(xué)出版社出版。7、徐孝凱等編,面向?qū)ο蟪绦蛟O(shè)計(jì)實(shí)驗(yàn), 中央廣播電視大學(xué)出版社出版。 第一節(jié) 面向?qū)ο蟮姆椒ㄒ?、面向?qū)ο蟮恼Z(yǔ)言出發(fā)點(diǎn):更直接地描述客觀世界中存在的事物(對(duì)象)以及它們之間的關(guān)系。特點(diǎn):是高級(jí)語(yǔ)言。將客觀事物看作具有屬性和行為的對(duì)象。通過(guò)抽象找出同一類對(duì)象的共同屬性和行為,形成類。通過(guò)類的繼承與多態(tài)實(shí)現(xiàn)代碼重用。優(yōu)點(diǎn):使程序能夠比較直接地反問(wèn)題域的本來(lái)面目,軟件開發(fā)人員能夠利用人類認(rèn)識(shí)事物所采用的一般思維方法來(lái)進(jìn)行軟件開發(fā)。二、程序設(shè)計(jì)方法的發(fā)展歷程1面向過(guò)程的程序設(shè)計(jì)方法程序的目的:用于數(shù)學(xué)計(jì)算。主要工作:設(shè)計(jì)求解問(wèn)題的過(guò)程。缺點(diǎn):對(duì)于龐大、復(fù)雜的程序難以開發(fā)和維護(hù)。2面向過(guò)程的結(jié)構(gòu)化程序設(shè)計(jì)方法設(shè)計(jì)思路:自頂向下、逐步求精。采用模塊分解與功能抽象,自頂向下、分而治之。程序結(jié)構(gòu):按功能劃分為若干個(gè)基本模塊,形成一個(gè)樹狀結(jié)構(gòu)。各模塊間的關(guān)系盡可能簡(jiǎn)單,功能上相對(duì)獨(dú)立;每一模塊內(nèi)部均是由順序、選擇和循環(huán)三種基本結(jié)構(gòu)組成。其模塊化實(shí)現(xiàn)的具體方法是使用子程序。優(yōu)點(diǎn):有效地將一個(gè)較復(fù)雜的程序系統(tǒng)設(shè)計(jì)任務(wù)分解成許多易于控制和處理的子任務(wù),便于開發(fā)和維護(hù)。缺點(diǎn):可重用性差、數(shù)據(jù)安全性差、難以開發(fā)大型軟件和圖形界面的應(yīng)用軟件。具體有以下幾點(diǎn): 把數(shù)據(jù)和處理數(shù)據(jù)的過(guò)程分離為相互獨(dú)立的實(shí)體。 當(dāng)數(shù)據(jù)結(jié)構(gòu)改變時(shí),所有相關(guān)的處理過(guò)程都要進(jìn)行相應(yīng)的修改。 每一種相對(duì)于老問(wèn)題的新方法都要帶來(lái)額外的開銷,程序的可重用性差。 圖形用戶界面的應(yīng)用程序,很難用過(guò)程來(lái)描述和實(shí)現(xiàn),開發(fā)和維護(hù)也都很困難。3面向?qū)ο蟮姆椒?方法: 將數(shù)據(jù)及對(duì)數(shù)據(jù)的操作方法封裝在一起,作為一個(gè)相互依存、不可分離的整體對(duì)象。 對(duì)同類型對(duì)象抽象出其共性,形成類。 類通過(guò)一個(gè)簡(jiǎn)單的外部接口,與外界發(fā)生關(guān)系。 對(duì)象與對(duì)象之間通過(guò)消息進(jìn)行通訊。優(yōu)點(diǎn): 程序模塊間的關(guān)系更為簡(jiǎn)單,程序模塊的獨(dú)立性、數(shù)據(jù)的安全性就有了良好的保障。 通過(guò)繼承與多態(tài)性,可以大大提高程序的可重用性,使得軟件的開發(fā)和維護(hù)都更為方便。 三、面向?qū)ο蟮幕靖拍?一般意義上的對(duì)象: 是現(xiàn)實(shí)世界中一個(gè)實(shí)際存在的事物。 可以是有形的(比如一輛汽車),也可以是無(wú)形的(比如一項(xiàng)計(jì)劃)。 是構(gòu)成世界的一個(gè)獨(dú)立單位,具有: 靜態(tài)特征-可以用某種數(shù)據(jù)來(lái)描述 動(dòng)態(tài)特征-對(duì)象所表現(xiàn)的行為或具有的功能2 面向?qū)ο蠓椒ㄖ械膶?duì)象: 是系統(tǒng)中用來(lái)描述客觀事物的一個(gè)實(shí)體,它是用來(lái)構(gòu)成系統(tǒng)的一個(gè)基本單位。對(duì)象由一組屬性和一組行為構(gòu)成。 屬性-用來(lái)描述對(duì)象靜態(tài)特征的數(shù)據(jù)項(xiàng)。 行為-用來(lái)描述對(duì)象動(dòng)態(tài)特征的操作序列。3分類所依據(jù)的原則抽象 忽略事物的非本質(zhì)特征,只注意那些與當(dāng)前目標(biāo)有關(guān)的本質(zhì)特征,從而找出事物的共性,把具有共同性質(zhì)的事物劃分為一類,得出一個(gè)抽象的概念。例如,石頭、樹木、汽車、分類人類通常的思維方法。 房屋等都是人們?cè)陂L(zhǎng)期的生產(chǎn)和生活實(shí)踐中抽象出的概念。4面向?qū)ο蠓椒ㄖ械念?具有相同屬性和服務(wù)的一組對(duì)象的集合。 為屬于該類的全部對(duì)象提供了抽象的描述,包括屬性和行為兩個(gè)主要部分。 類與對(duì)象的關(guān)系:猶如模具與鑄件之間的關(guān)系,一個(gè)屬于某類的對(duì)象稱為該類的一個(gè)實(shí)例。5 面向?qū)ο蠓椒ㄖ械姆庋b 把對(duì)象的屬性和服務(wù)結(jié)合成一個(gè)獨(dú)立的系統(tǒng)單元。 盡可能隱蔽對(duì)象的內(nèi)部細(xì)節(jié)。對(duì)外形成一個(gè)邊界(或者說(shuō)一道屏障),只保留有限的對(duì)外接口使之與外部發(fā)生聯(lián)系。6面向?qū)ο蠓椒ㄖ械睦^承 繼承對(duì)于軟件復(fù)用有著重要意義,是面向?qū)ο蠹夹g(shù)能夠提高軟件開發(fā)效率的重要原因之一。 定義:特殊類的對(duì)象擁有其一般類的全部屬性與服務(wù),稱作特殊類對(duì)一般類的繼承。例如:將輪船作為一個(gè)一般類,客輪便是一個(gè)特殊類。7 面向?qū)ο蠓椒ㄖ械亩鄳B(tài)性 多態(tài)是指在一般類中定義的屬性或行為,被特殊類繼承之后,可以具有不同的數(shù)據(jù)類型或表現(xiàn)出不同的行為。這使得同一個(gè)屬性或行為在一般類及其各個(gè)特殊類中具有不同的語(yǔ)義。例如:數(shù)的加法-實(shí)數(shù)的加法-復(fù)數(shù)的加法第二節(jié) 面向?qū)ο蟮能浖_發(fā)面向?qū)ο蟮能浖こ蹋ㄜ浖_發(fā))是面向?qū)ο蠓椒ㄔ谲浖こ填I(lǐng)域的全面應(yīng)用。它包括: 面向?qū)ο蟮姆治觯∣OA) 面向?qū)ο蟮脑O(shè)計(jì)(OOD) 面向?qū)ο蟮木幊蹋∣OP) 面向?qū)ο蟮臏y(cè)試(OOT) 面向?qū)ο蟮能浖S護(hù)(OOSM)一、系統(tǒng)分析 系統(tǒng)分析階段應(yīng)該扼要精確地抽象出系統(tǒng)必須做什么,但是不關(guān)心如何去實(shí)現(xiàn)。 面向?qū)ο蟮南到y(tǒng)分析,直接用問(wèn)題域中客觀存在的事物建立模型中的對(duì)象,對(duì)單個(gè)事物及事物之間的關(guān)系,都保留他們的原貌,不做轉(zhuǎn)換,也不打破原有界限而重新組合,因此能夠很好地映射客觀事物。二、設(shè)計(jì) 針對(duì)系統(tǒng)的一個(gè)具體實(shí)現(xiàn)運(yùn)用面向?qū)ο蟮姆椒?。其中包括兩方面的工作?把OOA模型直接搬到OOD,作為OOD的一部分。 針對(duì)具體實(shí)現(xiàn)中的人機(jī)界面、數(shù)據(jù)存儲(chǔ)、任務(wù)管理等因素補(bǔ)充一些與實(shí)現(xiàn)有關(guān)的部分。 三、編程OOP工作就是用一種面向?qū)ο蟮木幊陶Z(yǔ)言把OOD模型中的每個(gè)成分書寫出來(lái),是面向?qū)ο蟮能浖_發(fā)最終落實(shí)的重要階段。四、測(cè)試 測(cè)試的任務(wù)是發(fā)現(xiàn)軟件中的錯(cuò)誤。 在面向?qū)ο蟮能浖y(cè)試中繼續(xù)運(yùn)用面向?qū)ο蟮母拍钆c原則來(lái)組織測(cè)試,以對(duì)象的類作為基本測(cè)試單位,可以更準(zhǔn)確的發(fā)現(xiàn)程序錯(cuò)誤并提高測(cè)試效率。 五、維護(hù)將軟件交付使用后,工作并沒(méi)有完結(jié),還要根據(jù)軟件的運(yùn)行情況和用戶需求,不 斷改進(jìn)系統(tǒng)。使用面向?qū)ο蟮姆椒ㄩ_發(fā)的軟件,其程序與問(wèn)題域是一致的,因此,在維護(hù)階段運(yùn)用面向?qū)ο蟮姆椒梢源蟠筇岣哕浖S護(hù)的效率。 授課內(nèi)容:第二章 類與對(duì)象授課時(shí)數(shù)18教學(xué)目的及要求:掌握:類定義的方法和存取級(jí)別。 掌握:類的成員變量和成員函數(shù)的定義和使用,以及對(duì)象的定義。 了解:友元函數(shù)和友元類。 掌握:構(gòu)造函數(shù)和析構(gòu)函數(shù)。 掌握:靜態(tài)類成員變量和成員函數(shù)的定義和使用方法。 掌握:內(nèi)聯(lián)函數(shù)的定義和使用方法。 掌握:對(duì)象指針及對(duì)象引用的使用。 了解:容器類的定義。 掌握:在函數(shù)中對(duì)象傳遞的機(jī)制。教學(xué)基本內(nèi)容: 類的聲明,對(duì)象的定義,構(gòu)造函數(shù)、析構(gòu)函數(shù),對(duì)象指針,對(duì)象引用,靜態(tài)成員,友元,標(biāo)識(shí)符的作用域,對(duì)象數(shù)組,成員對(duì)象,對(duì)象的存儲(chǔ)類等。重點(diǎn)與難點(diǎn): 類及類對(duì)象的定義,構(gòu)造函數(shù)、析構(gòu)函數(shù)的定義,對(duì)象指針及對(duì)象引用的使用,容器類的定義。教學(xué)方法:講授法 討論法 自學(xué)指導(dǎo)法 其他 教學(xué)手段:多媒體 實(shí)物 模型 掛圖 音像 其他板書設(shè)計(jì):討論、思考題:1. 什么是類,什么是對(duì)象,類和對(duì)象是怎樣的關(guān)系?2敘述靜態(tài)成員和一般成員的區(qū)別。3什么叫友元? 什么叫友元類?什么叫友元函數(shù)?什么叫友元成員函數(shù)? 4敘述友元與類的封裝性之間的關(guān)系。5友元方法有什么優(yōu)點(diǎn)?有什么缺點(diǎn)?作業(yè):見書中第四章練習(xí)參考資料(含參考書目、文獻(xiàn)等):1、Harvey M.Deitel及Paul James Deitel著,C+大學(xué)教程(第三版),電子工業(yè)出版社。2、劉正林,面向?qū)ο蟪绦蛟O(shè)計(jì),華中科技大學(xué)出版社。3、周生炳等,面向?qū)ο蟪绦蛟O(shè)計(jì),清華大學(xué)出版社。4、揣錦華,面向?qū)ο蟪绦蛟O(shè)計(jì)與VC+實(shí)踐,西安電子科技大學(xué)出版社。5、王育堅(jiān)編,面向?qū)ο缶幊探坛? 清華大學(xué)出版社。6、王萍編著,C+面向?qū)ο蟪绦蛟O(shè)計(jì), 清華大學(xué)出版社出版。7、徐孝凱等編,面向?qū)ο蟪绦蛟O(shè)計(jì)實(shí)驗(yàn), 中央廣播電視大學(xué)出版社出版。第一節(jié) C+的面向?qū)ο蟮母拍钜?、抽象的概念抽象是?duì)具體對(duì)象(問(wèn)題)進(jìn)行概括,抽出這一類對(duì)象的公共性質(zhì)并加以描述的過(guò)程。 先注意問(wèn)題的本質(zhì)及描述,其次是實(shí)現(xiàn)過(guò)程或細(xì)節(jié)。 數(shù)據(jù)抽象:描述某類對(duì)象的屬性或狀態(tài)(對(duì)象相互區(qū)別的物理量)。 代碼抽象:描述某類對(duì)象的共有的行為特征或具有的功能。 抽象的實(shí)現(xiàn):通過(guò)類的聲明。二、抽象實(shí)例1日期 抽象實(shí)例 數(shù)據(jù)抽象:int Year, int Month, int Day 代碼抽象:SetDate(), /設(shè)置年、月、日IsLeapYear(),/計(jì)算某年是否為閏年ShowDate(),/顯示年、月、日的值抽象實(shí)例日期類class Datepublic: void SetDate(int y, int m, int d); int IsLeapDate();void ShowDate();private: int Year,Month,Day; 2鐘表 抽象實(shí)例-鐘表 數(shù)據(jù)抽象:int Hour, int Minute, int Second代碼抽象:SetTime(), ShowTime()抽象實(shí)例鐘表類class Clock public: void SetTime(int NewH, int New, int NewS); void ShowTime();private: int Hour,Minute,Second; 3抽象實(shí)例人數(shù)據(jù)抽象:char *name,char *gender,int age,int id代碼抽象:生物屬性角度:GetCloth(), Eat(), Step(),社會(huì)屬性角度:Work(), Promote() ,二、封裝將抽象出的數(shù)據(jù)成員、代碼成員相結(jié)合,將它們視為一個(gè)整體。 目的是曾強(qiáng)安全性和簡(jiǎn)化編程,使用者不必了解具體的實(shí)現(xiàn)細(xì)節(jié),而只需要通過(guò)外部接口,以特定的訪問(wèn)權(quán)限,來(lái)使用類的成員。 實(shí)現(xiàn)封裝:類聲明中的實(shí)例:class Clockpublic: void SetTime(int NewH, int NewM, int NewS); void ShowTime();private:int Hour,Minute,Second;三、繼承與派生是C+中支持層次分類的一種機(jī)制,允許程序員在保持原有類特性的基礎(chǔ)上,進(jìn)行更具體的說(shuō)明。實(shí)現(xiàn):聲明派生類第七章四、多態(tài)性 多態(tài):同一名稱,不同的功能實(shí)現(xiàn)方式。 目的:達(dá)到行為標(biāo)識(shí)統(tǒng)一,減少程序中標(biāo)識(shí)符的個(gè)數(shù)。 實(shí)現(xiàn):重載函數(shù)和虛函數(shù)第八章五、c+中的類 類是具有相同屬性和行為的一組對(duì)象的集合,它為屬于該類的全部對(duì)象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和行為兩個(gè)主要部分。 利用類可以實(shí)現(xiàn)數(shù)據(jù)的封裝、隱藏、繼承與派生。 利用類易于編寫大型復(fù)雜程序,其模塊化程度比C中采用函數(shù)更高。第二節(jié) 類的定義格式一、類的聲明類是一種用戶自定義類型,聲明形式:class 類名稱 public: 公有成員(外部接口) private: 私有成員 protected: 保護(hù)型成員;(1)類的定義格式分為說(shuō)明部分和實(shí)現(xiàn)部分,說(shuō)明部分用來(lái)描述該類中的成員,包括數(shù)據(jù)成員和成員函數(shù),成員函數(shù)使用來(lái)對(duì)數(shù)據(jù)成員進(jìn)行操作的即“方法”,實(shí)現(xiàn)部分用來(lái)定義各種成員函數(shù),描述這些成員函數(shù)如何實(shí)現(xiàn)隊(duì)數(shù)據(jù)成員的操作。(2)類由類頭和類體兩部分組成。類頭由關(guān)鍵字class和類名組成,類名是由用戶定義的標(biāo)識(shí)符,類頭用來(lái)向便宜系統(tǒng)聲明定義了一個(gè)新的class類型;而類體是對(duì)類的組織形式進(jìn)行具體的描述,它由訪問(wèn)限制符(private,protected,public)、數(shù)據(jù)成員和成員函數(shù)組成,整個(gè)類體用一對(duì)大括號(hào)括起來(lái),完整地表達(dá)對(duì)類的描述。(3)class允許隱藏內(nèi)部成員,它依靠類定義中的3個(gè)訪問(wèn)限制符publicprivateprotected來(lái)確定隱藏的程度,它們將類體分成3 個(gè)大部分。(4)類的定義只是定義了某種類的組織形式,類似于結(jié)構(gòu)體的定義,編譯系統(tǒng)并不給class類型的每個(gè)數(shù)據(jù)成員分配具體的內(nèi)存空間。二、類成員的訪問(wèn)控制3個(gè)訪問(wèn)限制符將類體分成3個(gè)大部分,每一部分都可以有數(shù)據(jù)成員和成員函數(shù),也可以只有數(shù)據(jù)成員或只有成員函數(shù),但不同的訪問(wèn)限制符規(guī)定了該部分所具有的訪問(wèn)權(quán)限。1Public(公有類型的成員) 在關(guān)鍵字public后面聲明,這一部分是透明的,它的數(shù)據(jù)成員和成員函數(shù)是開放的,即可以由本類的成員函數(shù)直接訪問(wèn),也可以由任何外部函數(shù)來(lái)訪問(wèn),它們是類與外部的接口。外部訪問(wèn)是通過(guò)“對(duì)象名.公有成員名”進(jìn)行。2Private(私有類型的成員)在關(guān)鍵字private后面聲明,這一部分象一個(gè)黑盒子,完全隱藏的。它只允許本類中的成員函數(shù)直接訪問(wèn)(既在成員函數(shù)體內(nèi)直呼其名寫出成員名),象日期類Date的SetDate( )成員函數(shù)體內(nèi),可以直接寫“year=y;month=m,day=d;”等語(yǔ)句;而類外部的任何函數(shù)都不能訪問(wèn)。如不允許編寫成”對(duì)象名.私有成員名“形式。如果緊跟在類名稱的后面聲明私有成員,則關(guān)鍵字private可以省略。3Protected(保護(hù)類型成員)這一部分是半透明的,與private類似,其差別表現(xiàn)在繼承與派生時(shí)對(duì)派生類的影響不同。它可由本類成員函數(shù)或它的派生類成員函數(shù)直接訪問(wèn),而其它的函數(shù)不允許訪問(wèn)此部分。三、數(shù)據(jù)成員與一般的變量聲明相同,但需要將它放在類的聲明體中。class Clockpublic: void SetTime(int NewH, int NewM, int NewS);/聲明設(shè)置時(shí)鐘的成員函數(shù) void ShowTime();/聲明顯示時(shí)鐘的成員函數(shù)private: int Hour, Minute, Second;void Clock : SetTime(int NewH, int NewM, int NewS) /設(shè)置時(shí)鐘的成員函數(shù)在類體外的實(shí)現(xiàn) Hour=NewH; Minute=NewM; Second=NewS;void Clock : ShowTime() /顯示時(shí)鐘的成員函數(shù)在類體外的實(shí)現(xiàn) coutHour:Minute:Second; 通常,總是將數(shù)據(jù)成員指定為私有的,以實(shí)現(xiàn)數(shù)據(jù)隱藏,這些數(shù)據(jù)成員用來(lái)描述該類對(duì)象的屬性,編程者無(wú)法直接訪問(wèn)它們而隱藏起來(lái)。四、成員函數(shù) 1)成員函數(shù)說(shuō)明 在類中說(shuō)明原形,可以在類外給出函數(shù)體實(shí)現(xiàn),并在函數(shù)名前使用類名加以限定。也可以直接在類中給出函數(shù)體,形成內(nèi)聯(lián)成員函數(shù)。 允許聲明重載函數(shù)和帶默認(rèn)形參值的函數(shù)。(見上面例子中成員函數(shù)的定義) 2)內(nèi)聯(lián)成員函數(shù) 為了提高運(yùn)行時(shí)的效率,對(duì)于較簡(jiǎn)單的函數(shù)可以聲明為內(nèi)聯(lián)形式。 內(nèi)聯(lián)函數(shù)體中不要有復(fù)雜結(jié)構(gòu)(如循環(huán)語(yǔ)句和switch語(yǔ)句)。 在類中聲明內(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 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ù)指定為公有的,作為該類對(duì)象訪問(wèn)私有數(shù)據(jù)成員的一個(gè)接口界面,即對(duì)象訪問(wèn)私有數(shù)據(jù)成員的一條消息通道提供給外界使用。因此,一個(gè)類的對(duì)象只能通過(guò)公有成員函數(shù)訪問(wèn)它的私有數(shù)據(jù)成員,從而隱藏了處理這些數(shù)據(jù)的具體實(shí)現(xiàn)細(xì)節(jié),使得類對(duì)數(shù)據(jù)的描述和類提供給外界來(lái)處理數(shù)據(jù)的界面互相獨(dú)立,這就給出了面向?qū)ο蟮闹匾匦?。如日期類Date封裝在一個(gè)程序?qū)嶓w內(nèi)(定義日期類Date的程序代碼),將它的私有數(shù)據(jù)成員year ,month,day 等隱藏起來(lái),不讓對(duì)象隨意訪問(wèn),對(duì)象要訪問(wèn)這些私有數(shù)據(jù)成員,也只有通過(guò)公有的成員函數(shù)SetDate()、IsLeapYear()和PrintDate()等才能實(shí)現(xiàn)。舉例:Counter類用類定義一個(gè)計(jì)數(shù)器的抽象數(shù)據(jù)類型,計(jì)數(shù)器允許的取值范圍為04294967295的正整數(shù),可進(jìn)行的操作是計(jì)數(shù)器加1、減1和讀計(jì)數(shù)器的值。數(shù)據(jù)抽象:int value;代碼抽象:Counter( );/給計(jì)數(shù)器賦初值 Increament( );/在計(jì)數(shù)器允許取值范圍內(nèi)對(duì)計(jì)數(shù)器加1 Decrement( );/ 在計(jì)數(shù)器允許取值范圍內(nèi)對(duì)計(jì)數(shù)器減1 ReadValue( );/讀計(jì)數(shù)器的值 Counter( );/撤消Counter類的對(duì)象程序?qū)崿F(xiàn):見jsj的11.2#include 第三節(jié) 對(duì)象的定義一、對(duì)象的定義格式類的對(duì)象是該類的某一特定實(shí)體,即類類型的變量。 聲明形式類名 對(duì)象名;例 Clock myClock; 訪問(wèn)對(duì)象成員類中成員互訪:直接使用成員名。類外訪問(wèn):使用“對(duì)象名.成員名”方式訪問(wèn) public 屬性的成員。類應(yīng)用舉例:#includeusing namespace std;class Clock ./類的聲明略/.類的實(shí)現(xiàn)略int main() Clock myClock; myClock.SetTime(8,30,30); myClock.ShowTime();二、對(duì)象指針和對(duì)象引用的定義格式 1、對(duì)象指針 聲明形式類名 *對(duì)象指針名;例Point A(5,10);Piont *ptr;ptr=&A; 通過(guò)指針訪問(wèn)對(duì)象成員對(duì)象指針名-成員名ptr-getx() 相當(dāng)于 (*ptr).getx();對(duì)象指針應(yīng)用舉例:int main() Point A(5,10); Point *ptr; ptr=&A; int x; x=ptr-GetX(); coutxendl; return 0; 2、對(duì)象引用( 聲明形式類名 &對(duì)象名=已存在的同類對(duì)象名;/給已有的對(duì)象另外取一個(gè)別名 例:Point A;Piont &B=A; 通過(guò)對(duì)象引用訪問(wèn)對(duì)象成員使用“對(duì)象引用名.成員名”方式訪問(wèn) public屬性 的成員(與使用對(duì)象名.成員名方式訪問(wèn)是等價(jià)的)。 舉例說(shuō)明:#includeusing namespace std;class Clock ./類的聲明略/.類的實(shí)現(xiàn)略int main() Clock Clock1; Clock &myClock=Clock1;/定義對(duì)象引用 myClock.SetTime(8,30,30);/等同于Clock1. etTime(8,30,30); myClock.ShowTime();/等同于Clock1. ShowTime();第四節(jié) 對(duì)象的初始化一、構(gòu)造函數(shù) 1、構(gòu)造函數(shù)說(shuō)明構(gòu)造函數(shù)的作用是在對(duì)象被創(chuàng)建時(shí)使用特定的值構(gòu)造對(duì)象,或者說(shuō)將對(duì)象初始化為一個(gè)特定的狀態(tài)。在對(duì)象創(chuàng)建時(shí)由系統(tǒng)自動(dòng)調(diào)用。如果程序中未聲明,則系統(tǒng)自動(dòng)產(chǎn)生出一個(gè)默認(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 NewS);/構(gòu)造函數(shù) void SetTime(int NewH, int NewM, int NewS); void ShowTime();private: int Hour,Minute,Second;構(gòu)造函數(shù)的實(shí)現(xiàn):Clock:Clock(int NewH, int NewM, int NewS) Hour= NewH; Minute= NewM; Second= NewS;建立對(duì)象時(shí)構(gòu)造函數(shù)的作用:int main() Clock c (0,0,0); /隱含調(diào)用構(gòu)造函數(shù),將初始值作為實(shí)參。 c.ShowTime();2、復(fù)制構(gòu)造函數(shù)(拷貝構(gòu)造函數(shù))拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),其形參為本類的對(duì)象引用。class 類名 public : 類名(形參);/構(gòu)造函數(shù) 類名(類名 &對(duì)象名);/拷貝構(gòu)造函數(shù) .;類名: 類名(類名 &對(duì)象名)/拷貝構(gòu)造函數(shù)的實(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:當(dāng)用類的一個(gè)對(duì)象去初始化該類的另一個(gè)對(duì)象時(shí)系統(tǒng)自動(dòng)調(diào)用拷貝構(gòu)造函數(shù)實(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ù)的形參為類對(duì)象,調(diào)用函數(shù)時(shí),實(shí)參賦值給形參,系統(tǒng)自動(dò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ù)的返回值是類對(duì)象時(shí),系統(tǒng)自動(dòng)調(diào)用拷貝構(gòu)造函數(shù)。例如:Point fun2() Point A(1,2); return A; /調(diào)用拷貝構(gòu)造函數(shù)int main() Point B; B=fun2(); 如果程序員沒(méi)有為類聲明拷貝初始化構(gòu)造函數(shù),則編譯器自己生成一個(gè)拷貝構(gòu)造函數(shù)。這個(gè)構(gòu)造函數(shù)執(zhí)行的功能是:用作為初始值的對(duì)象的每個(gè)數(shù)據(jù)成員的值,初始化將要建立的對(duì)象的對(duì)應(yīng)數(shù)據(jù)成員。二、析構(gòu)函數(shù)完成對(duì)象被刪除前的一些清理工作。在對(duì)象的生存期結(jié)束的時(shí)刻系統(tǒng)自動(dòng)調(diào)用它,然后再釋放此對(duì)象所屬的空間。如果程序中未聲明析構(gòu)函數(shù),編譯器將自動(dòng)產(chǎn)生一個(gè)默認(rèn)的析構(gòu)函數(shù)。 構(gòu)造函數(shù)和析構(gòu)函數(shù)舉例:#includeusing namespace std;class Point public: Point(int xx,int yy); Point(); /.其它函數(shù)原形 private: int X,int Y;Point:Point(int xx,int yy) X=xx; Y=yy;Point:Point()/.其它函數(shù)的實(shí)現(xiàn)略類的應(yīng)用舉例:一圓型游泳池如圖所示,現(xiàn)在需在其周圍建一圓型過(guò)道,并在其四周圍上柵欄。柵欄價(jià)格為35元/米,過(guò)道造價(jià)為20元/平方米。過(guò)道寬度為3米,游泳池半徑由鍵盤輸入。要求編程計(jì)算并輸出過(guò)道和柵欄的造價(jià)。#include using namespace std;const float PI = 3.14159;const float FencePrice = 35;const float ConcretePrice = 20;/聲明類Circle 及其數(shù)據(jù)和方法class Circle private: float radius; public: Circle(float r); /構(gòu)造函數(shù) float Circumference() const; /圓周長(zhǎng) float Area() const; /圓面積;/ 類的實(shí)現(xiàn)/ 構(gòu)造函數(shù)初始化數(shù)據(jù)成員radiusCircle:Circle(float r)radius=r/ 計(jì)算圓的周長(zhǎng)float Circle:Circumference() const return 2 * PI * radius;/ 計(jì)算圓的面積 float Circle:Area() const return PI * radius * radius;void main () float radius; float FenceCost, ConcreteCost; / 提示用戶輸入半徑 coutradius; / 聲明 Circle 對(duì)象 Circle Pool(radius); Circle PoolRim(radius + 3); / 計(jì)算柵欄造價(jià)并輸出 FenceCost = PoolRim.Circumference() * FencePrice; cout Fencing Cost is ¥ FenceCost endl; / 計(jì)算過(guò)道造價(jià)并輸出 ConcreteCost = (PoolRim.Area() - Pool.Area()*ConcretePrice; cout Concrete Cost is ¥ ConcreteCost X=xx;this-Y=yy; 2、指向類的非靜態(tài)成員的指針通過(guò)指向成員的指針只能訪問(wèn)公有成員。1)聲明指向成員的指針聲明指向公有數(shù)據(jù)成員的指針。類型說(shuō)明符 類名:*指針名;聲明指向公有函數(shù)成員的指針)類型說(shuō)明符 (類名:*指針名)(參數(shù)表);指向數(shù)據(jù)成員的指針(說(shuō)明指針應(yīng)該指向哪個(gè)成員)指針名=&類名:數(shù)據(jù)成員名;2)通過(guò)對(duì)象名(或?qū)ο笾羔槪┡c成員指針結(jié)合來(lái)訪問(wèn)數(shù)據(jù)成員對(duì)象名.* 類成員指針名或: 對(duì)象指針名*類成員指針名 指向函數(shù)成員的指針初始化指針名=類名:函數(shù)成員名;3)通過(guò)對(duì)象名(或?qū)ο笾羔槪┡c成員指針結(jié)合來(lái)訪問(wèn)函數(shù)成員(對(duì)象名.* 類成員指針名)(參數(shù)表)或:(對(duì)象指針名*類成員指針名)(參數(shù)表)舉例說(shuō)明:訪問(wèn)對(duì)象的公有成員函數(shù)的不同方式int main()/主函數(shù)Point A(4,5);/聲明對(duì)象APoint *p1=&A;/聲明對(duì)象指針并初始化 /聲明成員函數(shù)指針并初始化int (Point:*p_GetX)()=Point:GetX; /(1)使用成員函數(shù)指針訪問(wèn)成員函數(shù)cout(A.*p_GetX)()endl; /(2)使用對(duì)象指針訪問(wèn)成員函數(shù)coutGetX)()endl; /(3)使用對(duì)象名訪問(wèn)成員函數(shù) coutA.GetX()endl; 3、指向類的靜態(tài)成員的指針 對(duì)類的靜態(tài)成員的訪問(wèn)不依賴于對(duì)象 可以用普通的指針來(lái)指向和訪問(wèn)靜態(tài)成員例6-14通過(guò)指針訪問(wèn)類的靜態(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 int countP;/靜態(tài)數(shù)據(jù)成員引用性說(shuō)明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ù)成員定義性說(shuō)明int main()/主函數(shù) /聲明一個(gè)int型指針,指向類的靜態(tài)成員int *count=&Point:countP; Point A(4,5);/聲明對(duì)象AcoutPoint A,A.GetX(),A.GetY(); /直接通過(guò)指針訪問(wèn)靜態(tài)數(shù)據(jù)成員cout Object id=*countendl;Point B(A);/聲明對(duì)象BcoutPoint B,B.GetX() ,B.GetY(); /直接通過(guò)指針訪問(wèn)靜態(tài)數(shù)據(jù)成員cout Object id=*countendl; 例6-15通過(guò)指針訪問(wèn)類的靜態(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ù)成員引用性說(shuō)明;/ 函數(shù)實(shí)現(xiàn)略int Point:countP=0;/靜態(tài)數(shù)據(jù)成員定義性說(shuō)明int main()/主函數(shù) /指向函數(shù)的指針,指向類的靜態(tài)成員函數(shù)void (*gc)()=Point:GetC;Point A(4,5);/聲明對(duì)象AcoutPoint A,A.GetX(),A.GetY();gc(); /輸出對(duì)象序號(hào),通過(guò)指針訪問(wèn)靜態(tài)函數(shù)成員Point B(A);/聲明對(duì)象BcoutPoint B,B.GetX(),B.GetY();gc(); /輸出對(duì)象序號(hào),通過(guò)指針訪問(wèn)靜態(tài)函數(shù)成員四、遞歸類第六節(jié) 動(dòng)態(tài)內(nèi)存分配一、動(dòng)態(tài)申請(qǐng)內(nèi)存操作符 new new 類型名T(初值列表)功能:在程序執(zhí)行期間,申請(qǐng)用于存放T類型對(duì)象的內(nèi)存空間,并依初值列表賦以初值。結(jié)果值:成功:T類型的指針,指向新分配的內(nèi)存。失敗:0(NULL)二、釋放內(nèi)存操作符delete delete 指針P功能:釋放指針P所指向的內(nèi)存。P必須是new操作的返回值。例6-16 動(dòng)態(tài)創(chuàng)建對(duì)象舉例#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; 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;運(yùn)行結(jié)果:Step One:Default Constructor called.Destructor called.Step Two:Constructor called.Destructor called.三、淺拷貝與深拷貝 淺拷貝 實(shí)現(xiàn)對(duì)象間數(shù)據(jù)元素的一一對(duì)應(yīng)復(fù)制。 深拷貝 當(dāng)被復(fù)制的對(duì)象數(shù)據(jù)成員是指針類型時(shí),不是復(fù)制該指針成員本身,而是將指針?biāo)傅膶?duì)象進(jìn)行復(fù)制。 例6-20對(duì)象的淺拷貝 #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); pointsArray1.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.Element(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;運(yùn)行結(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, 30Point_1 of array2: 35, 40Deleting.Destructor called.Destructor called.Deleting.接下來(lái)程序出現(xiàn)異常,也就是運(yùn)行錯(cuò)誤。用圖說(shuō)明淺拷貝(見電子課件) 例6-21對(duì)象的深拷貝 #includeusing namespace std;class Point /類的聲明同例6-16 ;class ArrayOfPoints public: ArrayOfPoints(ArrayOfPoints& pointsArray); /其它成員同例6-18 ;ArrayOfPoints :ArrayOfPoints(ArrayOfPoints& pointsArray) numberOfPoints =pointsArray.numberOfPoints; points=new PointnumberOfPoints; for (int i=0; inumberOfPoints; i+) pointsi.Move(pointsArray.Element(i).GetX(), pointsArray.Element(i).GetY();int main() /同例6-20 程序的運(yùn)行結(jié)果如下:Please enter the number of points:2Default Constructor called.Default Constructor called.Default 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: 5, 10Point_1 of array2: 15, 20Deleting.Destructor called.Destructor called.Deleting.Destructor called.Destructor called. 用圖說(shuō)明(見電子課件)第七節(jié) 靜態(tài)成員一、靜態(tài)數(shù)據(jù)成員 靜態(tài)數(shù)據(jù)成員 用關(guān)鍵字static聲明 該類的所有對(duì)象維護(hù)該成員的同一個(gè)拷貝 必須在類外定義和初始化,用(:)來(lái)指明所屬的類。 舉例:具有靜態(tài)數(shù)據(jù)成員的Point類#include using namespace std;class Pointpublic: Point(int xx=0, int yy=0) X=xx; Y=yy; countP+; Point(Point &p); int GetX() return X; int GetY() return Y; void GetC() cout Object id=countPendl;private: int X,Y; static int countP;Point:Point(Point &p)X=p.X;Y=p.Y;countP+;int Point:countP=0; int main()Point A(4,5);coutPoint A,A.GetX(),A.GetY();A.GetC();Point B(A);coutPoint B,B.GetX(),B.GetY();B.GetC();二、靜態(tài)成員函數(shù) 靜態(tài)成員函數(shù) 類外代碼可以使用類名和作用域操作符來(lái)調(diào)用靜態(tài)成員函數(shù)。 靜態(tài)成員函數(shù)只能引用屬于該類的靜態(tài)數(shù)據(jù)成員或靜態(tài)成員函數(shù)。 靜態(tài)成員函數(shù)舉例1: #includeusing namespace std;class Application public- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來(lái)的問(wèn)題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 面向?qū)ο蟪绦蛟O(shè)計(jì) 面向 對(duì)象 程序設(shè)計(jì) 教案
鏈接地址:http://m.appdesigncorp.com/p-8937831.html