




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、分教課教職使院(部)研 室程名 稱師 姓名稱用教材教 案信息學院計算機科學與技術面向?qū)ο蟪绦蛟O計金淑娟講師C+語言程序設計教務處制授課內(nèi)容:第一章面向?qū)ο蟪绦蛟O計概念授課時數(shù)6教學目的及要求:了解:程序設計方法的發(fā)展過程,面向?qū)ο笳Z言的特點。掌握:面向?qū)ο蟮母拍睿嫦驅(qū)ο蟮某绦蜷_發(fā)過程。教學基本內(nèi)容:程序設計方法的發(fā)展過程;面向?qū)ο蟪绦蛟O計的基本思想及概念,面向?qū)ο蟪绦蛟O計的要點 及開發(fā)過程。重點及難點:面向?qū)ο蟮母拍?,面向?qū)ο蟮某绦蜷_發(fā)過程。教學方法:口講授法M討論法M口自學指導法其他M教學手段:口多媒體M口實物模型口掛圖口音像其他板書設計:討論、思考題、作業(yè):1 .敘述面向?qū)ο蠡舅枷氲奶?/p>
2、點。2 .敘述面向?qū)ο蟮某绦蛟O計方法與傳統(tǒng)回向過程的程序設計方法有何不同。3 .什么是類,什么是對象,類和對象是怎樣的關系?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)性的?參考資料(含參考書目、文獻等):1、Hacy M.Dcitcl 71 Paul James DcitclC+大學教程(第三版),電子工業(yè)出版社。2、劉
3、正林,面向?qū)ο蟪绦蛟O計,華中科技大學出版社。3、周生炳等,面向?qū)ο蟪绦蛟O計,清華大學出版社。4、揣錦華,面向?qū)ο蟪绦蛟O計與VC+實踐,西安電子科技大學出版社。5、王育堅編,面向?qū)ο缶幊探坛?,清華大學出版社。6、王萍編著,C+面向?qū)ο蟪绦蛟O計,清華大學出版社出版。7、徐孝凱等編,面向?qū)ο蟪绦蛟O計實驗,中央廣播電視大學出版社出版。第一節(jié)面向?qū)ο蟮姆椒ㄒ?、面向?qū)ο蟮恼Z言出發(fā)點:更直接地描述客觀世界中存在的事物時象)以及它們之間的關系。特點:是高皴語言。將客觀事物看作具有屬性和行為的對象。通過抽象找出同一類對象的共同屬性和行為,形成類。通過類的繼承與多態(tài)實現(xiàn)代碼重用。優(yōu)點:使程序能夠比較直接地反問題域
4、的本來面目,軟件開發(fā)人員能夠利用人類認識事 物所采用的一般思維方法來進行軟件開發(fā)。二、程序設計方法的發(fā)展歷程1 .面向過程的程序設計方法程序的目的:用于教學計算。主要工作:設計求解問題的過程。缺點:對于龐大、宜雜的程序難以開發(fā)和維護。2 .面向過程的結構化程序設計方法設計思跖:自頂向下、逐步求精。采用模塊分解與功能抽象,自頂向下、分而治之。程序結構:按功能劃分為若干個基本模塊,形成一個樹狀結構。各模塊間的關系盡可能簡 單,功能上相對獨立;每一模塊內(nèi)部均是由順序、選擇和循環(huán)三種基本結構組 成。其模塊化實現(xiàn)的具體方法是使用于程序。優(yōu)點:有效地將一個較更雜的程序系統(tǒng)設計任務分解成許多易于控制和處理的
5、于任 務,便于開發(fā)和維護。缺點:可重用性差、數(shù)據(jù)安全性差、難以開發(fā)大型軟件和圖形界面的應用軟件。具體有 以下幾點:- 把數(shù)據(jù)和處理數(shù)據(jù)的過程分離為相互獨立的實體。- 當數(shù)據(jù)結構改變時,所有相關的處理過程都要進行相應的修改。- 每一種相對于老問題的新方法都要帶來額外的開錯,程序的可重用性差。- 圖形用戶界面的應用程序,很難用過程來描述和實現(xiàn),開發(fā)和維護也都很困 難。3 .面向?qū)ο蟮姆椒ǚ椒ǎ?將數(shù)據(jù)及對數(shù)據(jù)的操作方法封裝在一起,作為一個相互依存、不可分離 的整體一對象。 對同類型對象抽象出其共性,形成類。 類通過一個簡單的外部接口,與外界發(fā)生關系。 對象與對象之間通過消息進行通訊。優(yōu)點: 程序模
6、塊間的關系更為筒單,程序模塊的獨立性、數(shù)據(jù)的安全性就有了 良好的保障。 通過繼承與多態(tài)性,可以大大提高程序的可重用性,使得軟件的開發(fā)和維護都更為方便。三、面向?qū)ο蟮幕靖拍?. 一般意義上的對象: 是現(xiàn)實世界中一個實際存在的事物。 可以是有形的(比如一輛汽車),也可以是無形的(比如一項計劃)。 是構成世界的一個獨立單位,具有:靜態(tài)特征-可以用某種數(shù)據(jù)來描述動態(tài)特征-對象所表現(xiàn)的行為或具有的功能2 .面向?qū)ο蠓椒ㄖ械膶ο螅?是系統(tǒng)中用來描述客觀事物的一個實體,它是用來構成系統(tǒng)的一個基 本單位。對象由一組屬性和一組行為構成。 屬性-用來描述對象靜態(tài)特征的數(shù)據(jù)項。 行為-用來描述對象動態(tài)特征的操作序
7、列。3 .分類所依據(jù)的原則一一抽象忽略事物的非本質(zhì)特征,只注意那些與當前目標有關的本質(zhì)特征,從而找出 事物的共性,把具有共同性質(zhì)的事物劃分為一類,得出一個抽象的概念。 例如,石頭、樹木、汽車、分類人類通常的思維方法。房屋等都是人們在長期的生產(chǎn)和生活實踐中抽象出的概念。4 .面向?qū)ο蠓椒ㄖ械摹邦悺?具有相同屬性和服務的一組對象的集臺。 為屬于該類的全部對象提供了抽象的描述,包括屬性和行為兩個主要部分。 類與對象的關系:猶如模具與鑄件之間的關系,一個屬于某類的對象稱為該類的一個實例。5 .面向?qū)ο蠓椒ㄖ械?,封裝” 把對象的屬性和服務結合成一個獨立的系統(tǒng)單元。 盡可能隱蔽對象的內(nèi)部細節(jié)。對外形成一個
8、邊界(或者說一道屏障),只保留有限的對外接口使之與外部發(fā)生聯(lián)系。6 .面向?qū)ο蠓椒ㄖ械摹袄^承”繼承對于軟件復用有著重要意義,是面向?qū)ο蠹夹g能夠提高軟件開發(fā)效率 的重要原因之一。 定義:特殊類的對象擁有其一般類的全部屬性與服務,稱作特殊類對一般類 的繼承。例如:將輪船作為一個一般類,客輪便是一個特殊類。7 .面向?qū)ο蠓椒ㄖ械?,多態(tài)性” 多態(tài)是指在一般類中定義的屬性或行為,被特殊類繼承之后,可以具有不 同的數(shù)據(jù)類型或表現(xiàn)出不同的行為。這使得同一個屬性或行為在一般類及其 各個特殊類中具有不同的語義。例如:數(shù)的加法-實數(shù)的加法分集:數(shù)的加法第二節(jié)面向?qū)ο蟮能浖_發(fā)面向?qū)ο蟮能浖こ蹋ㄜ浖_發(fā))是面向?qū)?/p>
9、象方法在軟件工程領域的全面應用。它包 括:- 面向?qū)ο蟮姆治觯≦QA)- 面向?qū)ο蟮脑O計(0()0)- 面向?qū)ο蟮木幊蹋∣OP)- 面向?qū)ο蟮臏y試(QQT)- 面向?qū)ο蟮能浖S護(QQSM)一、系統(tǒng)分析 系統(tǒng)分析階段應該扼要精確地抽象出系統(tǒng)必須做什么,但是不關心如何去實 現(xiàn)。 面向?qū)ο蟮南到y(tǒng)分析,直接用問題域中客觀存在的事物建立模型中的對象,對 單個事物及事物之間的關系,都保留他們的原貌,不做轉(zhuǎn)換,也不打破原有界 限而重新組合,因此能夠很好地映射客觀事物。二、設計 針對系統(tǒng)的一個具體實現(xiàn)運用面向?qū)ο蟮姆椒?。其中包括兩方面的工作? 把OOA模型直接搬到QOD,作為QOD的一部分。針對具體實現(xiàn)中
10、的人機界面、數(shù)據(jù)存儲、任務管理等因素補充一些與 實現(xiàn)有關的部分。三、編程QQP工作就是用一種面向?qū)ο蟮木幊陶Z言把QQD模型中的每個成分書寫出來, 是面向?qū)ο蟮能浖_發(fā)最終落實的重要階段。四、測試測試的任務是發(fā)現(xiàn)軟件中的錯誤。在面向?qū)ο蟮能浖y試中繼續(xù)運用面向?qū)ο蟮母拍钆c原則來組織測試,以對象的 類作為基本測試單位,可以更準確的發(fā)現(xiàn)程序錯誤并提高測試效率。五、維護將軟件交付使用后,工作并沒有完結,還要根據(jù)軟件的運行情況和用戶需求,不 斷改進系統(tǒng)。使用面向?qū)ο蟮姆椒ㄩ_發(fā)的軟件,其程序與問題域是一致的,因此,在維護階段運 用面向?qū)ο蟮姆椒梢源蟠筇岣哕浖S護的效率。授課內(nèi)容:第一章類與對象授課時數(shù)1
11、8教學目的及要求:掌握:類定義的方法和存取級別。掌握:類的成員變星和成員函數(shù)的定義和使用,以及對象的定義。了解:友元函數(shù)和友元類。掌握:構造函數(shù)和析構函數(shù)。掌握:靜態(tài)類成員變量和成員函數(shù)的定義和使用方法。掌握:內(nèi)聯(lián)函數(shù)的定義和使用方法。掌握:對象指針及對象引用的使用。了解:容器類的定義。掌握:在函數(shù)中對象傳遞的機制。教學基本內(nèi)容:類的聲明,對象的定義,構造函數(shù)、析構函數(shù),對象指針,對象引用,靜態(tài)成 員,友元,標識符的作用域,對象數(shù)組,成員對象,對象的存儲類等。重點與難點:類及類對象的定義,構造函數(shù)、析構函數(shù)的定義,對象指針及對象引用的使用, 容器類的定義。教學方法:口講授法M討論法M口自學指導
12、法其他M-教學手段:口多媒體M口實物 模型 口掛圖 口音像 其他板書設計:討論、思考題:1 .什么是類,什么是對象,類和對象是怎樣的關系?2 .敘述靜態(tài)成員和一般成員的區(qū)別。3 .什么叫友元?什么叫友元類?什么叫友元函教?什么叫友元成員函數(shù)?4,敘述友元與類的封裝性之間的關系。5.友元方法有什么優(yōu)點?有什么缺點?作業(yè):見書中第四章練習參考資料(含參考書目、文獻等):1、Harvey M.DuituI及Paul JamusDukd首,C+大學教程(第三板),電子工業(yè)出版社。2、劉正林,面向?qū)ο蟪绦蛟O計,華中科技大學出版社。3、周生炳等,面向?qū)ο蟪绦蛟O計,清華大學出版社。4、揣錦華,面向?qū)ο蟪绦蛟O
13、計與VC+實踐,西安電子科技大學出版社。5、王育堅編,面向?qū)ο缶幊探坛蹋迦A大學出版社。6、王萍編著,C+面向?qū)ο蟪绦蛟O計,清華大學出版社出版。7、徐孝凱等編,面向?qū)ο蟪绦蛟O計實驗,中央廣播電視大學出板社出版。第一節(jié)C+的面向?qū)ο蟮母拍钜?、抽象的概念抽象是對具體對象(問題)進行概括,抽出這一類對象的公共性質(zhì)并加以描述的過程。-先注意問題的本質(zhì)及描述,其次是實現(xiàn)過程或細節(jié)。- 數(shù)據(jù)抽象:描述某類對象的屬性或狀態(tài)(對象相互區(qū)別的物理星)。- 代碼抽象:描述某類對象的共有的行為特征或具有的功能。- 抽象的實現(xiàn):通過類的聲明。二、抽象實例1 .日期抽象實例數(shù)據(jù)抽象:int Year, int Mont
14、h, int Day代碼抽象:SclPatcO,設置年、月、日IsLcapYcarO,”計算某年是否為閏年ShowDalrO,/顯示年、月、日的值抽象實例日期類class Datepublic:void SctDatc(int y, int m, int d);int IsLcapDatcQ;void ShowDalcO;private:inv Year,Month,Day;2 .鐘表抽象實例-鐘表數(shù)據(jù)抽象:inv Hour, int Minute, int Second代碼抽象:SetTimeO, ShowTimcQ抽象實例鐘表類class Clockpublic:void SctTimc(
15、int NewH, int New, int NewS);void ShowTimcO;private:int Hour,Minute,Second;3 .抽象實例人數(shù)據(jù)抽象:char *namc,char * gender,int age,int id代碼抽象:生物屬性角度:GctClothO, EatQ, StepO,-社會屬性角度:WorkQ, Promote:。,二、封裝將抽象出的數(shù)據(jù)成員、代碼成員相結合,將它們視為一個整體。- 目的是曾強安全性和簡化編程,使用者不必了解具體的實現(xiàn)細節(jié),而只需要通過外部接口,以特定的訪問權限,來使用類的成員。- 實現(xiàn)封裝:類聲明中的實例:class C
16、lockpublic:void SciTimc(int NcwH, int NcwM, int NcwS);void ShowTimcO;private:inv Hour,Minute,Second;三、繼承與派生是C+中支持層次分類的一種機制,允許程序員在保持原有類特性的基礎上,進 行更具體的說明。實現(xiàn):聲明派生類第七章四、多態(tài)性 多態(tài):同一名稱,不同的功能實現(xiàn)方式。 目的:達到行為標識統(tǒng)一,減少程序中標識符的個教。 實現(xiàn):重載函數(shù)和虛函數(shù)一一.第7(章五、C+中的類 類是具有相同屬性和行為的一組對象的集臺,它為屬于該類的全部對象提供了 統(tǒng)一的抽象描述,其內(nèi)部包括屬性和行為兩個主要部分。 利
17、用類可以實現(xiàn)數(shù)據(jù)的封裝、隱藏、繼承與派生。 利用類易于編寫大型宜雜程序,其模塊化程度比c中采用函數(shù)更高。第二節(jié)類的定義格式一、類的聲明類是一種用戶自定義類型,聲明形式:class類各稱(public:公有成員(外部接口)private:私有成員protected:保護型成員;(1)類的定義格式分為說明部分和實現(xiàn)部分,說明部分用來描述該類中的成員,包括 數(shù)據(jù)成員和成員函數(shù),成員函數(shù)使用來對數(shù)據(jù)成員進行操作的即“方法”,實現(xiàn)部分用來定 義各種成員函數(shù),描述這些成員函數(shù)如何實現(xiàn)隊數(shù)據(jù)成員的操作。(2)類由類頭和類體兩部分組成。類頭由關鍵字class和類各組成,類名是由用戶定義 的標識符,類頭用來向便
18、宜系統(tǒng)聲明定義了一個新的class類型;而類體是對類的組織形式 進行具體的描述,它由訪問限制符(private,protccl",public)、數(shù)據(jù)成員和成員函數(shù)組成,整 個類體用一對大括號括起來,完整地表達對類的描述。(3)class允許隱藏內(nèi)部成員,它依靠類定義中的3個訪問限制符publicprivatcprolcctcd 來確定隱藏的程度,它們將類體分成3個大部分。(4)類的定義只是定義了某種類的組織形式,類似于結構體的定義,編譯系統(tǒng)并不給 class類型的每個數(shù)據(jù)成員分配具體的內(nèi)存空間。二、類成員的訪問控制3個訪問限制符將類體分成3個大部分,每一部分都可以有數(shù)據(jù)成員和成員函
19、數(shù),也 可以只有數(shù)據(jù)成員或只有成員函數(shù),但不同的訪問限制符規(guī)定了該部分所具有的訪問權限。1. Public (公有類型的成員)在關鍵字public后面聲明,這一部分是透明的,它的數(shù)據(jù)成員和成員函數(shù)是開放的, 即可以由本類的成員函數(shù)直接訪問,也可以由任何外部函數(shù)來訪問,它們是類與外部的 接口。外部訪問是通過“對象等公有成員占”進行。2. Private (私有類型的成員)在關健宇privalu后面聲明,這一部分象一個黑盒子,完全隱藏的。它只允許本類中 的成員函數(shù)直接訪問(既在成員函數(shù)體內(nèi)直呼其各寫出成員名),象日期類Dak的SdDag) 成員函數(shù)體內(nèi),可以直接寫<<ycar=y;mo
20、nth=m,day=d;M等語句;而類外部的任何函數(shù)都不 能訪問。如不允許編寫成”對象名.私有成員占“形式。如果緊跟在類名稱的后面聲明私有成員,則關鍵字pKM可以省略。3. Protected (保護類型成員)這一部分是半透明的,與private類似,其差別表現(xiàn)在繼承與派生時對派生類的影響 不同。它可由本類成員函數(shù)或它的派生類成員函數(shù)直接訪問,而其它的函數(shù)不允許訪問此部 分。二、數(shù)據(jù)成員與一般的變量聲明相同,但需要將它放在類的聲明體中。class Clockpublic:void SctTimc(int NexvH, int NewM, int NewS);聲明設置時鐘的成員函數(shù)void Sh
21、obTimu。;/聲明顯示時鐘的成員函數(shù)private:int Hour, Minute, Second;void Clock : SctTimc(int NewH, int NrwM, int NewS) /設置時鐘的成員函數(shù)在類體外的 實現(xiàn)Hour=NcwH;Minutc=NcwM;Sucond=NcwS;void Clock : ShowTimcO /顯示時鐘的成員函數(shù)在類體外的實現(xiàn)c()ut<<H()ur<<,:H<<Minutc<<l,:H<<Scc()nd;通常,總是將數(shù)據(jù)成員指定為私肓的,以實現(xiàn)數(shù)據(jù)隱藏,這些數(shù)據(jù)成員用來
22、描述該類 對象的屬性,編程者無法直接訪問它們而隱藏起來。四、成員函數(shù)1)成員函數(shù)說明 在類中說明原形,可以在類外給出函數(shù)體實現(xiàn),并在函數(shù)右前使用類各加以限定。 也可以直接在類中給出函數(shù)體,形成內(nèi)藤成員函數(shù)。 允許聲明重載函數(shù)和帶默認形參值的函數(shù)。(見上面例子中成員函數(shù)的定義)2)內(nèi)聯(lián)成員函數(shù) 為了提高運行時的效率,對于較簡單的函數(shù)可以聲明為內(nèi)聯(lián)形式。 內(nèi)聯(lián)函數(shù)體中不要有侵雜結構(如循環(huán)語句和switch語句)0 在類中聲明內(nèi)聯(lián)成員函數(shù)的方式:- 將函數(shù)體放在類的聲明中。-使用inline關鍵字。舉例1 :class Pointpublic:void IniinitX,int initY)X=i
23、nitX;Y=initY;int GctXQ return X;int GetYQ return Y;private:ini X,Y;;舉例2class Pointpublic:void lnit(int initXjnt initY);intGctXO;int GctYQ;private:int X,Y;inline void Point:Init(int initX,int initY)X=initX;Y=iiiitY;inline int P()int:GctX()rcUim X;inline int Point:Gct7()return Y;一般將成員函數(shù)指定為公有的,作為該類對象訪問
24、私有數(shù)據(jù)成員的一個接口界面,即 對象訪問私有數(shù)據(jù)成員的一條消息通道提供給外界使用。因此,一個類的對象只能通過公有成員函數(shù)訪問它的私有數(shù)據(jù)成員,從而隱藏了處理 這些數(shù)據(jù)的具體實現(xiàn)細節(jié),使得類對數(shù)據(jù)的描述和類提供給外界來處理數(shù)據(jù)的界面互相獨 立,這就給出了面向?qū)ο蟮闹匾匦?。如日期類Date封裝在一個程序?qū)嶓w內(nèi)(定義日期類 Date的程序代碼),將它的私有數(shù)據(jù)成員yergonthdiy等隱藏起來,不讓對象隨意訪問,對象要訪問這些私有數(shù)據(jù)成員,也只有通過公有的成員函數(shù)SctDalH)、kLe叩、&吟和PrintDatuO等才能實現(xiàn)。舉例:Counter類用類定義一個計數(shù)器的抽象數(shù)據(jù)類型,計數(shù)
25、器允許的取值范圍為04294967295的正整 數(shù),可進行的操作是計數(shù)器加1、減1和讀計數(shù)器的值。數(shù)據(jù)抽象:intvalue;代碼抽象:Counted);給計數(shù)器賦初值Segment。;/在計數(shù)器允許取值范圍內(nèi)對計數(shù)器加1DccrcmcntO;/在計數(shù)器允許取值范圍內(nèi)對計數(shù)器減1RuadValuc();/讀計數(shù)器的值Countur();撤消Counter類的對象程序?qū)崿F(xiàn):見面的1L2# include <第三節(jié)對象的定義一、對象的定義格式類的對象是該類的某一特定實體,即類類型的變量。聲明形式類占對象占;例 Clock myClock;訪問對象成員類中成員互訪:直接使用成員各。類外訪問:使
26、用“對象名成員仁”方式訪問public屬性的成員。類應用舉例:#includc<i()strcam>using namespace std;class Clock類的聲明略/類的實現(xiàn)"int main。 Clock myClock;myOock.SctTimc(8,30,30);myClock.ShowTimcO;二、對象指針和對象引用的定義格式1、對象指針聲明形式類名*對象指針占;例Point A(5,10);Piont *ptr;ptr=&A;通過指針訪問對象成員對象指針各成員占ptr->gctxQ 相當于(*ptr).gctxO;對象指針應用舉例:in
27、t main。Point A(5,10);Point *ptr;ptr=&A;int x;x=ptr->GctX();cout<<x<<cndl;return 0;2、對象引用(聲明形式類名&對象占=巳存在的同類對象各;給已有的對象另外取一個別名例:Point A;Pioiit &B=A;通過對象引用訪問對象成員使用“對象引用等成員臺”方式訪問public屬性 的成員(與使用對象名成員各方式訪問是等價的)。舉例說明:#includc<iostrcam>using namespace std;class Clock類的聲明略/類的
28、實現(xiàn)嶼int rnainQ Clock Clockl;Clock &myClock=Clockl;/ / 定義對象引用myClock.SetTime(8,30R);/等同于 Clockl. etTime(8,3030);myClock.ShowTimu();等同于 Clockl. ShowTimcQ;第四節(jié)對象的初始化一、構造函數(shù)1、構造函數(shù)說明構造函數(shù)的作用是在對象被創(chuàng)建時使用特定的值構造對象,或者說將對象初始化 為一個特定的狀態(tài)。在對象創(chuàng)建時由系統(tǒng)自動調(diào)用。如果程序中未聲明,則系統(tǒng)自動產(chǎn)生出一個默認形式的構造函數(shù)允許為內(nèi)減函數(shù)、重載函數(shù)、帶默認形參值的函數(shù)。構造函數(shù)舉例:class
29、 Clockpublic:Clock (ini NcwH, inv NcwM, ini NcwS);構造函數(shù)void ScvTimc(int NcwH, inv NcwM, inv NcwS);void ShowTimcQ;private:int Hour,Nlinutr,Second;構造函數(shù)的實現(xiàn):Cl()ck::Ck)ck(int NuxvH, int NewM, ini NrwS)Hour= NewH;Minutc= NewM;Second = NewS;建立對象時構造函數(shù)的作用:int main。Clock c (0,0,0);隱含調(diào)用構造函數(shù),將初始值作為實參。c-ShowTimc
30、Q;2、復制構造函數(shù)(拷貝構造函數(shù))拷貝構造函數(shù)是一種特殊的構造函數(shù),其形參為本類的對象引用。class類名 public:類名(形參);構造函數(shù)類名(類占&對象名);拷貝構造函數(shù) ;類名::類名(類占&對象各)拷貝構造函數(shù)的實現(xiàn) 函數(shù)體 拷貝構造函數(shù)舉例1:class Pointpublic:P()int(int xx=O,int yy=0)X=xx; Y=yy;P()int(P(int& p);hit GctXQ return X;int GetYQ ruturnY;private:int X,Y;P()int:P()int (Point& p)x=p.x;
31、Y=p.Y;coutv v”拷貝構造函數(shù)被調(diào)用侵制構造函數(shù)舉例2:當用類的一個對象去初始化該類的另一個對象時系統(tǒng)自動調(diào)用拷貝構造函數(shù)實現(xiàn)拷 貝賦值。int mainQ PoimA(l,2);Point B(A); 拷貝構造函數(shù)被調(diào)用cout<<B.GctX()<<cndl;復制構造函數(shù)舉例3:若函數(shù)的形參為類對象,調(diào)用函數(shù)時,實參賦值給形參,系統(tǒng)自動調(diào)用拷貝構造函 數(shù)。例如:void fiinl (Point p) cout<<p.GctXQ<<cndl;int main。 Point A(l);funl(A); 調(diào)用拷貝構造函數(shù)侵制構造函數(shù)舉例
32、4:當函數(shù)的返回值是類對象時,系統(tǒng)自動調(diào)用拷貝構造函數(shù)。例如:Point fun2Q Point A(l,2);return A; /調(diào)用拷貝構造函數(shù)int mainQPoint B;B=fun2Q;如果程序員沒有為類聲明拷貝初始化構造函數(shù),則編譯器自己生成一個拷貝構造函數(shù)。這個構造函數(shù)執(zhí)行的功能是:用作為初始值的對象的每個數(shù)據(jù)成員的值, 初始化將要建立的對象的對應數(shù)據(jù)成員。二、析構函數(shù)完成對象被刪除前的一些清理工作。在對象的生存期結束的時刻系統(tǒng)自動調(diào)用它, 然后再釋放此對象所屬的空間。如果程序中未聲明析構函數(shù),編譯器將自動產(chǎn)生一個默 認的析構函數(shù)。構造函數(shù)和析構函數(shù)舉例:#indudc<
33、;iostrcam>using namespace std;class Pointpublic:P()int(int xxjnt yy);-PointO;其它函數(shù)原形private:iniXjntY;P(>int:P()int(int xxjnt yy) X=xx; Y=yy;Point:-Point。/其它函數(shù)的實現(xiàn)略類的應用舉例:一周型游泳池如圖所示,現(xiàn)在需在其周圍建一圓型過道,并在其四周圍上柵欄。櫥 欄價格為35元/米,過道造價為20元/平方米。過道寬度為3米,游泳池半徑由鍵盤輸 入。要求編程計算并輸出過道和柵欄的造價。#includc <iostrcam> us
34、ing namespace std;const float PI = 3.14159;const float FciiccPricc = 35;const float ConerctcPricc = 20;/聲明類Circle及其數(shù)據(jù)和方法class Circleprivate:float radius;public:Circlc(floal r); 構造函數(shù)float CircumfcrcnccO const; 圓周長float ArcaQ const; 圓面積;/類的實現(xiàn)/構造函數(shù)初始化數(shù)據(jù)成員radiusCirclc:Circlc(floal r)radius=r/計算圓的周長float
35、 Circlc::CircumfcrcnccO const(return 2 * PI * radius;/計算圓的面積float Circlc:Arca() constreturn PI * radius * radius;) void main Qfloat radius;float FciiccCost, ConcrctcCost;/提示用戶輸入半徑cout<<MEnter the radius of the pool: M;cin» radius;聲明Circle對象Circle Pool(radius);Circle P()olRim(radius + 3);/
36、計算柵欄造價并輸出FciiccCost = P(x)lRim.CircumfcrenceQ * FcnccPricc;cout << "FencingCost is ¥" << FcnccCost << cndl;/計算過道造價并輸出ConcrctcCost = (PoolRim.ArcaO - P()()I.Arca()*C()ncrcLcPricc;cout << HConcrete Cost is ¥" << ConcrctcCost « ciidl;運行結果Enter
37、 the radius of the pool: 10Fencing Cost is ¥ 2858.85Concrete Cost is Y 4335.39第五節(jié)對象指針和對象引用的應用一、對象指針作為函數(shù)的參數(shù)二、對象引用做函數(shù)的參數(shù)三、This指針1、This指針說明隱含于每一個類的成員函數(shù)中的特殊指針。明確地指出了成員函數(shù)當前所操作的數(shù)據(jù)所屬的對象。-當通過一個對象調(diào)用成員函數(shù)時,系統(tǒng)先將該對象的地址賦給this指針,然后調(diào)用成員函數(shù),成員函數(shù)對對象的數(shù)據(jù)成員進行操作時,就隱含使用了 this指針。例如:Point類的構造函數(shù)體中的語句:X=xx;Y=yy;相當于:this-&
38、gt;X=xx;this->Y=yy;2、指向類的非靜態(tài)成員的指針通過指向成員的指針只能訪問公有成員。1)聲明指向成員的指針 聲明指向公有數(shù)據(jù)成員的指針。類型說明符 類名:*指針臺; 聲明指向公有函數(shù)成員的指針)類型說明符(類等產(chǎn)指針聳(參數(shù)表); 指向數(shù)據(jù)成員的指針(說明指針應該指向哪個成員)指針占=&類等:數(shù)據(jù)成員占;2)通過對象名(或?qū)ο笾羔槪┡c成員指針結合來訪問數(shù)據(jù)成員對象等*類成員指針名或:對象指針各一>*類成員指針各 指向函數(shù)成員的指針初始化指針名=類等:函數(shù)成員各;3)通過對象名(或?qū)ο笾羔槪┡c成員指針結合來訪問函數(shù)成員(對象各產(chǎn)類成員指針占X參數(shù)表)或:(對
39、象指針各一>*類成員指針名)(參數(shù)表)舉例說明:訪問對象的公有成員函數(shù)的不同方式ini main。主函數(shù) Point A(4,5); 聲明對象 APoint *pl=&A;聲明對象指針并初始化聲明成員函數(shù)指針并初始化int (Point:*p_GetX)0=Point:GetX;/ (1)使用成員函數(shù)指針訪問成員函數(shù)cout< < (A.*p_GetX) Q < <endl;/ (2)使用對象指針訪問成員函數(shù) cout<<(pl->GctX)Q«cndl;/ (3)使用對象臺訪問成員函數(shù) c()ut<<A.GctXQ
40、<<ciidl;3、指向類的靜態(tài)成員的指針對類的靜態(tài)成員的訪問不依賴于對象可以用普通的指針來指向和訪問靜態(tài)成員例6-1通過指針訪問類的靜態(tài)數(shù)據(jù)成員#includc <iostrcam>using namespace std;class Point /Point 類聲明public:外部接口Point(int xx=0, int yy=O) X=xx;Y=yy;countP+;構造函數(shù) P()int(P()ini &p); 拷貝構造函數(shù) int GctXQ return X;int GetYQ return Y;static int countP;靜態(tài)數(shù)據(jù)成員引用
41、性說明private: /私有數(shù)據(jù)成員int X,Y;Point :Point(Point &p) X=p.X; Y=p.Y; couniP+; int Poini:c()uniP=0; 靜態(tài)數(shù)據(jù)成員定義性說明int main。/主函教聲明一個int型指針,指向類的靜態(tài)成員int *count=&Point:countP;Point A(4,5); 聲明對象 Acout«MP()int A;,«A.GctX0<<,/,<<A.GctY0;/直接通過指針訪問靜態(tài)數(shù)據(jù)成員cout«M Object id=H<<*co
42、um<<ciidl;Point B(A);/聲明對象 Bcout«MPoint B,H«B.GctX()«1,H«B.GetY0;直接通過指針訪問靜態(tài)數(shù)據(jù)成員cout<<H Object id=H<<*coiint<<cndl;例6-15通過指針訪問類的靜態(tài)函數(shù)成員#includc <iostrcam>using namespace std;class Point /Point 類聲明 public:外部接口其它函數(shù)嶼static void GctCQ/靜態(tài)函數(shù)成員cout<<H O
43、bject id=H<<countP<<ciidl;private: 私有數(shù)據(jù)成員int X,Y;static int countP;靜態(tài)數(shù)據(jù)成員引用性說明;/函數(shù)實現(xiàn)略int P()int:c()uniP=O; /靜態(tài)數(shù)據(jù)成員定義性說明int mainQ 主函數(shù)/指向函數(shù)的指針,指向類的靜態(tài)成員函數(shù)void (*gc)0=Point:GctC;Point A(4,5); /聲明對象 Acout«MPoint A;,«A.GctX0«H,M«A.GctY0;gcQ; 輸出對象序號,通過指針訪問靜態(tài)函數(shù)成員Point B(A);/聲
44、明對象 Bcout<<,TointB;,<<B.GetXO<<,<<B.GetYO;gcO; 輸出對象序號,通過指針訪問靜態(tài)函數(shù)成員四、遞歸類第六節(jié) 動態(tài)內(nèi)存分配一、動態(tài)申請內(nèi)存操作符newnew類型占T (初值列表)功能:在程序執(zhí)行期間,申請用于存放T類型對象的內(nèi)存空間,并依初值列表賦以初值。結果值:成功:T類型的指針,指向新分配的內(nèi)存。失敗:0 (NULL)二、釋放內(nèi)存操作符deletedelete 指針 P功能:釋放指針P所指向的內(nèi)存。P必須是new操作的返回值。例6-16動態(tài)創(chuàng)建對象舉例#includc<iostrcam>us
45、ing namespace std;class Point public:Point。 X=Y=0; cout<<HDcfault Constructor called.nH;P()int(int xxjnt yy) X=xx; Y=yy; cout<< "Constructor callcd.nH; -Point。 cout«nDcstructor callcd.n° int GctXO return X;int GetYQ return Y;void Movc(int xjnt y) X=x; Y=y; private:int X,Y;
46、int main。 cout<<MStcp ()nc:H<<cndl;Point *ptrl=new Point;delete Ptrl;cout<<uStcp Tw():H<<cndl;Ptrl =nrxv Point。,2);delete Ptrl;return 0;運行結果:Step One:Default Constructor called.Destructor called.Step Two:Constructor called.Destructor called.三、淺拷貝與深拷貝淺拷貝-實現(xiàn)對象間數(shù)據(jù)元素的一一對應更制。深拷貝-當
47、被曳制的對象數(shù)據(jù)成員是指針類型時,不是復制該指針成員本身,而是將 指針所指的對象進行復制。例6-20對象的淺拷貝#includc<iostrcam>using namespace std;class Point類的聲明同例6-16/;class ArrayOfPoints類的聲明同例6-18/;int mainQ int number;cin>>numbcr;ArrayOFPoints pointsArrayl (number);pointsArrayl.Elcmcnt(0).Movc(5,10);points Array l.Elcmciit(l).M()vc(l 5
48、,20);A rrayC) fPoints points A rray2 (points A rrayl);cout<<HC()py of points A rray 1 :M < < end 1;cout<<HPoint_0 of array2: " <<pointsArray2.Elcmciit(0).GctX0<<* H<<pointsArray2.Elcmcnt(0).GetYO<<cndl;cout<<HPoint_l of array2: H <<p(>int
49、sArray2.Elcmciit( 1).GctXQ<<* H<<p()intsArray2.Elcmcni(l).GctY0<<cndl;points Array l.Elcmcnt(0).M()vc(25,30);points A rray 1 .Element(1) .Move (35,40);cout<<HAftcr the moving of pointsArrayl:1,«endl;cout<<HPoint_0 of array2: H<<pointsArray2.Elcmcnt(0).GctXO
50、171;9 M<<pointsArray2.Elcmciit(0).GctY()<<cndl;cout<<HPoint_l of array2: M<<pointsArray2.Elcmcnt(l).GctX0<<r M<<pointsArray2.Elcmcnt(l).GctY0<<cndl;運行結果如下:Please enter the number of points:2Default Constructor called.Default Constructor called.Copy of points
51、Arrayl:Point_0 of array2: 5, 10Pointof array2: 15, 20After the moving of pointsArrayl:Point_0 of array2: 25, 30Pointof array2: 35, 40Deleting.Destructor called.Destructor called.Deleting.接下來程序出現(xiàn)異常,也就是運行錯誤。用圖說明淺拷貝(見電子課件)例6-21對象的深拷貝#includc<iostrcam>using name space std;class Point類的聲明同例6-16;cla
52、ss ArravOfPointsJ public:A rrayO fPoints (A rrayO fPoints& points Array);其它成員同例6-18;ArravOfPoints :ArravOfPoints <J(Array()fP()ints& pointsArray) numberOfPoints=p()intsArray.numbcr()fP()ints;points=nrT Pointnumbcr( )fPoints;f()r (int i=0; i<numbcr()fPoints; i+)points H.Movc (points A r
53、ray. Elcmciit(i) .GctXQ,pointsArray.Elcmcnt(i).GctYO);int main。 同例 6-20程序的運行結果如下:Please enter the number of p()ints:2Default Constructor called.Default Constructor called.Default Constructor called.Default Constructor called.Copy of pointsArrayl:Point_0 of array2: 5, 10Pointofarray2: 15, 20After the
54、 moving of pointsArrayl:P()int_0 of array2: 5,10Pointof array2: 15, 20Deleting.Destmetor called.Destructor called.Deleting.Destmetor called.Destructor called.用圖說明(見電子課件)第七節(jié)靜態(tài)成員一、靜態(tài)數(shù)據(jù)成員int Point:countP=0;int mainOPoint A(4,5);cout<<nPoiiit A,r<<A.GctX()<<n,H«A.GctYO;A.GctCQ;Poi
55、nt B(A);cout«nPoint B?,«B.GctX0«n;,«B.GctY0;B.GctCO;|二、靜態(tài)成員函數(shù)靜態(tài)成員函數(shù)-類外代碼可以使用類占和作用域操作符來調(diào)用靜態(tài)成員函數(shù)。-靜志成員函數(shù)只能引用屬于該類的靜態(tài)數(shù)據(jù)成員或靜態(tài)成員函數(shù)。靜態(tài)成員函數(shù)舉例1:#includc<i()strcam>using namespace std;class Application public:static void fQ;static void gQ;private:static int global;int Applicati()n::global =0;void Applicari()n:fQ global=5;void Applicari()n:gQ cout<<global<<cndl;int main。Applica
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025咨詢服務合同模板(含能評合同)
- 2025YY建筑安裝工程施工合同
- 與多人簽定務工合同樣本
- 農(nóng)村道路清潔合同樣本
- 兼職合伙人項目合同標準文本
- 上海購買車合同標準文本
- 農(nóng)民工非全日制合同樣本
- 興平景觀魚池防水合同樣本
- 代工掛面合同標準文本
- 中式勞動合同樣本
- 憲法與銀行業(yè)務
- 機電安裝工程專業(yè)分包合同
- (二模)咸陽市2025年高考模擬檢測(二)語文試卷(含答案)
- 行政事業(yè)單位財務知識培訓
- 2025-2030中國探地雷達行業(yè)發(fā)展分析及發(fā)展趨勢預測與投資價值研究報告
- 智慧共享中藥房建設與運行規(guī)范
- 《中央八項規(guī)定精神學習教育》專項講座
- 東湖高新區(qū)2023-2024學年下學期期中七年級數(shù)學試題(含答案)
- 2025年中國信達資產(chǎn)管理股份有限公司招聘筆試參考題庫含答案解析
- 勞務派遣勞務外包項目方案投標文件(技術方案)
- 教科版六年級科學下冊全冊教學設計教案
評論
0/150
提交評論