版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、類重用的方式之一——組合,部件組裝的思想背景組合類與成員對象間的“has-a”關(guān)系組合類對象的構(gòu)造與析構(gòu),input,output,CPU,Memory,is_a 和 has_a 的區(qū)別。(屬于和包含),組合類的概念,類中的成員數(shù)據(jù)是另一個類的對象。描述的是一種包含與被包含的關(guān)系。,class Point{ private: float x, y; //點的坐標public: Point(floa
2、t h, float v); //構(gòu)造函數(shù) Point(Point &p); //拷貝構(gòu)造函數(shù) float GetX(); //取X坐標 float GetY(); //取Y坐標};//...函數(shù)的實現(xiàn)略,class Line{ private: Point p1, p2; //線段的兩個端點 double len;public:
3、Line(Point a, Point b); //構(gòu)造函數(shù) Line(Line &l); double GetLen() //求線段的長度};//...函數(shù)的實現(xiàn)略,舉例,,內(nèi)嵌對象,組合類的構(gòu)造函數(shù)設(shè)計,原則:不僅要負責(zé)對本類中的基本類型成員數(shù)據(jù)賦初值,也要對對象成員初始化。定義形式類名::類名(形參表) : 內(nèi)嵌對象1(參數(shù)),內(nèi)嵌對象2(參數(shù)), ......{ 本類初始化
4、},//組合類的構(gòu)造函數(shù)Line:: Line (Point xp1, Point xp2):p1(xp1),p2(xp2){cout<<"Line構(gòu)造函數(shù)被調(diào)用"<<endl;double x=double(p1.GetX()-p2.GetX());double y=double(p1.GetY()-p2.GetY());len=sqrt(x*x+y*y);},組合類
5、的構(gòu)造函數(shù)調(diào)用,構(gòu)造函數(shù)調(diào)用順序: 先調(diào)用內(nèi)嵌對象的構(gòu)造函數(shù)(按內(nèi)嵌時的聲明順序,先聲明者先構(gòu)造)。然后調(diào)用本類的構(gòu)造函數(shù)。(注:析構(gòu)函數(shù)的調(diào)用順序相反)若調(diào)用默認構(gòu)造函數(shù)(即無形參的),則內(nèi)嵌對象的初始化也將調(diào)用相應(yīng)的默認構(gòu)造函數(shù)。,組合類的拷貝構(gòu)造函數(shù),如果沒有編寫拷貝構(gòu)造函數(shù),編譯系統(tǒng)生成一個默認的拷貝構(gòu)造函數(shù)。在調(diào)用組合類的默認的拷貝構(gòu)造函數(shù)時,編譯系統(tǒng)自動調(diào)用內(nèi)嵌對象的拷貝構(gòu)造函數(shù)。編寫組合類的拷貝構(gòu)造函數(shù),需要
6、為內(nèi)嵌對象的拷貝構(gòu)造函數(shù)傳遞參數(shù)。例如:C::C(C &c1):b(c1.b){…},//組合類的拷貝構(gòu)造函數(shù)Line:: Line (Line &l): p1(l.p1), p2(l.p2){cout<<"Line拷貝構(gòu)造函數(shù)被調(diào)用"<<endl;len=l.len;},class Point{public: Point(int xx=0, i
7、nt yy=0) {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<<"Point拷貝構(gòu)造函數(shù)被調(diào)用"<<en
8、dl;},class Line { public: Line (Point xp1, Point xp2); Line (Line &l); double GetLen(){return len;} private: Point p1,p2; double len;};Line:: Line (Point xp1, Point xp2):
9、p1(xp1),p2(xp2){ cout<<"Line構(gòu)造函數(shù)被調(diào)用"<<endl; double x=double(p1.GetX()-p2.GetX()); double y=double(p1.GetY()-p2.GetY()); len=sqrt(x*x+y*y);}Line:: Line (Line &
10、l): p1(l.p1), p2(l.p2){ cout<<"Line拷貝構(gòu)造函數(shù)被調(diào)用"<<endl; len=l.len;},void main(){Point myp1(1,1),myp2(4,5);Line line(myp1,myp2);Line line2(line);
11、 cout<<"The length of the line is:";cout<<line.GetLen()<<endl;cout<<"The length of the line2 is:";cout<<line2.GetLen()<<endl;},運行結(jié)果:Point拷貝構(gòu)造函數(shù)被調(diào)用Point拷貝
12、構(gòu)造函數(shù)被調(diào)用Point拷貝構(gòu)造函數(shù)被調(diào)用Point拷貝構(gòu)造函數(shù)被調(diào)用Line構(gòu)造函數(shù)被調(diào)用Point拷貝構(gòu)造函數(shù)被調(diào)用Point拷貝構(gòu)造函數(shù)被調(diào)用Line拷貝構(gòu)造函數(shù)被調(diào)用The length of the line is:5The length of the line2 is:5,思考:,設(shè)計并測試一個名為Rectangle的矩形類,其屬性為矩形的左下角與右上角兩個點的坐標,能計算矩形的面積。,class A {
13、public: void f(B b); //以B類對象為形參的成員函數(shù)};class B{public: void g(A a); //以A類對象為形參的成員函數(shù)};,,兩個類互相引用,形成循環(huán)依賴。,前向引用聲明,類應(yīng)該先聲明,后使用。如果需要在某個類的聲明之前,引用該類,則應(yīng)進行前向引用聲明。前向引用聲明只為程序引入一個標識符,但具體聲明在其它地方。,class B; //前向引用聲明c
14、lass A {public: void f(B b); //以B類對象為形參的成員函數(shù)};class B{public: void g(A a); //以A類對象為形參的成員函數(shù)};,前向引用聲明注意事項,盡管使用了前向引用聲明,但是在提供一個完整的類定義之前,不能定義該類的對象,也不能在內(nèi)聯(lián)成員函數(shù)中使用該類的對象。,class Fred;//前向引用聲明class Barney {
15、Fred x;//錯誤:類Fred的定義尚不完善 };class Fred { Barney y; };,前向引用聲明注意事項,class Fred;//前向引用聲明class Barney{ public: void method() { x->f(); } private: Fred *x; };class Fred
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論