《C語言程序設計》第四章:類與對象.ppt
《《C語言程序設計》第四章:類與對象.ppt》由會員分享,可在線閱讀,更多相關《《C語言程序設計》第四章:類與對象.ppt(71頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、1,第四章 類與對象,C++語言程序設計,2,本章主要內(nèi)容,面向?qū)ο蟮乃枷?OOP的基本特點 類概念和聲明 對象 構造函數(shù),析構函數(shù) 內(nèi)聯(lián)成員函數(shù) 拷貝構造函數(shù) 類的組合,3,回顧:面向過程的設計方法,重點: 如何實現(xiàn)細節(jié)過程,將數(shù)據(jù)與函數(shù)分開。 形式: 主模塊+若干個子模塊(main()+子函數(shù))。 特點: 自頂向下,逐步求精功能分解。 缺點: 效率低,程序的可重用性差。,面向?qū)ο蟮乃枷?4,面向?qū)ο蟮姆椒?目的: 實現(xiàn)軟件設計的產(chǎn)業(yè)化。 觀點: 自然界是由實體(對象)所組成。 程序設計方法: 使用面向?qū)ο蟮挠^點來描述模仿并處理現(xiàn)實問題。 要求: 高度概括、分類、和抽象。,面向?qū)ο蟮乃枷?5
2、,抽象,抽象是對具體對象(問題)進行概括,抽出這一類對象的公共性質(zhì)并加以描述的過程。 先注意問題的本質(zhì)及描述,其次是實現(xiàn)過程或細節(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ù)成員、代碼成員相結合,將它們視為一個整體。 目的是曾強安全性和簡化編程,使用者不必了解具體的實現(xiàn)細節(jié),而只需要通過外部接口,以特定的訪問權限
4、,來使用類的成員。 實現(xiàn)封裝:類聲明中的,OOP的基本特點,10,封裝,實例: class Clock public: void SetTime(int NewH,int NewM, int NewS); void ShowTime(); private: int Hour,Minute,Second; ;,特定的訪問權限,OOP的基本特點,,,11,繼承與派生,是C++中支持層次分類的一種機制,允許程序員在保持原有類特性的基礎上,進行更具體的說明。 實現(xiàn):聲明派生類第七章,OOP的基本特點,12,多態(tài)性,多態(tài):同一名稱,不同的功能實現(xiàn)方式。 目的:達到行為
5、標識統(tǒng)一,減少程序中標識符的個數(shù)。 實現(xiàn):重載函數(shù)和虛函數(shù)第八章,OOP的基本特點,13,c++中的類,類是具有相同屬性和行為的一組對象的集合,它為屬于該類的全部對象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和行為兩個主要部分。 利用類可以實現(xiàn)數(shù)據(jù)的封裝、隱藏、繼承與派生。 利用類易于編寫大型復雜程序,其模塊化程度比C中采用函數(shù)更高。,類 和 對 象,14,類的聲明形式,類是一種用戶自定義類型,聲明形式: class 類名稱 public: 公有成員(外部接口) private: 私有成員 protected: 保護型成員 ,類 和 對 象,15,公有類型成員,在關鍵
6、字public后面聲明,它們是類與外部的接口,任何外部函數(shù)都可以訪問公有類型數(shù)據(jù)和函數(shù)。,類 和 對 象,16,私有類型成員,在關鍵字private后面聲明,只允許本類中的函數(shù)訪問,而類外部的任何函數(shù)都不能訪問。 如果緊跟在類名稱的后面聲明私有成員,則關鍵字private可以省略。,類 和 對 象,17,保護類型,與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ù)和帶默認形參值的函數(shù),類 和 對 象,22,內(nèi)聯(lián)成員函數(shù),為了提高運行時的效率,對于較簡單的函數(shù)可以聲明為內(nèi)聯(lián)形式。 內(nèi)聯(lián)函數(shù)體中不要有復雜結構(如循環(huán)語句和switch語句)。 在類中聲明內(nèi)聯(lián)成員函數(shù)的方式: 將函數(shù)體放在類的聲明中。 使用inline關鍵字。,類 和 對 象,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類的應用舉例,#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,構造函數(shù),構造函數(shù)的作用是在對象被創(chuàng)建時使用特定的值構造對象,或者說將對象初始化為一個特定的狀態(tài)。 在對象創(chuàng)建時由系統(tǒng)自動調(diào)用。 如果程序中未聲明,則系統(tǒng)自動產(chǎn)生出一個默認形式的構造函數(shù) 允許 12、為內(nèi)聯(lián)函數(shù)、重載函數(shù)、帶默認形參值的函數(shù),構造函數(shù)和析構函數(shù),31,構造函數(shù)舉例,class Clock public: Clock (int NewH, int NewM, int NewS);//構造函數(shù) void SetTime(int NewH, int NewM, int NewS); void ShowTime(); private: int Hour,Minute,Second; ;,構造函數(shù)和析構函數(shù),構造函數(shù)的實現(xiàn): Clock::Clock(int NewH, int NewM, int NewS) Hour= NewH; Minute= NewM; Second= New 13、S; 建立對象時構造函數(shù)的作用: int main() Clock c (0,0,0); //隱含調(diào)用構造函數(shù),將初始值作為實參。 c.ShowTime(); ,31,33,拷貝構造函數(shù),拷貝構造函數(shù)是一種特殊的構造函數(shù),其形參為本類的對象引用。 class 類名 public : 類名(形參);//構造函數(shù) 類名(類名 Y=yy; Point(Point,構造函數(shù)和析構函數(shù),Point::Point (Point ,34,36,例4-2 拷貝構造函數(shù)舉例,當用類的一個對象去初始化該類的另一個對象時系統(tǒng)自動調(diào)用拷貝構造函數(shù)實現(xiàn)拷貝賦值。 int main() Point A(1,2) 14、; Point B(A); //拷貝構造函數(shù)被調(diào)用 cout< 15、; //調(diào)用拷貝構造函數(shù) int main() Point B; B=fun2(); ,構造函數(shù)和析構函數(shù),39,拷貝構造函數(shù),如果程序員沒有為類聲明拷貝初始化構造函數(shù),則編譯器自己生成一個拷貝構造函數(shù)。 這個構造函數(shù)執(zhí)行的功能是:用作為初始值的對象的每個數(shù)據(jù)成員的值,初始化將要建立的對象的對應數(shù)據(jù)成員。,構造函數(shù)和析構函數(shù),40,析構函數(shù),完成對象被刪除前的一些清理工作。 在對象的生存期結束的時刻系統(tǒng)自動調(diào)用它,然后再釋放此對象所屬的空間。 如果程序中未聲明析構函數(shù),編譯器將自動產(chǎn)生一個默認的析構函數(shù)。,構造函數(shù)和析構函數(shù),41,構造函數(shù)和析構函數(shù)舉例,#include using na 16、mespace std; class Point public: Point(int xx,int yy); Point(); //...其它函數(shù)原形 private: int X,int Y; ;,構造函數(shù)和析構函數(shù),Point::Point(int xx,int yy) X=xx; Y=yy; Point::Point() //...其它函數(shù)的實現(xiàn)略,41,43,類的應用舉例(例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); //構造函數(shù) float Circumference() const; //圓周長 float Area() const; //圓面積 ;,43,// 類的實現(xiàn) // 構造函數(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; 運行結果 Enter the radius of the 20、 pool: 10 Fencing Cost is ¥2858.85 Concrete Cost is ¥4335.39,46,48,組合的概念,類中的成員數(shù)據(jù)是另一個類的對象。 可以在已有的抽象的基礎上實現(xiàn)更復雜的抽象。,類 的 組 合,49,舉例,class Point private: float x,y; //點的坐標 public: Point(float h,float v); //構造函數(shù) float GetX(void); //取X坐標 float GetY(void); //取Y坐標 void Draw(void); //在(x,y)處畫點 ; //. 21、..函數(shù)的實現(xiàn)略,類 的 組 合,class Line private: Point p1,p2; //線段的兩個端點 public: Line(Point a,Point b); //構造函數(shù) Void Draw(void); //畫出線段 ; //...函數(shù)的實現(xiàn)略,49,51,類組合的構造函數(shù)設計,原則:不僅要負責對本類中的基本類型成員數(shù)據(jù)賦初值,也要對對象成員初始化。 聲明形式: 類名::類名(對象成員所需的形參,本類成員形參) :對象1(參數(shù)),對象2(參數(shù)),...... 本類初始化 ,類 的 組 合,52,類組合的構造函數(shù)調(diào)用,構造函數(shù)調(diào)用順序:先調(diào)用內(nèi) 22、嵌對象的構造函數(shù)(按內(nèi)嵌時的聲明順序,先聲明者先構造)。然后調(diào)用本類的構造函數(shù)。(析構函數(shù)的調(diào)用順序相反) 若調(diào)用默認構造函數(shù)(即無形參的),則內(nèi)嵌對象的初始化也將調(diào)用相應的默認構造函數(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,前向引用聲明,類應該先聲明,后使用 如果需要在某個類的聲明之前,引用該類,則應進行前向引用聲明。 前向引用聲明只為程序引入一個標識符,但具體聲明在其它地方。 當使用前面引用聲明時,只能使用被聲明的符號,不能涉及類的任何細節(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、應該記住:當你使用前向引用聲明時,你只能使用被聲明的符號,而不能涉及類的任何細節(jié)。,類 的 組 合,61,UML簡介,UML語言是一種可視化的的面向?qū)ο蠼UZ言。 UML有三個基本的部分 事物(Things)UML中重要的組成部分,在模型中屬于最靜態(tài)的部分,代表概念上的或物理上的元素 關系(Relationships)關系把事物緊密聯(lián)系在一起 圖(Diagrams)圖是很多有相互相關的事物的組,UML圖形標識,62,UML中有4種類型的事物,結構事物(Structural things) 動作事物(Behavioral things) 分組事物(Grouping things) 注釋事物(An 27、notational things),UML圖形標識,63,UML中的關系,依賴(Dependencies) 關聯(lián)(Association) 泛化(generalization) 實現(xiàn)(realuzation),UML圖形標識,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圖形標識,65,類圖,舉例:Clock類的完整表示 Clock類的簡潔表示,,,UML圖形標識,66,對象圖,,,,UML圖形標識,67,類與對象關系的圖形標識,依賴關系 圖中的“類A”是源,“類B”是目標,表示“類A”使用了“類B”,或稱“類A”依賴“類B”,UML圖形標識,68,類與對象關系的圖形標識,作用關系關聯(lián) 圖中的“重數(shù)A”決定了類B的每個對象與類A的多少個對象發(fā)生作用,同樣“重數(shù)B”決定了類A的每個對象與類B的多少個對象發(fā)生作用。,UML圖形標識,69,類與對象關系的圖形標識,包含關系聚集和組合,聚集表示類之間的關系是整體與部分的關系,“包含”、“組成”、“分為部分”等都是聚集關系。,UML圖形標識,70,類與對象關系的圖形標識,繼承關系泛化,UML圖形標識,71,注釋,在UML圖形上,注釋表示為帶有褶角的矩形,然后用虛線連接到UML的其他元素上,它是一種用于在圖中附加文字注釋的機制。,,UML圖形標識,,
- 溫馨提示:
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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《晏子使楚》優(yōu)秀課件 (3)
- 科室醫(yī)院年終總結課件
- 常用邏輯用語章末總結課件(人教A版選修1-1)免
- 新版PEP四年級英語上冊Unit3-My-Friends-B-Let’s-learn完美版-PPT
- 金融科技機遇
- 抗菌藥物合理使用專家講座
- 阿奇霉素在臨床中的應用專家講座
- 納米抗菌蠶絲被介紹
- 男性盆部和會陰斷層解剖研究
- 部編選擇性必修二經(jīng)濟與社會生活-第九課世紀以來人類的經(jīng)濟與生活教學課件
- 春七年級數(shù)學下冊 82 整式乘法單項式與單項式相乘課件4 (新版)滬科版
- 部編人教版語文七年級下冊7.土地的誓言課件
- 手足口病
- 正壓通氣裝置課件
- 課件】食品分析與檢驗技術第二章