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; }