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

C++学习笔记24:构造函数初始化列表

目录

一、什么是初始化列表?

二、初始化列表和函数体内赋值有什么区别

三、哪些成员必须使用初始化列表

1. const 成员变量

2. 引用成员变量

3. 没有默认构造函数的自定义类型成员

四、初始化顺序

五、小结


一、什么是初始化列表?

在C++中,构造函数除了可以在函数体内给成员变量赋值,也可以使用初始化列表

普通写法:

class Date { public: Date(int year, int month, int day) { _year = year; _month = month; _day = day; } private: int _year; int _month; int _day; };

初始化列表写法:

class Date { public: Date(int year, int month, int day) ; _year(year) , _month(month) , _day(day) { } private: int _year; int _month; int _day; };

初始化列表写在构造函数参数列表后面,以冒号 : 开始,多个成员之间用逗号分隔。


二、初始化列表和函数体内赋值有什么区别

函数体内写:

_year = year;

本是上是赋值

初始化列表写:

: _year(year)

本质上是初始化

简单理解:

初始化列表:成员函数创建时直接初始化 函数体内赋值:成员变量创建后再赋值

对于普通变量 int、char、double成员你,两种写法很多时候结果一样。

但有些成员必须使用初始化列表。


三、哪些成员必须使用初始化列表

主要有三类:

1. const 成员变量 2. 引用成员变量 3. 没有默认构造函数的自定义类型成员

1. const 成员变量

class A { public: A(int x) : _x(x) { } private: const int _x; };

const 成员变量创建后不能修改,所以必须在初始化列表中初始化。


2. 引用成员变量

class A { public: A(int x) : _ref(x) { } private: int& _ref; };

引用必须在定义时初始化,所以引用成员也必须使用初始化列表。


3. 没有默认构造函数的自定义类型成员

class B { public: B(int x) : _x(x) { } private: int _x; }; class A { public: A(int x) : _b(x) { } private: B _b; };

因为 B 没有无参构造函数,所以 A 中的 _b 必须在初始化列表中显式初始化。


四、初始化顺序

成员变量的初始化顺序不是看初始化列表中的书写顺序,而是看成员变量在类中的声明顺序

例如:

class A { public: A(int x) : _a1(x) , _a2(_a1) { } private: int _a2; int _a1; };

虽然初始化列表中先写 _a1,但成员变量声明时 _a2 在前,所以实际会先初始化 _a2。

因此建议:

初始化列表的书写顺序和成员变量的声明顺序保持一致。

这样代码更清晰,也不容易出错。


五、小结

本篇主要学习了构造函数初始化列表。

需要记住:

  1. 初始化列表写在构造函数参数列表后面;
  2. 初始化列表以 : 开始;
  3. 多个成员变量之间用逗号隔开;
  4. 函数体内是赋值,初始化列表才是初始化;
  5. const 成员变量必须使用初始化列表;
  6. 引用成员变量必须使用初始化列表;
  7. 没有默认构造函数的自定义类型成员必须使用初始化类表;
  8. 成员变量初始化顺序由声明顺序决定;
  9. 初始化列表书写顺序建议和成员声明顺序保持一致;
  10. 建议优先使用初始化列表写构造函数。

初始化列表是构造函数中的重要内容。理解它之后才能更好的处理 const 成员、引用成员和自定义类型成员的初始化问题。

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

相关文章:

  • 无SDK环境下如何使用curl命令调试Taotoken大模型接口
  • AI 时代的平台工程
  • 法律Agent:合规检查与文档生成
  • 图片去水印方法大全,免费工具手机电脑全适用|2026实测教程
  • 荣县黄金回收店铺哪家好 靠谱门店推荐及联系方式 - 莘州文化
  • 3步搞定显卡风扇异常:用FanControl彻底解决NVIDIA风扇噪音和转速问题
  • 瑞丽市黄金回收店铺哪家好 靠谱门店推荐及联系方式 - 莘州文化
  • 金阳县黄金回收店铺哪家好 靠谱门店推荐及联系方式 - 莘州文化
  • MongoDB 连接详解
  • 从概率拟合到内生心智:七层投影架构重构AGI数字生命新范式
  • 从能算到秒杀:单词拆分与「能否拼出来」的判定艺术
  • AI驱动的业务PPT智能生成:DeepSeek × Skills × MCP × 知识库
  • 锦江区黄金回收白银回收铂金回收店铺哪家好 靠谱门店推荐 - 莘州文化
  • 若尔盖县黄金回收店铺哪家好 靠谱门店推荐及联系方式 - 莘州文化
  • HTML 标签简写及全称
  • 终结拟合式智能:记忆博弈心智架构重塑硅基生命进化逻辑
  • 基于Spring Security与JWT的权限认证技术研究
  • 汉源县黄金回收店铺哪家好 靠谱门店推荐及联系方式 - 莘州文化
  • 色达县黄金回收店铺哪家好 靠谱门店推荐及联系方式 - 莘州文化
  • 如何让微信聊天记录成为你的数字记忆银行?WeChatMsg完全指南
  • 阆中市黄金回收店铺哪家好 靠谱门店推荐及联系方式 - 莘州文化
  • 邻水县黄金回收店铺哪家好 靠谱门店推荐及联系方式 - 莘州文化
  • 没有数据、没有团队?这次NHANES·CHARLS双库训练营,带你2-3个月走出困境
  • 《技术底稿 40》别只看文件大小:一次 “反常 OOM” 背后的内存缓存重构
  • 洪雅县黄金回收店铺哪家好 靠谱门店推荐及联系方式 - 莘州文化
  • 测试工程师必知的数据库知识:这4个数据库技能,测试必备
  • 西昌市黄金回收店铺哪家好 靠谱门店推荐及联系方式 - 莘州文化
  • Blender 3MF插件:实现CAD到3D打印的无缝转换完整指南
  • MyBatis-Plus持久层框架应用技术研究
  • 中性点不接地系统或中性点经消弧线圈接地系统的小电流接地故障仿真研究(Simulink仿真实现)