构造函数初始化列表
如果我们有一个类成员,它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,没有默认构造函数。这时要对这个类成员进行初始化,就必须调用这个类成员的带参数的构造函数,如果没有初始化列表,那么他将无法完成第一步,就会报错。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| #include <iostream> using namespace std; class A { public: A(int a) { m_a = a; }
private: int m_a; };
class B { public: B(int b) { m_b = b; } private: int m_b; A obja; }; int main(void) { A obja(10); B objb(20); return 0; }
|
语法:
构造函数名(参数1,...,参数n):本类成员名1(参数1),...,本类成员名n(参数n)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| #include <iostream> using namespace std; class A { public: A(int a) { m_a = a; }
private: int m_a; };
class B { public: B(int b, A &tempA):m_b(b),obja(tempA) { } B(int b) :m_b(b), obja(100) { } private: int m_b; A obja; };
int main(void) { A obja(10);
B objb(20,obja); B objb2(20); return 0; }
|
当类成员中含有一个const对象时,或者是一个引用时,他们也必须要通过成员初始化列表进行初始化,因为这两种对象要在声明后马上初始化,而在构造函数中,做的是对他们的赋值,这样是不被允许的。
初始化列表中的初始化顺序,与声明顺序有关,与前后赋值顺序无关。