面向?qū)ο蟪绦蛟O(shè)計-5_第1頁
面向?qū)ο蟪绦蛟O(shè)計-5_第2頁
面向?qū)ο蟪绦蛟O(shè)計-5_第3頁
面向?qū)ο蟪绦蛟O(shè)計-5_第4頁
面向?qū)ο蟪绦蛟O(shè)計-5_第5頁
已閱讀5頁,還剩30頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、面向?qū)ο竺嫦驅(qū)ο蟪绦蛟O(shè)計程序設(shè)計(C+C+)第第5 5講講 類與對象類與對象(3)(3)多個類之間的關(guān)系多個類之間的關(guān)系問題問題構(gòu)造函數(shù)構(gòu)造函數(shù)只能有一個。(判斷正誤)只能有一個。(判斷正誤)析構(gòu)函數(shù)析構(gòu)函數(shù)只能有一個。只能有一個。 (判斷正誤)(判斷正誤)構(gòu)造函數(shù)構(gòu)造函數(shù)與與析構(gòu)函數(shù)析構(gòu)函數(shù)的調(diào)用時機?的調(diào)用時機?拷貝(復(fù)制)構(gòu)造函數(shù)與構(gòu)造函數(shù)的拷貝(復(fù)制)構(gòu)造函數(shù)與構(gòu)造函數(shù)的區(qū)別區(qū)別?它的?它的調(diào)用時機調(diào)用時機?3組合的概念組合的概念類中的成員數(shù)據(jù)是另一個類的對象。類中的成員數(shù)據(jù)是另一個類的對象??梢栽谝延谐橄蟮幕A(chǔ)上實現(xiàn)更復(fù)雜的可以在已有抽象的基礎(chǔ)上實現(xiàn)更復(fù)雜的抽象。抽象。類 的 組 合

2、4舉例舉例class Point class Point private:private: float x, y; / float x, y; /點的坐標(biāo)點的坐標(biāo)public:public: Point(float h, float v); Point(float h, float v); float getX(); / float getX(); /取取X X坐標(biāo)坐標(biāo) float getY(); / float getY(); /取取Y Y坐標(biāo)坐標(biāo) void draw(); /void draw(); /在在(x,y)(x,y)處畫點處畫點;/./.函數(shù)的實現(xiàn)略函數(shù)的實現(xiàn)略類 的 組 合cl

3、ass Line class Line private:private: Point p1, p2; / Point p1, p2; /線段的兩個端點線段的兩個端點public:public: Line(Point a, Point b); / Line(Point a, Point b); /構(gòu)造函數(shù)構(gòu)造函數(shù) void draw(void); /void draw(void); /畫出線段畫出線段;/./.函數(shù)的實現(xiàn)略函數(shù)的實現(xiàn)略56類組合的構(gòu)造函數(shù)設(shè)計類組合的構(gòu)造函數(shù)設(shè)計原則:原則:不僅要負(fù)責(zé)對本類中的基本類型成員不僅要負(fù)責(zé)對本類中的基本類型成員數(shù)據(jù)賦初值,也要對對象成員初始化。數(shù)據(jù)賦初值

4、,也要對對象成員初始化。( (思思考為什么考為什么? ?) )聲明形式:聲明形式:類名類名:類名類名( (對象成員所需的形參,本類成員形參對象成員所需的形參,本類成員形參) ) : :對象對象1(1(參數(shù)參數(shù)) ),對象,對象2(2(參數(shù)參數(shù)) ),. 本類初始化本類初始化 見見P119P119類 的 組 合7類組合的構(gòu)造函數(shù)調(diào)用類組合的構(gòu)造函數(shù)調(diào)用構(gòu)造函數(shù)調(diào)用順序:先調(diào)用內(nèi)嵌對象的構(gòu)造函數(shù)調(diào)用順序:先調(diào)用內(nèi)嵌對象的構(gòu)造函數(shù)(按內(nèi)嵌時的聲明順序,先聲構(gòu)造函數(shù)(按內(nèi)嵌時的聲明順序,先聲明者先構(gòu)造)。然后調(diào)用本類的構(gòu)造函明者先構(gòu)造)。然后調(diào)用本類的構(gòu)造函數(shù)。(析構(gòu)函數(shù)的調(diào)用順序相反)數(shù)。(析構(gòu)函數(shù)

5、的調(diào)用順序相反)類 的 組 合類組合的構(gòu)造函數(shù)調(diào)用類組合的構(gòu)造函數(shù)調(diào)用初始化列表中未出現(xiàn)的內(nèi)嵌對象,用默認(rèn)初始化列表中未出現(xiàn)的內(nèi)嵌對象,用默認(rèn)構(gòu)造函數(shù)(即無形參的)初始化構(gòu)造函數(shù)(即無形參的)初始化系統(tǒng)自動生成的隱含的默認(rèn)構(gòu)造函數(shù)中,系統(tǒng)自動生成的隱含的默認(rèn)構(gòu)造函數(shù)中,內(nèi)嵌對象全部用默認(rèn)構(gòu)造函數(shù)初始化內(nèi)嵌對象全部用默認(rèn)構(gòu)造函數(shù)初始化其它見其它見P118P1189類的組合舉例(二)類的組合舉例(二)class Part /部件類部件類public: Part(); Part(int i); Part(); void Print();private: int val;類 的 組 合class Wh

6、ole public: Whole(); Whole(int i, int j, int k); Whole(); void Print();private: Partone; Parttwo; int date;10Whole:Whole() date=0;Whole:Whole(int i, int j, int k) : two(i), one(j), date(k)/.其他函數(shù)的實現(xiàn)略11分析例4-4 p11813前向引用聲明類應(yīng)該先聲明,后使用如果需要在某個類的聲明之前,引用該類,則應(yīng)進行前向引用聲明。前向引用聲明只為程序引入一個標(biāo)識符,但具體聲明在其他地方。類 的 組 合14前向引

7、用聲明舉例class B; /前向引用聲明class A public: void f(B b);class B public: void g(A a);類 的 組 合15前向引用聲明注意事項使用前向引用聲明雖然可以解決一些問題,但它并不是萬能的。需要注意的是,盡管使用了前向引用聲明,但是在提供一個完整的類聲明之前,不能聲明該類的對象,也不能在內(nèi)聯(lián)成員函數(shù)中使用該類的對象。請看下面的程序段:class Fred; /前向引用聲明class Barney Fred x; /錯誤:類Fred的聲明尚不完善;class Fred Barney y;類 的 組 合16前向引用聲明注意事項應(yīng)該記?。寒?dāng)你

8、使用前向引用聲明時,你應(yīng)該記?。寒?dāng)你使用前向引用聲明時,你只能使用被聲明的符號,而不能涉及類的只能使用被聲明的符號,而不能涉及類的任何細節(jié)。任何細節(jié)。類 的 組 合17前向引用聲明注意事項class Fred;/前向引用聲明 class Barney public: void method() x.yabbaDabbaDo();/錯誤:Fred類的對象在定義之前被使用 private: Fred &x;/正確,經(jīng)過前向引用聲明,可以聲明Fred類的對象引用; class Fred public: void yabbaDabbaDo();private: Barney &y; 類

9、 的 組 合結(jié)構(gòu)體結(jié)構(gòu)體是一種特殊形態(tài)的類結(jié)構(gòu)體是一種特殊形態(tài)的類與類的唯一區(qū)別:類的缺省訪問權(quán)限是與類的唯一區(qū)別:類的缺省訪問權(quán)限是privateprivate,結(jié)構(gòu)體的缺省訪問權(quán)限是結(jié)構(gòu)體的缺省訪問權(quán)限是publicpublic結(jié)構(gòu)體存在的主要原因:與結(jié)構(gòu)體存在的主要原因:與C C語言保持兼容語言保持兼容什么時候用結(jié)構(gòu)體而不用類什么時候用結(jié)構(gòu)體而不用類定義主要用來保存數(shù)據(jù)、而沒有什么操作的類定義主要用來保存數(shù)據(jù)、而沒有什么操作的類型型人們習(xí)慣將結(jié)構(gòu)體的數(shù)據(jù)成員設(shè)為公有,因此人們習(xí)慣將結(jié)構(gòu)體的數(shù)據(jù)成員設(shè)為公有,因此這時用結(jié)構(gòu)體更方便這時用結(jié)構(gòu)體更方便18結(jié)構(gòu)體與聯(lián)合體結(jié)構(gòu)體的定義和初始化結(jié)構(gòu)

10、體定義結(jié)構(gòu)體定義struct struct 結(jié)構(gòu)體名稱結(jié)構(gòu)體名稱 公有成員公有成員protected:protected: 保護型成員保護型成員private:private: 私有成員私有成員;一些結(jié)構(gòu)體變量的初始化可以用以下形式一些結(jié)構(gòu)體變量的初始化可以用以下形式類型名類型名 變量名變量名 = = 成員數(shù)據(jù)成員數(shù)據(jù)1 1初值初值, , 成員數(shù)據(jù)成員數(shù)據(jù)2 2初值初值, , ;19結(jié)構(gòu)體與聯(lián)合體20無名聯(lián)合無名聯(lián)合無名聯(lián)合沒有標(biāo)記名,只是聲明一個成員無名聯(lián)合沒有標(biāo)記名,只是聲明一個成員項的集合,這些成員項具有相同的內(nèi)存地項的集合,這些成員項具有相同的內(nèi)存地址,可以由成員項的名字直接訪問。址,

11、可以由成員項的名字直接訪問。例:例:union union int i; int i; float f; float f; 在程序中可以這樣使用:在程序中可以這樣使用:i = 10;i = 10;f = 2.2;f = 2.2;結(jié)構(gòu)體與聯(lián)合體位域位域位域的聲明形式位域的聲明形式 數(shù)據(jù)類型說明符數(shù)據(jù)類型說明符 成員名成員名 : : 位數(shù)位數(shù); ;位域的作用位域的作用通過通過“打包打包”,使類的不同成員共享相同的字,使類的不同成員共享相同的字節(jié),從而節(jié)省存儲空間。節(jié),從而節(jié)省存儲空間。注意事項注意事項具體的打包方式,因編譯器而異;具體的打包方式,因編譯器而異;只有只有boolbool、charch

12、ar、intint和枚舉類型的成員,允許和枚舉類型的成員,允許定義為位域;定義為位域;節(jié)省空間,但可能增加時間開銷。節(jié)省空間,但可能增加時間開銷。21深 度 探 索例4-9設(shè)計一個結(jié)構(gòu)體存儲學(xué)生的成績信息,需設(shè)計一個結(jié)構(gòu)體存儲學(xué)生的成績信息,需要包括學(xué)號、年級和成績?nèi)梼?nèi)容,學(xué)號要包括學(xué)號、年級和成績?nèi)梼?nèi)容,學(xué)號的范圍是的范圍是0 0到到99,999,99999,999,999,年級分為,年級分為freshmanfreshman、sophomoresophomore、juniorjunior、seniorsenior四四種,成績包括種,成績包括A A、B B、C C、D D四個等級。四個等級

13、。22深 度 探 索例4-9#include using namespace std;enum Level FRESHMAN, SOPHOMORE, JUNIOR, SENIOR ;enum Grade A, B, C, D ;class Student public:Student(unsigned number, Level level, Grade grade): number(number), level(level), grade(grade) void show();private:unsigned number : 27;Level level : 2;Grade grade :

14、 2;23深 度 探 索例4-9void Student:show() cout Number: number endl;cout Level: ;switch (level) case FRESHMAN: cout freshman; break;case SOPHOMORE: cout sophomore; break;case JUNIOR: cout junior; break;case SENIOR: cout senior; break;cout endl;cout Grade: ;switch (grade) case A: cout A; break;case B: cout

15、B; break;case C: cout C; break;case D: cout D; break;cout endl;24深 度 探 索例4-9int main() Student s(12345678, SOPHOMORE, B);cout Size of Student: sizeof(Student) endl;s.show();return 0;運行結(jié)果:(運行結(jié)果第一行會因編譯環(huán)境的不同而有所差異)運行結(jié)果:(運行結(jié)果第一行會因編譯環(huán)境的不同而有所差異)Size of Student: 4Number: 12345678Level: sophomoreGrade: B25深

16、度 探 索臨時對象與類型轉(zhuǎn)換( 例例4-24-2中中PointPoint構(gòu)造函數(shù):構(gòu)造函數(shù):Point(int xx = 0, int yy = Point(int xx = 0, int yy = 0) 0) )臨時對象的顯式創(chuàng)建臨時對象的顯式創(chuàng)建可以直接調(diào)用類的構(gòu)造函數(shù)顯式創(chuàng)建臨時對象可以直接調(diào)用類的構(gòu)造函數(shù)顯式創(chuàng)建臨時對象例:例:Line x(Point(1, 1), Point(4, 5);Line x(Point(1, 1), Point(4, 5);臨時對象到表達式執(zhí)行完畢后即銷毀臨時對象到表達式執(zhí)行完畢后即銷毀單參數(shù)構(gòu)造函數(shù)可以設(shè)立類型轉(zhuǎn)換單參數(shù)構(gòu)造函數(shù)可以設(shè)立類型轉(zhuǎn)換Point

17、(1)Point(1)表示創(chuàng)建一個臨時對象,同時也表示顯式類型表示創(chuàng)建一個臨時對象,同時也表示顯式類型轉(zhuǎn)換轉(zhuǎn)換與與Point(1)Point(1)等價的形式:等價的形式: (Point) 1(Point) 1 static_cast(1)static_cast(1)無論形式為何,執(zhí)行轉(zhuǎn)換時都會創(chuàng)建臨時對象無論形式為何,執(zhí)行轉(zhuǎn)換時都會創(chuàng)建臨時對象26深 度 探 索static_caststatic_cast轉(zhuǎn)換類似于轉(zhuǎn)換類似于C/C+C/C+里面的強制類型轉(zhuǎn)換。里面的強制類型轉(zhuǎn)換。 dynamic_castdynamic_cast轉(zhuǎn)換是根據(jù)基類派生類的原則進行轉(zhuǎn)換,把一個派轉(zhuǎn)換是根據(jù)基類派生類的

18、原則進行轉(zhuǎn)換,把一個派生類轉(zhuǎn)換為基類使用這個轉(zhuǎn)換。生類轉(zhuǎn)換為基類使用這個轉(zhuǎn)換。 const_castconst_cast轉(zhuǎn)換是去掉轉(zhuǎn)換是去掉constconst變量的變量的constconst隱含轉(zhuǎn)換隱含轉(zhuǎn)換由構(gòu)造函數(shù)確立的類型轉(zhuǎn)換,可以隱含執(zhí)行例:Line x(1, 4);效果:構(gòu)造以(1,0)和(4,0)兩坐標(biāo)為端點的線段,這里Point的構(gòu)造函數(shù)被隱含調(diào)用避免隱含轉(zhuǎn)換的發(fā)生在構(gòu)造函數(shù)中使用explicit關(guān)鍵字,explicit要寫在類定義中的構(gòu)造函數(shù)前27深 度 探 索例4-10#include using namespace std;class Complex /復(fù)數(shù)類private

19、: float real, imag;/復(fù)數(shù)的實部和虛部public: /構(gòu)造函數(shù),可以當(dāng)作隱式類型轉(zhuǎn)換使用 Complex(float real = 0, float imag = 0) : real(real), imag(imag) Complex add(Complex c) /復(fù)數(shù)加法,生成臨時對象并返回 return Complex(real + c.real, imag + c.imag); Complex sub(Complex c) /復(fù)數(shù)減法,生成臨時對象并返回 return Complex(real - c.real, imag - c.imag); Complex mu

20、l(Complex c) /復(fù)數(shù)乘法,生成臨時對象并返回 return Complex(real * c.real - imag * c.imag, real * c.imag + imag * c.real); 28深 度 探 索例4-10 void show() /顯示復(fù)數(shù)顯示復(fù)數(shù) if (imag = 0) cout real + imag i endl; else cout real - -imag i endl; ;int main() Complex z(1, 2);/z = 1 + 2iz.add(Complex(3, 4).show(); /Complex(3, 4)是臨時對象

21、是臨時對象static_cast(5).sub(z).show(); /輸出輸出5 z,使用了顯示,使用了顯示類型轉(zhuǎn)換類型轉(zhuǎn)換z.mul(-3.0f).show(); /輸出輸出z * (-3),使用了隱含類型轉(zhuǎn)換,使用了隱含類型轉(zhuǎn)換return 0;運行結(jié)果:運行結(jié)果:4 + 6i4 - 2i-3 - 6i29深 度 探 索成員函數(shù)的調(diào)用成員函數(shù)的調(diào)用成員函數(shù)調(diào)用的實現(xiàn)機制成員函數(shù)調(diào)用的實現(xiàn)機制問題的關(guān)鍵:如何傳遞調(diào)用的目的對象問題的關(guān)鍵:如何傳遞調(diào)用的目的對象解決辦法:把目的對象的引用當(dāng)作參數(shù)傳遞解決辦法:把目的對象的引用當(dāng)作參數(shù)傳遞30void Clock:setTime(int new

22、H, int newM, int newS) hour = newH; minute = newM; second = newS;void Clock_setTime(_Clock &_this, int newH, int newM, int newS) _this.hour = newH; _this.minute = newM; _this.second = newS;Clock_setTime(myClock, 8, 30, 30);myClock.setTime(8, 30, 30);深 度 探 索構(gòu)造函數(shù)的調(diào)用構(gòu)造函數(shù)的調(diào)用31Line:Line(Point xp1, Po

23、int xp2) : p1(xp1), p2(xp2) double x = p1.getX() - p2.getX(); double y = p1.getY() - p2.getY(); len = sqrt(x * x + y * y);void Line_Line(_Line &_this, _Point xp1, _Point xp2) Point_Point(_this.p1, xp1); Point_Point(_this.p2, xp2); double x = Point_getX(_this.p1) - Point_getX(_this.p2); double y = Point_getY(_this.p1) - Point_getY(_this.p2); _this.len = sqrt(x * x + y * y);Line line(myp1, myp2);_Line line;Line_Line(line, myp1, myp2);先分配空間,再調(diào)用構(gòu)造函數(shù)先分配空間,再調(diào)用構(gòu)造函數(shù)深 度 探 索對象作為參數(shù)的傳遞方式對象作為參數(shù)的傳遞方式對象參數(shù)的傳遞方式對象參數(shù)的傳遞方式通過運行棧來傳遞通過運行棧來傳遞主調(diào)函數(shù)調(diào)用拷貝構(gòu)造函數(shù),在運行棧的傳參主調(diào)函數(shù)調(diào)用拷貝構(gòu)造函數(shù),在運行棧的傳參區(qū)域上創(chuàng)建對象區(qū)域上創(chuàng)建對象被調(diào)函數(shù)可以讀取傳參

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論