C++中的成員物件

weixin_34162629發表於2015-07-09

 

原文連結: http://blog.csdn.net/rhzwan123/article/details/2105205

【概念】

成員物件:當一個類的成員是另一個類的物件時,這個物件就叫成員物件。概括的說,就是一個類的成員是一個物件,即成員物件。

例如:

#include<iostream>
using namespace std;

class Date{  ...};  //建立一個物件Date,類體略

class Time
{ Date d1 , d2;};  //建立一個物件Time,該物件有兩個資料成員d1和d2,這兩個成員是Date類的兩個物件

在這個例子中,Time的成員d1和d2是Date的物件,那麼d1和d2就是成員物件。

【要求】

1、出現成員物件時,該類的建構函式要包含對成員的初始化。如果建構函式的成員初始化列表沒有對成員物件初始化時,則使用成員物件的預設建構函式。

 如上例中的Time中,有兩個成員物件d1和d2,那麼在Time類的建構函式中,就應該包含對d1和d2的初始化,這個初始化通常採用成員初始化列表的方式進行。

建構函式對成員物件初始化列表的格式為:

<類名>::<類名>(<總參數列>):<成員物件1>(<形參表1>), <成員物件2>(<形參表2>),……

{ //函式體 }

如上例的Time類的建構函式可以這樣定義:
<Time>::<Time>(int m):d1(m),d2(5);    //如果在類體內定義,則省略<Time>::
   {   ...    }

該例中d1被初始化為d1(m),d2被初始化為d2(5).

再如:
<Time>::<Time>(int m):d1(m)     //如果在類體內定義,則省略<Time>::
   {   ...    }

該例中d1被初始化為d1(m),d2未被初始化.

2、建立一個類的物件時,應先呼叫其建構函式。但是如果這個類有成員物件,則要先執行成員物件自己所屬類的建構函式,當全部成員物件都執行了自身類的建構函式後,再執行當前類的建構函式。

如上例修改如下:

#include<iostream>
using namespace std;

class Date

 public:
 Date( ){ cout<<"This is Date"<<endl; }      //Date的預設建構函式
 Date(int A) { cout<<"The value="<<A<<endl; };
 
class Time
 {  
   public:
    Time( ) {cout<<"This is Time"<<endl;  //Time的預設建構函式
    Time(int A):d2( A )   //Time的建構函式。採用成員初始化列表的方式,成員物件d1的形參未初始化
   ,將成員物件d2的形參初始化為A
   {
        cout<<"Hello!"<<endl;
   }

   private:
   Date d1 , d2;        //在Time中宣告兩個資料成員d1和d2,這兩個成員是Date類的兩個物件,即d1和d2是成員物件
};

 void main( )
  {
     Time t1, t2(6);   //註釋1
     cout<<"The end"<<endl;
  }

註釋1:

主程式執行到Time t1 , t2時,會檢查Time類中是否有成員物件,檢查中根據Date d1 , d2;  發現有成員物件d1和d2,就先執行d1和d2對應的Date類中的建構函式,然後再執行Time中的建構函式。
具體步驟為:

(一)在建立t1物件(無引數)時,按下列步驟進行:
1、執行d1所屬類Date的建構函式,因為d1在Time中未初始化,故在過載時呼叫預設建構函式,輸出 This is Date;
2、執行d2所屬類Date的建構函式,因為d1在Time中未初始化,故在過載時呼叫預設建構函式,輸出 This is Date;
3、執行t1所屬類Time的建構函式,因為d1在Time中未初始化,故在過載時呼叫預設建構函式,輸出 This is time;

(二)在建立t2物件(有引數)時,按下列步驟進行:
4、執行d1所屬類Date的建構函式,因為d1在Time中未初始化,故在過載時呼叫預設建構函式,輸出 This is Date.
5、執行d2所屬類Date的建構函式,根據Time中 Time(int A):d2(A); 發現d2已經被初始化為d2(A),在這裡即為d2(6),由此則需要呼叫Date類的建構函式Date(int A),輸出 The value= .
6、執行t2所屬類Time的建構函式,t2的過載函式應為Time(int A),輸出 Hello.

 

相關文章