1、解决的问题:
在 B 类中,组合了一个 A 类对象,其中A类设计了构造函数。由于构造函数的调用规则,设计了构造函数就必须调用,但在定义B类时没有机会初始化A,因此采用构造函数的初始化列表来解决。
2、构造和析构调用顺序
先执行被组合对象的构造函数,如果组合对象有多个,则按照定义顺序,而不是按照初始化列表顺序。
析构函数,和构造函数的调用顺序相反。
举例如下:
class A
{
public:
A(int a_)
{
a = a_;
cout << "A的构造函数,a: " << a << endl;
}
~A()
{
cout << "A的析构函数 " << endl;
}
private:
int a;
};
class B
{
public:
B(int b1_, int b2_) :a1(1), a2(2)
{
b1 = b1_;
b2 = b2_;
}
B(int b1_, int b2_, int m, int n) :a1(m), a2(n)
{
b1 = b1_;
b2 = b2_;
cout << "B的构造函数" << endl;
}
~B()
{
cout << "B的析构函数 " << endl;
}
private:
int b1, b2;
//A类别构造函数的调用与定义顺序有关,与初始化列表顺序无关。
A a1;
A a2;
};
void display()
{
B obj_b1(1, 2, 3, 4);
}
void main()
{
//A a0(10);
//B obj_b0(1, 2);
//B obj_b1(1, 2, 3, 4);
display();
system("pause");
}
3、类中定义 const 类型变量
必须要初始化,此处的变量 c 就是 const 类型的数据。
B(int b1_, int b2_, int m, int n) :a1(m), a2(n),c(3)
{
b1 = b1_;
b2 = b2_;
cout << "B的构造函数" << endl;
}