




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第4講 類與對象(2)目錄目錄4.1 面向對象程序設計的基本特點4.2 類和對象類和對象4.3 構造函數和析構函數構造函數和析構函數4.4 類的組合類的組合4.5 UML圖形標識4.6 結構體和聯合體24.4.1組合 類中的成員數據是另一個類的對象。 可以在已有抽象的基礎上實現更復雜的抽象。例:線段類34.4 類的組合類組合的構造函數設計 原則:不僅要負責對本類中的基本類型成員數據賦初值,也要對對象成員初始化。 聲明形式:類名:類名(對象成員所需的形參,本類成員形參) :對象1(參數),對象2(參數),. /函數體其他語句44.4 類的組合 4.4.1 組合初始化列表初始化列表構造組合類對象時
2、的初始化次序 首先對構造函數初始化列表中列出的成員(包括基本類型成員和對象成員)進行初始化,初始化次序是成員在類體中定義的次序。成員對象構造函數調用順序:按對象成員的聲明順序,先聲明者先構造。初始化列表中未出現的成員對象,調用用默認構造函數(即無形參的)初始化 處理完初始化列表之后,再執行構造函數的函數體。54.4 類的組合 4.4.1 組合例4-4 類的組合,線段(Line)類/4_4.cpp#include #include using namespace std;class Point /Point類定義public:Point(int xx = 0, int yy = 0) /構造函數
3、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 Calling the copy constructor of Point endl;64.4 類的組合 4.4.1 組合例4-4(續)/類的組合class Line /Line類的定義public:/外部接口Line(Point xp1, Point xp2);Line(Line
4、 &l);double getLen() return len; private:/私有數據成員Point p1, p2;/Point類的對象p1,p2double len;/組合類的構造函數Line:Line(Point xp1, Point xp2) : p1(xp1), p2(xp2) cout Calling constructor of Line endl;double x = static_cast(p1.getX() - p2.getX();double y = static_cast(p1.getY() - p2.getY();len = sqrt(x * x + y
5、* y);Line:Line (Line &l): p1(l.p1), p2(l.p2) /組合類的復制構造函數cout Calling the copy constructor of Line endl;len = l.len;74.4 類的組合 4.4.1 組合例4-4(續)/主函數int main() Point myp1(1, 1), myp2(4, 5);/建立Point類的對象Line line(myp1, myp2);/建立Line類的對象Line line2(line);/利用復制構造函數建立一個新對象cout The length of the line is: ;c
6、out line.getLen() endl;cout The length of the line2 is: ;cout line2.getLen() endl;return 0;84.4 類的組合 4.4.1 組合運行結果如下:Calling the copy constructor of PointCalling the copy constructor of PointCalling the copy constructor of PointCalling the copy constructor of PointCalling constructor of LineCalling t
7、he copy constructor of PointCalling the copy constructor of PointCalling the copy constructor of LineThe length of the line is: 5The length of the line2 is: 54.4.2 前向引用聲明 類應該先聲明,后使用 如果需要在某個類的定義之前,引用該類,則應進行前向引用聲明。 前向引用聲明只為程序引入一個標識符,但具體聲明在其他地方。94.4 類的組合舉例class B; /前向引用聲明class A public: void f(B b);cla
8、ss B public: void g(A a);104.4 類的組合 4.4.2 前向引用聲明前向引用聲明注意事項 使用前向引用聲明雖然可以解決一些問題,但它并不是萬能的。需要注意的是,盡管使用了前向引用聲明,但是在在提供一個完整的類聲明之前,不能聲明該類的對象提供一個完整的類聲明之前,不能聲明該類的對象,也不也不能在內聯成員函數中使用該類的對象能在內聯成員函數中使用該類的對象。請看下面的程序段:114.4 類的組合 4.4.2 前向引用聲明class Fred; /前向引用聲明class Barney Fred x; /錯誤:類Fred的聲明尚不完善;class Fred Barney y
9、;前向引用聲明注意事項(續)class Fred; /前向引用聲明 class Barney public: void method() x.yabbaDabbaDo(); /錯誤:Fred類的對象在定義之前被使用 private: Fred &x;/正確,經過前向引用聲明,可以聲明Fred類的對象引用; class Fred public: void yabbaDabbaDo();private: Barney &y; 124.4 類的組合 4.4.2 前向引用聲明前向引用聲明注意事項 應該記住:當你使用前向引用聲明時,你只能使用被聲明只能使用被聲明的符號的符號,而不能涉及類
10、的任何細節而不能涉及類的任何細節。134.4 類的組合 4.4.2 前向引用聲明4.5.1 UML簡介 UML(Unified Modeling Language)語言是一種可視化的的面向對象建模語言。 UML有三個基本的部分 事物(Things)UML中重要的組成部分,在模型中屬于最靜態的部分,代表概念上的或物理上的元素 關系(Relationships)關系把事物緊密聯系在一起 圖(Diagrams)圖是很多有相互相關的事物的組144.5 UML圖形標識4.5.2 UML類圖 舉例:Clock類的完整表示 Clock類的簡潔表示154.5 UML圖形標識Clock- hour : int-
11、 minute : int- second : int+ showTime() : void+ setTime(newH:int=0,newM:int=0,newS:int=0):voidClock類名數據成員函數成員對象圖164.5 UML圖形標識 4.5.2 UML類圖myClock : Clock- hour : int- minute : int- second : intmyClock : Clock數據成員可選例4-5 采用UML方法來描述例4-4中Line類和Point類的關系174.5 UML圖形標識 4.5.2 UML類圖Point- x : int- y : int+ Po
12、int(xx : int = 0, yy : int = 0)+ Point(p : Point &)+ getX() : int+ getY() : intLine- len : double+ Line(xp1 : Point, xp2 : Point)+ Line( : Line &)+ getLen() : double幾種關系的圖形標識 依賴關系表示“類A”使用了“類B”,或稱“類A”依賴“類B” 也可以這樣說,要完成類A里的所有功能, 一定要有類B的方法協助才行184.5 UML圖形標識 4.5.2 UML類圖類 A類 B例4-5 采用UML方法來描述例4-4中Li
13、ne類和Point類的依賴關系194.5 UML圖形標識 4.5.2 UML類圖Point- x : int- y : int+ Point(xx : int = 0, yy : int = 0)+ Point(p : Point &)+ getX() : int+ getY() : intLine- len : double+ Line(xp1 : Point, xp2 : Point)+ Line( : Line &)+ getLen() : double幾種關系的圖形標識 作用關系關聯圖中的“重數A”決定了類B的每個對象與類A的多少個對象發生作用,同樣“重數B”決定了類A
14、的每個對象與類B的多少個對象發生作用。204.5 UML圖形標識 4.5.2 UML類圖類 A重數A類 B重數B例4-5 采用UML方法來描述例4-4中Line類和Point類的關系214.5 UML圖形標識 4.5.2 UML類圖Point- x : int- y : int+ Point(xx : int = 0, yy : int = 0)+ Point(p : Point &)+ getX() : int+ getY() : intLine- len : double+ Line(xp1 : Point, xp2 : Point)+ Line( : Line &)+ g
15、etLen() : double-p1-p21.*21.*幾種關系的圖形標識 包含關系聚集和組合 聚集 組合表示類之間的關系是整體與部分的關系整體與部分的關系,224.5 UML圖形標識 4.5.2 UML類圖類 A類 B重數A重數B類 A類 B重數A重數B例4-5 采用UML方法來描述例4-4中Line類和Point類的關系234.5 UML圖形標識 4.5.2 UML類圖Point- x : int- y : int+ Point(xx : int = 0, yy : int = 0)+ Point(p : Point &)+ getX() : int+ getY() : intL
16、ine- len : double+ Line(xp1 : Point, xp2 : Point)+ Line( : Line &)+ getLen() : double-p1-p21.*21.*幾種關系的圖形標識 繼承關系泛化 例:動物類和老虎類244.5 UML圖形標識 4.5.2 UML類圖父類 A子類 1子類 2注釋 在UML圖形上,注釋表示為帶有褶角的矩形,然后用虛線連接到UML的其他元素上,它是一種用于在圖中附加文字注釋的機制。254.5 UML圖形標識 4.5.2 UML類圖注釋文字例4-6帶有注釋的Line類和Point類關系的描述264.5 UML圖形標識 4.5.2
17、 UML類圖Point- x : int- y : int+ Point(xx : int = 0, yy : int = 0)+ Point(p : Point &)+ getX() : int+ getY() : intLine- len : double+ Line(xp1 : Point, xp2 : Point)+ Line( : Line &)+ getLen() : double-p1-p21.*21.*單向組合:直線段包含端點p1、p24.6.1 結構體 結構體是一種特殊形態的類 與類的唯一區別:類的缺省訪問權限是private,結構體的缺省訪問權限是publi
18、c 結構體存在的主要原因:與C語言保持兼容 什么時候用結構體而不用類 定義主要用來保存數據、而沒有什么操作的類型 人們習慣將結構體的數據成員設為公有,因此這時用結構體更方便274.6 結構體和聯合體結構體的定義和初始化 結構體定義struct 結構體名稱 公有成員protected: 保護型成員private: 私有成員; 一些結構體變量的初始化可以用以下形式類型名 變量名 = 成員數據1初值, 成員數據2初值, ;284.6 結構體和聯合體 4.6.1 結構體例4-7用結構體表示學生的基本信息#include #include #include using namespace std;str
19、uct Student /學生信息結構體int num;/學號string name;/姓名,字符串對象,將在第6章詳細介紹char sex;/性別int age;/年齡;294.6 結構體和聯合體 4.6.1 結構體例4-7(續)int main() Student stu = 97001, Lin Lin, F, 19 ;cout Num: stu.num endl;cout Name: endl;cout Sex: stu.sex endl;cout Age: stu.age endl;return 0;運行結果:Num: 97001Name: Lin LinSex:
20、FAge: 19304.6 結構體和聯合體 4.6.1 結構體4.6.2 聯合體 聲明形式union 聯合體名稱 公有成員protected: 保護型成員private: 私有成員; 特點:成員共用相同的內存單元任何兩個成員不會同時有效314.6 結構體和聯合體聯合體的內存分配union Mark /表示成績的聯合體char grade; /等級制的成績bool pass;/只記是否通過課程的成績int percent;/百分制的成績;324.6 結構體和聯合體 4.6.2 聯合體Markgradepercentpass無名聯合例:例:union int i; float f;在程序中可以這樣
21、使用:i = 10;f = 2.2;334.6 結構體和聯合體 4.6.2 聯合體無名聯合沒有標記名,只是聲明一個成員項的集合,這些成員項具有相同的內存地址,可以由成員項的名字直接訪問。例4-8使用聯合體保存成績信息,并且輸出。#include #include using namespace std;class ExamInfo private:string name;/課程名稱/采用何種計分方式enum GRADE, PASS, PERCENTAGE mode; union char grade;/等級制的成績bool pass;/只記是否通過課程的成績int percent;/百分制的成
22、績;344.6 結構體和聯合體 4.6.2 聯合體例4-8(續)public:/三種構造函數,分別用等級、是否通過和百分初始化ExamInfo(string name, char grade): name(name), mode(GRADE), grade(grade) ExamInfo(string name, bool pass): name(name), mode(PASS), pass(pass) ExamInfo(string name, int percent): name(name), mode(PERCENTAGE), percent(percent) void show();354.6
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 聚酯底漆行業深度研究分析報告(2024-2030版)
- 2025年 公路交通安全生產管理能力考試練習題附答案
- 2025年 蚌埠行知高級中學招聘考試筆試試題附答案
- 2023-2028年中國干果堅果行業市場發展監測及投資戰略咨詢報告
- 中國纖維柄斧子行業市場發展前景及發展趨勢與投資戰略研究報告(2024-2030)
- 中國天花板行業市場深度研究及發展趨勢預測報告
- 2025年中國點陣式顯示器行業發展潛力分析及投資方向研究報告
- 中國紫膠行業市場調查報告
- 2025年中國止擋片行業市場發展前景及發展趨勢與投資戰略研究報告
- 中國空調壓縮機減震墊行業市場發展前景及發展趨勢與投資戰略研究報告(2024-2030)
- 愛德華消防主機更換煙感編程
- 殯葬領域突出問題專項整治行動方案
- 第九屆全國大學生化學實驗邀請賽有機操作題
- 2023年上海市文物保護研究中心招聘筆試參考題庫(共500題)答案詳解版
- 南郵《數據結構》練習冊期末復習題
- 三年級科學下冊第二單元第5課自制小樂器課件
- 山東省臨沂市蘭山區2022-2023學年五年級下學期期末數學試卷
- 全國優質課一等獎職業學校教師信息化大賽建筑類《三面正投影圖》說課課件
- 農民工工資支付情況調查表
- 大眾Polo 2016款說明書
- 中建三局施工現場安全防護標準化圖冊
評論
0/150
提交評論