《C語言程序設(shè)計》第四章:類與對象.ppt
《《C語言程序設(shè)計》第四章:類與對象.ppt》由會員分享,可在線閱讀,更多相關(guān)《《C語言程序設(shè)計》第四章:類與對象.ppt(71頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、1,第四章 類與對象,C++語言程序設(shè)計,2,本章主要內(nèi)容,面向?qū)ο蟮乃枷?OOP的基本特點 類概念和聲明 對象 構(gòu)造函數(shù),析構(gòu)函數(shù) 內(nèi)聯(lián)成員函數(shù) 拷貝構(gòu)造函數(shù) 類的組合,3,回顧:面向過程的設(shè)計方法,重點: 如何實現(xiàn)細(xì)節(jié)過程,將數(shù)據(jù)與函數(shù)分開。 形式: 主模塊+若干個子模塊(main()+子函數(shù))。 特點: 自頂向下,逐步求精功能分解。 缺點: 效率低,程序的可重用性差。,面向?qū)ο蟮乃枷?4,面向?qū)ο蟮姆椒?目的: 實現(xiàn)軟件設(shè)計的產(chǎn)業(yè)化。 觀點: 自然界是由實體(對象)所組成。 程序設(shè)計方法: 使用面向?qū)ο蟮挠^點來描述模仿并處理現(xiàn)實問題。 要求: 高度概括、分類、和抽象。,面向?qū)ο蟮乃枷?5
2、,抽象,抽象是對具體對象(問題)進(jìn)行概括,抽出這一類對象的公共性質(zhì)并加以描述的過程。 先注意問題的本質(zhì)及描述,其次是實現(xiàn)過程或細(xì)節(jié)。 數(shù)據(jù)抽象:描述某類對象的屬性或狀態(tài)(對象相互區(qū)別的物理量)。 代碼抽象:描述某類對象的共有的行為特征或具有的功能。 抽象的實現(xiàn):通過類的聲明。,OOP的基本特點,6,抽象實例鐘表,數(shù)據(jù)抽象: int Hour, int Minute, int Second 代碼抽象: SetTime(), ShowTime(),OOP的基本特點,7,抽象實例鐘表類,class Clock public: void SetTime(int NewH, int NewM,
3、 int NewS); void ShowTime(); private: int Hour,Minute,Second; ;,OOP的基本特點,8,抽象實例人,數(shù)據(jù)抽象: char *name,char *gender,int age,int id 代碼抽象: 生物屬性角度:GetCloth(), Eat(), Step(), 社會屬性角度:Work(), Promote() ,,OOP的基本特點,9,封裝,將抽象出的數(shù)據(jù)成員、代碼成員相結(jié)合,將它們視為一個整體。 目的是曾強安全性和簡化編程,使用者不必了解具體的實現(xiàn)細(xì)節(jié),而只需要通過外部接口,以特定的訪問權(quán)限
4、,來使用類的成員。 實現(xiàn)封裝:類聲明中的,OOP的基本特點,10,封裝,實例: class Clock public: void SetTime(int NewH,int NewM, int NewS); void ShowTime(); private: int Hour,Minute,Second; ;,特定的訪問權(quán)限,OOP的基本特點,,,11,繼承與派生,是C++中支持層次分類的一種機制,允許程序員在保持原有類特性的基礎(chǔ)上,進(jìn)行更具體的說明。 實現(xiàn):聲明派生類第七章,OOP的基本特點,12,多態(tài)性,多態(tài):同一名稱,不同的功能實現(xiàn)方式。 目的:達(dá)到行為
5、標(biāo)識統(tǒng)一,減少程序中標(biāo)識符的個數(shù)。 實現(xiàn):重載函數(shù)和虛函數(shù)第八章,OOP的基本特點,13,c++中的類,類是具有相同屬性和行為的一組對象的集合,它為屬于該類的全部對象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和行為兩個主要部分。 利用類可以實現(xiàn)數(shù)據(jù)的封裝、隱藏、繼承與派生。 利用類易于編寫大型復(fù)雜程序,其模塊化程度比C中采用函數(shù)更高。,類 和 對 象,14,類的聲明形式,類是一種用戶自定義類型,聲明形式: class 類名稱 public: 公有成員(外部接口) private: 私有成員 protected: 保護(hù)型成員 ,類 和 對 象,15,公有類型成員,在關(guān)鍵
6、字public后面聲明,它們是類與外部的接口,任何外部函數(shù)都可以訪問公有類型數(shù)據(jù)和函數(shù)。,類 和 對 象,16,私有類型成員,在關(guān)鍵字private后面聲明,只允許本類中的函數(shù)訪問,而類外部的任何函數(shù)都不能訪問。 如果緊跟在類名稱的后面聲明私有成員,則關(guān)鍵字private可以省略。,類 和 對 象,17,保護(hù)類型,與private類似,其差別表現(xiàn)在繼承與派生時對派生類的影響不同,第七章講。,類 和 對 象,18,類的成員,class Clock public: void SetTime(int NewH, int NewM, int NewS); void ShowT
7、ime(); private: int Hour, Minute, Second; ;,類 和 對 象,,成員數(shù)據(jù),,,成員函數(shù),void Clock :: SetTime(int NewH, int NewM, int NewS) Hour=NewH; Minute=NewM; Second=NewS; void Clock :: ShowTime() cout< 8、以在類外給出函數(shù)體實現(xiàn),并在函數(shù)名前使用類名加以限定。也可以直接在類中給出函數(shù)體,形成內(nèi)聯(lián)成員函數(shù)。 允許聲明重載函數(shù)和帶默認(rèn)形參值的函數(shù),類 和 對 象,22,內(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)鍵字。,類 和 對 象,23,內(nèi)聯(lián)成員函數(shù)舉例(一),class Point public: void Init(int initX,int initY) X=initX; Y=initY; int GetX() 9、 return X; int GetY() return Y; private: int X,Y; ;,類 和 對 象,24,內(nèi)聯(lián)成員函數(shù)舉例(二),class 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 10、Point::GetY() return Y; ,25,26,對象,類的對象是該類的某一特定實體,即類類型的變量。 聲明形式: 類名 對象名; 例: Clock myClock;,類 和 對 象,27,類中成員的訪問方式,類中成員互訪 直接使用成員名 類外訪問 使用“對象名.成員名”方式訪問 public 屬性的成員,類 和 對 象,28,例4-1類的應(yīng)用舉例,#include using namespace std; class Clock ......//類的聲明略 //......類的實現(xiàn)略 int main() Clock myClock; myClock.SetT 11、ime(8,30,30); myClock.ShowTime(); ,類 和 對 象,29,抽象實例鐘表類,class Clock public: void SetTime(int NewH, int NewM, int NewS); void ShowTime(); private: int Hour,Minute,Second; ;,OOP的基本特點,30,構(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ù) 允許 12、為內(nèi)聯(lián)函數(shù)、重載函數(shù)、帶默認(rèn)形參值的函數(shù),構(gòu)造函數(shù)和析構(gòu)函數(shù),31,構(gòu)造函數(shù)舉例,class Clock public: 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ù)和析構(gòu)函數(shù),構(gòu)造函數(shù)的實現(xiàn): Clock::Clock(int NewH, int NewM, int NewS) Hour= NewH; Minute= NewM; Second= New 13、S; 建立對象時構(gòu)造函數(shù)的作用: int main() Clock c (0,0,0); //隱含調(diào)用構(gòu)造函數(shù),將初始值作為實參。 c.ShowTime(); ,31,33,拷貝構(gòu)造函數(shù),拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),其形參為本類的對象引用。 class 類名 public : 類名(形參);//構(gòu)造函數(shù) 類名(類名 Y=yy; Point(Point,構(gòu)造函數(shù)和析構(gòu)函數(shù),Point::Point (Point ,34,36,例4-2 拷貝構(gòu)造函數(shù)舉例,當(dāng)用類的一個對象去初始化該類的另一個對象時系統(tǒng)自動調(diào)用拷貝構(gòu)造函數(shù)實現(xiàn)拷貝賦值。 int main() Point A(1,2) 14、; Point B(A); //拷貝構(gòu)造函數(shù)被調(diào)用 cout< 15、; //調(diào)用拷貝構(gòu)造函數(shù) int main() Point B; B=fun2(); ,構(gòu)造函數(shù)和析構(gòu)函數(shù),39,拷貝構(gòu)造函數(shù),如果程序員沒有為類聲明拷貝初始化構(gòu)造函數(shù),則編譯器自己生成一個拷貝構(gòu)造函數(shù)。 這個構(gòu)造函數(shù)執(zhí)行的功能是:用作為初始值的對象的每個數(shù)據(jù)成員的值,初始化將要建立的對象的對應(yīng)數(shù)據(jù)成員。,構(gòu)造函數(shù)和析構(gòu)函數(shù),40,析構(gòu)函數(shù),完成對象被刪除前的一些清理工作。 在對象的生存期結(jié)束的時刻系統(tǒng)自動調(diào)用它,然后再釋放此對象所屬的空間。 如果程序中未聲明析構(gòu)函數(shù),編譯器將自動產(chǎn)生一個默認(rèn)的析構(gòu)函數(shù)。,構(gòu)造函數(shù)和析構(gòu)函數(shù),41,構(gòu)造函數(shù)和析構(gòu)函數(shù)舉例,#include using na 16、mespace std; class Point public: Point(int xx,int yy); Point(); //...其它函數(shù)原形 private: int X,int Y; ;,構(gòu)造函數(shù)和析構(gòu)函數(shù),Point::Point(int xx,int yy) X=xx; Y=yy; Point::Point() //...其它函數(shù)的實現(xiàn)略,41,43,類的應(yīng)用舉例(例4-3),一圓型游泳池如圖所示,現(xiàn)在需在其周圍建一圓型過道,并在其四周圍上柵欄。柵欄價格為35元/米,過道造價為20元/平方米。過道寬度為3米,游泳池半徑由鍵盤輸入。要求編程計算并輸出過道和柵欄的造 17、價。,#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; //圓周長 float Area() const; //圓面積 ;,43,// 類的實現(xiàn) // 構(gòu)造函數(shù)初始 18、化數(shù)據(jù)成員radius Circle::Circle(float r) radius=r // 計算圓的周長 float Circle::Circumference() return 2 * PI * radius; // 計算圓的面積 float Circle::Area() return PI * radius * radius; ,44,void main () float radius; float FenceCost, ConcreteCost; // 提示用戶輸入半徑 coutradius; // 聲明 Circle 對象 Circle Pool(radius); Ci 19、rcle PoolRim(radius + 3);,45,// 計算柵欄造價并輸出 FenceCost = PoolRim.Circumference() * FencePrice; cout << Fencing Cost is ¥ << FenceCost << endl; // 計算過道造價并輸出 ConcreteCost = (PoolRim.Area() - Pool.Area())*ConcretePrice; cout << Concrete Cost is ¥ << ConcreteCost << endl; 運行結(jié)果 Enter the radius of the 20、 pool: 10 Fencing Cost is ¥2858.85 Concrete Cost is ¥4335.39,46,48,組合的概念,類中的成員數(shù)據(jù)是另一個類的對象。 可以在已有的抽象的基礎(chǔ)上實現(xiàn)更復(fù)雜的抽象。,類 的 組 合,49,舉例,class Point private: float x,y; //點的坐標(biāo) public: Point(float h,float v); //構(gòu)造函數(shù) float GetX(void); //取X坐標(biāo) float GetY(void); //取Y坐標(biāo) void Draw(void); //在(x,y)處畫點 ; //. 21、..函數(shù)的實現(xiàn)略,類 的 組 合,class Line private: Point p1,p2; //線段的兩個端點 public: Line(Point a,Point b); //構(gòu)造函數(shù) Void Draw(void); //畫出線段 ; //...函數(shù)的實現(xiàn)略,49,51,類組合的構(gòu)造函數(shù)設(shè)計,原則:不僅要負(fù)責(zé)對本類中的基本類型成員數(shù)據(jù)賦初值,也要對對象成員初始化。 聲明形式: 類名::類名(對象成員所需的形參,本類成員形參) :對象1(參數(shù)),對象2(參數(shù)),...... 本類初始化 ,類 的 組 合,52,類組合的構(gòu)造函數(shù)調(diào)用,構(gòu)造函數(shù)調(diào)用順序:先調(diào)用內(nèi) 22、嵌對象的構(gòu)造函數(shù)(按內(nèi)嵌時的聲明順序,先聲明者先構(gòu)造)。然后調(diào)用本類的構(gòu)造函數(shù)。(析構(gòu)函數(shù)的調(diào)用順序相反) 若調(diào)用默認(rèn)構(gòu)造函數(shù)(即無形參的),則內(nèi)嵌對象的初始化也將調(diào)用相應(yīng)的默認(rèn)構(gòu)造函數(shù)。,類 的 組 合,53,類的組合舉例(二),class Part //部件類 public: Part(); Part(int i); Part(); void Print(); private: int val; ;,類 的 組 合,class Whole public: Whole(); Whole(int i,int j,int k); Whole(); void Pr 23、int(); private: Part one; Part two; int date; ;,53,Whole::Whole() date=0; Whole::Whole(int i,int j,int k): two(i),one(j),date(k) //...其它函數(shù)的實現(xiàn)略,54,56,前向引用聲明,類應(yīng)該先聲明,后使用 如果需要在某個類的聲明之前,引用該類,則應(yīng)進(jìn)行前向引用聲明。 前向引用聲明只為程序引入一個標(biāo)識符,但具體聲明在其它地方。 當(dāng)使用前面引用聲明時,只能使用被聲明的符號,不能涉及類的任何細(xì)節(jié)。,類 的 組 合,57,前向引用聲明舉例,class B; / 24、/前向引用聲明 class A public: void f(B b); ; class B public: void g(A a); ;,類 的 組 合,58,前向引用聲明注意事項,使用前向引用聲明雖然可以解決一些問題,但它并不是萬能的。 盡管使用了前向引用聲明,但是在提供一個完整的類聲明之前,不能聲明該類的對象,也不能在內(nèi)聯(lián)成員函數(shù)中使用該類的對象。請看下面的程序段: class Fred;//前向引用聲明 class Barney Fred x;//錯誤:類Fred的聲明尚不完善 ; class Fred Barney y; ;,類 的 組 合,59,前向引用聲明注意事項,cla 25、ss Fred;//前向引用聲明 class Barney public: void method() x-yabbaDabbaDo(); //錯誤:Fred類的對象在定義之前被使用 private: Fred* x; //正確,經(jīng)過前向引用聲明,可以聲明Fred類的對象指針 ; class Fred public: void yabbaDabbaDo(); private: Barney* y; ;,類 的 組 合,解決這個問題的方法是,更改這兩個類的聲明次序或者將函數(shù)method()改為非內(nèi)聯(lián)形式,并且在類Fred的完整聲明之后,再給出函數(shù)的定義。,60,前向引用聲明注意事項, 26、應(yīng)該記?。寒?dāng)你使用前向引用聲明時,你只能使用被聲明的符號,而不能涉及類的任何細(xì)節(jié)。,類 的 組 合,61,UML簡介,UML語言是一種可視化的的面向?qū)ο蠼UZ言。 UML有三個基本的部分 事物(Things)UML中重要的組成部分,在模型中屬于最靜態(tài)的部分,代表概念上的或物理上的元素 關(guān)系(Relationships)關(guān)系把事物緊密聯(lián)系在一起 圖(Diagrams)圖是很多有相互相關(guān)的事物的組,UML圖形標(biāo)識,62,UML中有4種類型的事物,結(jié)構(gòu)事物(Structural things) 動作事物(Behavioral things) 分組事物(Grouping things) 注釋事物(An 27、notational things),UML圖形標(biāo)識,63,UML中的關(guān)系,依賴(Dependencies) 關(guān)聯(lián)(Association) 泛化(generalization) 實現(xiàn)(realuzation),UML圖形標(biāo)識,64,UML中的9種圖,類圖(class diagram) 對象圖(class diagram) 用例圖(Use case diagram) 順序圖(Sequence diagram) 協(xié)作圖(Collaboration diagram) 狀態(tài)圖(Statechart diagram) 活動圖(Activity diagram) 組件圖(Compomnent diag 28、ram) 實施圖(Deployment diagram),UML圖形標(biāo)識,65,類圖,舉例:Clock類的完整表示 Clock類的簡潔表示,,,UML圖形標(biāo)識,66,對象圖,,,,UML圖形標(biāo)識,67,類與對象關(guān)系的圖形標(biāo)識,依賴關(guān)系 圖中的“類A”是源,“類B”是目標(biāo),表示“類A”使用了“類B”,或稱“類A”依賴“類B”,UML圖形標(biāo)識,68,類與對象關(guān)系的圖形標(biāo)識,作用關(guān)系關(guān)聯(lián) 圖中的“重數(shù)A”決定了類B的每個對象與類A的多少個對象發(fā)生作用,同樣“重數(shù)B”決定了類A的每個對象與類B的多少個對象發(fā)生作用。,UML圖形標(biāo)識,69,類與對象關(guān)系的圖形標(biāo)識,包含關(guān)系聚集和組合,聚集表示類之間的關(guān)系是整體與部分的關(guān)系,“包含”、“組成”、“分為部分”等都是聚集關(guān)系。,UML圖形標(biāo)識,70,類與對象關(guān)系的圖形標(biāo)識,繼承關(guān)系泛化,UML圖形標(biāo)識,71,注釋,在UML圖形上,注釋表示為帶有褶角的矩形,然后用虛線連接到UML的其他元素上,它是一種用于在圖中附加文字注釋的機制。,,UML圖形標(biāo)識,,
- 溫馨提示:
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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 第七章-透射電子顯微鏡
- 群落的結(jié)構(gòu)(課件)
- 焊接基礎(chǔ)知識
- 水文地質(zhì)學(xué)課件
- 某公司員工工傷安全管理規(guī)定
- 消防培訓(xùn)課件:安全檢修(要點)
- 某公司安全生產(chǎn)考核與獎懲辦法范文
- 安全作業(yè)活動安全排查表
- 某公司危險源安全辨識、分類和風(fēng)險評價、分級辦法
- 某公司消防安全常識培訓(xùn)資料
- 安全培訓(xùn)資料:危險化學(xué)品的類別
- 中小學(xué)寒假學(xué)習(xí)計劃快樂度寒假充實促成長
- 紅色插畫風(fēng)輸血相關(guān)知識培訓(xùn)臨床輸血流程常見輸血不良反應(yīng)
- 14.應(yīng)急救援隊伍訓(xùn)練記錄
- 某公司各部門及人員安全生產(chǎn)責(zé)任制