

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