C++构造函数的初始化列表详解

📅 2026/7/13 6:37:11 👁️ 阅读次数 📝 编程学习
C++构造函数的初始化列表详解

1.问题

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

classA {

private:

intm_a;

public:

A(inta) {

cout <<"A(int a)......."<< endl;

m_a = a;

}

voidprint() {

cout <<"m_a="<< m_a << endl;

}

};

classB {

private:

intm_b;

A m_a1;

A m_a2;

public:

B(A& a1,A& a2,intb)

{

m_b = b;

m_a1(a1);//此处调用A的拷贝函数会报错

m_a2(a2);//此处调用A的拷贝函数会报错

}

};

错误:

2.解决方法(初始化列表)

将class B构造函数改写为:

1

2

3

4

5

6

public:

B(A& a1,A& a2,intb) :m_a1(a1),m_a2(a2)//构造函数的初始化列表

{

m_b = b;

}

};

完整代码如下:

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

40

41

42

43

44

#include <iostream>

usingnamespacestd;

classA {

private:

intm_a;

public:

A(inta) {

cout <<"A(int a)......."<< endl;

m_a = a;

}

voidprint() {

cout <<"m_a="<< m_a << endl;

}

A(constA& another) {

m_a = another.m_a;

}

~A() {

cout <<"~A()......"<< endl;

}

};

classB {

private:

intm_b;

A m_a1;

A m_a2;

public:

B(A& a1,A& a2,intb) :m_a1(a1),m_a2(a2)//构造函数的初始化列表,调用拷贝构造

{

cout <<"B(A& a1,A& a2, int b)......."<< endl;

m_b = b;

}

~B() {

cout <<"~B()......."<< endl;

cout <<"m_b="<< m_b << endl;

cout <<"A m_a1"<< endl;

m_a1.print();

cout <<"A m_a2"<< endl;

m_a2.print();

}

};

intmain(intargc,char** argv) {

A a1(1), a2(2);

B b1(a1, a1, 3);

}

运行结果:

3.顺序问题

构造对象成员的顺序跟初始化列表的顺序无关,而是跟成员对象定义的顺序有关。(面试会问)

例子:

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

classA {

private:

intm_a;

public:

A(inta) {

cout <<"A(int a)......."<<a<< endl;

m_a = a;

}

voidprint() {

cout <<"m_a="<< m_a << endl;

}

A(constA& another) {

m_a = another.m_a;

}

~A() {

cout <<"~A()......"<< endl;

}

};

classB {

private:

intm_b;

A m_a2;

A m_a1;

public:

B(inta1,inta2,intb) :m_a1(a1), m_a2(a2)//调用有参构造函数

{

cout <<"B(int a1, int a2, int b)......."<< endl;

m_b = b;

}

~B() {

cout <<"~B()......."<< endl;

}

};

intmain(intargc,char** argv) {

B b2(1, 2, 3);

}

结果:

跟下面顺序有关:

1

2

3

private:

A m_a2;

A m_a1;

跟下面顺序无关:

1

B(inta1,inta2,intb) :m_a1(a1), m_a2(a2)//调用有参构造函数

总结

本篇文章就到这里了,希望能够给你带来帮助