当前位置: 首页 > news >正文

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)//调用有参构造函数

总结

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

http://www.jsqmd.com/news/1178881/

相关文章:

  • 2026 年泗水正规的搪瓷储罐供应厂家有哪些,打破认知:它竟不是金属,却扛住十年强酸腐蚀? - 行业甄选官
  • TMC7300+MKV46F有刷电机控制方案解析
  • Unity集成sherpa-onnx与vits-zh-aishell3实现离线语音合成实战指南
  • 完全解析WordPress用户角色与权限及自定义设置指南
  • Pandas实战手册:从脏数据加载到可交付报表的完整链路
  • Springboot3+Vue3+MySQL 校园活动管理系统源码 前后端分离 协同过滤推荐
  • 泰坦尼克号沉没真相:技术缺陷、阶级结构与系统性失效
  • 网络安全工具链配置:Kali Linux 2024.2 + 5款核心工具实战环境搭建指南
  • 遗传算法工程化实战:选择、交叉与变异的可调试设计
  • STM32与NBM5100A的嵌入式电源管理方案解析
  • Discord技术社群并购拆解:知识型社区的四大可估值资产
  • TMC7300+STM32L041C6驱动有刷直流电机的高效方案
  • Codex 开挂神器,让Codex轻松接入DeepSeek、Qwe​n、kimi、智谱 GLM等国产模型,10分钟学会
  • 学术写作的超级快充!好用的AI论文平台,逻辑清晰质量高
  • 2026年论文党必备:高效论文写作全流程AI论文工具推荐(2026 最新)
  • GitHub万条Prompt合集:系统化提升AI提示词工程实战效率
  • AI视频生成技术:从扩散模型到游戏剧情二创实践
  • XUnity AutoTranslator:Unity游戏实时翻译插件原理与实战配置指南
  • mise:统一管理多语言开发环境的现代化工具链
  • PIC微控制器与磁性蜂鸣器的音频系统设计与优化
  • C++性能剖析教程之循环展开
  • 亲身到店探访广州江诗丹顿官方售后服务中心|全部地址及24小时客服热线(2026年7月最新) - 江诗丹顿官方服务中心
  • Typora 1.8.5 双模式宽度调整:编辑区与源码区分别设置 1200px 与 100%
  • STM32F410RB与MCP3428高精度数据采集方案详解
  • TortoiseGit 2.16 图形化操作:5 个高效工作流替代 80% 的 Git 命令行
  • C++模板元编程实战:从零构建高性能科学计算库
  • 压电警报系统设计与MK60DN512VLQ10驱动方案
  • 终极OpenCore Legacy Patcher完整指南:让2007-2017年老Mac重获新生
  • Conda 23.11.0 环境创建慢排查:3步定位依赖冲突与缓存优化
  • Unity游戏实时自动翻译实战:基于BepInEx与XUnity.AutoTranslator的汉化方案