例子
class Father //作为Family的分类
{
public:
int m_Fnum;
Father(int num){m_Fum = num;}
}
class Mother //作为Family的分类
{
public:
Mother(){}
}
class Family //Family类
{
public:
Family();
protected:
Father f; //Father对象
Mother m; //Mother对象
}
//分类构造函数
Family:Family(int num1):f(num1) //初始化参数列表
{
}
int main()
{
Family MyFamily(1);
return 0;
}
过程
例子中创建了一个Family对象,并传了一个参数1,注意在Family的构造函数中,调用了Father的有参构造函数传参数1,初始化了Father自身的成员变量m_Fnum。同时也调用了Mother的无参构造(虽然没有写)。
- 组合类必须使用初始化参数列表对分类初始化(例子中的Father有参构造)。当然,也可以在分类中写无参构造(例子中的Mother无参构造),就不必初始化。
- 例子中,虽然Mother的对象没出现在初始化参数列表中,但是它也默认调用了无参构造。
构造函数调用顺序
例子中有两个类,它们的构造函数谁先调用谁后调用?
答:构造函数的调用顺序和参数列表无关,只和声明顺序有关,也就是说,把Father f;Mather m;
调转顺序,那么它的构造函数调用顺序也调转。
析构函数调用顺序
和构造函数调用顺序相反。
组合类的应用:在mfc中的窗口类及其下的控件类