1.问题由来
如果我们有一个类成员,它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,没有默认构造函数。
例如在下面这段代码的场景中,如何定义一个B对象则会报错,因为A没有无参构造函数。
class A
{
public:
A(int a) {
this->a = a;
}
private:
int a;
};
class B
{
private:
int b;
A a1;
A a2;
};
2.语法规则
为了解决上面的问题,C++提供了对象初始化列表功能来帮助进行对象的初始化。
语法规则定义如下:
Constructor::Contructor() : m1(v1), m2(v1,v2), m3(v3)
{
// some other assignment operation
}
例:
class A
{
public:
A(int a) {
this->a = a;
}
private:
int a;
};
class B
{
public:
//可以这样
B(int b1, int b2):a1(1),a2(2)
{}
//也可以这样
B(int b1, int b2, int m, int n) :a1(m), a2(n)
{}
private:
int b;
A a1;
A a2;
};
3.调用顺序
构造函数的调用顺序为:先执行被组合对象的构造函数,如果组合对象有多个,按照定义顺序(而不是初始化列表的顺序)
析构函数的调用顺序相反。