类的数据成员可以是简单类型或自定义类型的变量,也可以是类类型的对象。因此可以利用已定义的类来构造成新的类,使得一些复杂的类可以由一些简单类组合而成。类的聚集描述的就是一个类使用其他类的对象作为成员的情况。
当一个类的成员时另一个类的对象时,该对象就称为成员对象。当类中出现了成员对象时,该类的构造函数就要包括对成员对象的初始化,成员对象的初始化工作也是在成员初始化列表中完成的。初始化地格式如下:
<类名>::<类名>(<总形参表>):<成员函数1>(<形参表1>),<成员函数2>(<形参表2>),......
{
......
}
建立一个类的对象时,要调用它的构造函数对类对象初始化,此时应先执行初始化列表对各个成员进行初始化,在执行当前类的构造函数体。如果类中包含有成员函数,注意要根据初始化的参数调用成员对象的构造函数对其进行初始化。析构函数的执行顺序与构造函数的执行顺序相反。
在对成员对象初始化时,根据初始化列表的特点可知:类中有多个成员对象时,要按照定义成员对象的顺序建立各个子集,即成员对象构造函数的执行顺序仅与成员对象在类中声明的顺序有关,而与成员初始化列表中给出的成员对象的顺序无关。如果在构造函数的初始化列表中没有给出对成员对象的初始化,则表示使用成员对象的默认构造函数。如果成员对象所在的类中没有默认构造函数,将产生错误。
例1 分析下列程序的输出结果
#include<iostream>
using namespace std;
class Counter
{
private:
int val;
public:
Counter() :val(0) { cout << "Conster无参构造" << endl; }
Counter(int x) :val(x) { cout << "Counter带参构造" << endl; }
~Counter() { cout << "Counter析构" << val <<endl; }
};
class Example
{
public:
Example() :val(0) { cout << "Example无参构造" << endl; }
Example(int x) :c2(x), val(x) { cout << "Example带参构造" << endl; }
~Example() { cout << "Example析构" <<val<< endl; }
void Print()const { cout << "val=" << val << endl; }
private:
Counter c1, c2;
int val;
};
int main()
{
Example e1, e2(4);
e2.Print();
return 0;
}
上述程序中,首先创建e1对象时,初始化列表为空,表示对三个数据成员进行默认初始化,其中调用了成员c1和c2默认构造函数。在建立e2对象时,对c1进行了默认构造,但对c2进行了带参构造。
参考《全国计算机等级考试二级教程——C++语言程序设计》