构造函数的初始化表
1. 如果类存在继承关系,那么派生类中必须在初始化列表中调用基类的构造函数;
class A {… A(int x); // A的构造函数 }; class B : public A {… B(int x, int y); // B的构造函数 }; B::B(int x, int y): A(x) // 在初始化表里调用A的构造函数 { … }
2. const数据成员必须在初始化列表中进行初始化。因为const常量是属于对象的常量,而不是整个类的常量,对于每个对象,常量的值是不同的,在初始化列表中进行初始化。
3. 类的数据成员初始化,分为对象成员,和一般数据成员。可以在初始化列表中进行,也可以在构造函数内部进行。对于对象成员,采用初始化列表会更方便,因为初始化列表中初始化对象成员,直接调用的是拷贝构造函数。如果在函数体内初始化对象成员,是需要先调用对象成员类的构造函数,再调用赋值运算符函数进行赋值。
class A {… A(void); // 无参数构造函数 A(const A &other); // 拷贝构造函数 A & operate =( const A &other); // 赋值函数 }; class B { public: B(const A &a); // B的构造函数 private: A m_a; // 成员对象 }; B构造函数方法一: B::B(const A &a): m_a(a) //调用的是拷贝构造函数初始化m_a { … } 方法二: B::B(const A &a) { m_a = a;//先调用A的构造函数,创建对象m_a,再调用A的赋值函数进行赋值 … }