原文連結: 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.