构造函数初始化列表

构造函数初始化列表

如果我们有一个类成员,它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,没有默认构造函数。这时要对这个类成员进行初始化,就必须调用这个类成员的带参数的构造函数,如果没有初始化列表,那么他将无法完成第一步,就会报错。

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;
//当A的对象是B类的⼀一个成员的时候,在初始化B对象的时候,

//⽆无法给B分配空间,因为⽆无法初始化A类对象
};

int main(void)
{
A obja(10);
B objb(20);//error,

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:
//先初始化m_b,然后再初始化obja,初始化的顺序要看类的成员声明顺序,先声明谁就先初始化谁
B(int b, A &tempA):m_b(b),obja(tempA)
{
}
B(int b) :m_b(b), obja(100)//调用obja的有参构造函数
{
}
private:
int m_b;
A obja;
};

int main(void)
{
A obja(10);

B objb(20,obja);

B objb2(20);
return 0;
}

当类成员中含有一个const对象时,或者是一个引用时,他们也必须要通过成员初始化列表进行初始化,因为这两种对象要在声明后马上初始化,而在构造函数中,做的是对他们的赋值,这样是不被允许的。

初始化列表中的初始化顺序,与声明顺序有关,与前后赋值顺序无关。