c++中构造函数初始化列表怎么写_c++成员初始化语法【基础】

发布时间 - 2026-01-24 00:00:00    点击率:
构造函数初始化列表在冒号后、函数体前用逗号分隔,直接调用成员构造函数初始化;必须用于const成员、引用成员及无默认构造函数的类类型成员,且初始化顺序按声明顺序而非列表顺序。

构造函数初始化列表的基本写法

构造函数初始化列表在 之后、函数体 {} 之前书写,用逗号分隔每个成员的初始化表达式。它不是赋值,而是直接调用成员的构造函数完成初始化。

常见错误是把初始化列表写成赋值语句,比如写成 MyClass() { a = 1; b = "hello"; } —— 这对内置类型看似可行,但对自定义类型(如 std::string、引用、const 成员)会编译失败或引发未定义行为。

  • class A { int x; std::string s; const int c; public: A() : x(0), s("default"), c(42) {} };
  • 顺序按类中成员声明顺序执行,与初始化列表中书写顺序无关
  • 必须用初始化列表初始化:引用成员、const 成员、没有默认构造函数的类类型成员

哪些成员必须放在初始化列表里

以下三类成员无法在构造函数体内赋值,只能靠初始化列表:

  • const 成员:一旦声明就不可修改,例如 const int id;
  • 引用成员:引用必须绑定到有效对象,且不能重新绑定,例如 int& ref;
  • 没有默认构造函数的类类型成员:比如 std::vector v; 默认可构造,但若你定义了 class B { B(int); };,那么 B b; 就不合法,必须写成 B b(5); 在初始化列表中

漏掉这些会导致编译错误,典型提示如:member 'xxx' must be initialized by a mem-initializer in the constructor

初始化列表 vs 构造函数体

内赋值的区别

区别本质在于:初始化列表调用的是成员的构造函数;而函数体内赋值调用的是赋值运算符(operator=),前提是该成员已隐式构造完成。

  • std::string s;:初始化列表 s("abc") 直接调用 string(const char*);函数体内 s = "abc"; 先调默认构造函数,再调赋值,多一次开销
  • 对自定义类,若其默认构造函数有副作用(如日志、资源申请),而你本意只想初始化为某个状态,那体内赋值等于“先做无用动作,再覆盖”,逻辑冗余甚至出错
  • 内置类型(intdouble)两者性能无差别,但统一用初始化列表更一致、更安全

容易被忽略的细节和坑

初始化顺序只取决于成员在类中声明的顺序,而不是初始化列表里的顺序。这点极易被忽视,导致未定义行为。

  • 例如:class X { int a; int b; X() : b(0), a(b) {} }; —— 尽管 b 写在前面,但 a 先声明,所以先初始化 a,此时 b 还未构造,a 会得到垃圾值
  • 基类构造必须出现在派生类初始化列表最前面(隐式或显式),否则编译报错
  • 初始化列表中不能调用虚函数(因为此时虚表尚未完全设置好),即使语法允许,行为也是静态绑定
  • 初始化列表中不能使用 this 指针(对象尚未完全构造)

实际写代码时,建议把初始化列表写得和成员声明顺序严格一致,减少认知负担和潜在 bug。


# c++  # 区别  # 编译错误  # String  # 运算符  # 赋值运算符  # 构造函数  # const  # char  # int  # double  # 指针  # 虚函数  # class  # public  # operator  # 对象  # default  # constructor  # this  # bug  # 的是  # 体内  # 绑定  # 列表中  # 自定义  # 直接调用  # 类中  # 放在  # 隐式  # 就不 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率  ,交易猫的商品怎么发布到网站上去?  Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试  海南网站制作公司有哪些,海口网是哪家的?  如何在云虚拟主机上快速搭建个人网站?  canvas 画布在主流浏览器中的尺寸限制详细介绍  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  简单实现Android文件上传  javascript中闭包概念与用法深入理解  网站优化排名时,需要考虑哪些问题呢?  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  如何在Windows服务器上快速搭建网站?  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  Laravel如何实现一对一模型关联?(Eloquent示例)  Laravel中的Facade(门面)到底是什么原理  Laravel怎么清理缓存_Laravel optimize clear命令详解  历史网站制作软件,华为如何找回被删除的网站?  如何在宝塔面板中修改默认建站目录?  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  如何获取上海专业网站定制建站电话?  Laravel如何使用Blade模板引擎?(完整语法和示例)  装修招标网站设计制作流程,装修招标流程?  如何用狗爹虚拟主机快速搭建网站?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  如何在香港免费服务器上快速搭建网站?  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  北京企业网站设计制作公司,北京铁路集团官方网站?  EditPlus中的正则表达式实战(5)  如何实现建站之星域名转发设置?  Laravel Docker环境搭建教程_Laravel Sail使用指南  微信小程序 wx.uploadFile无法上传解决办法  googleplay官方入口在哪里_Google Play官方商店快速入口指南  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制  JavaScript如何实现倒计时_时间函数如何精确控制  Laravel如何发送系统通知?(Notification渠道示例)  JS弹性运动实现方法分析  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言  Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  如何彻底卸载建站之星软件?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  Laravel如何处理文件下载请求?(Response示例)  如何在万网利用已有域名快速建站?  b2c电商网站制作流程,b2c水平综合的电商平台?  Android仿QQ列表左滑删除操作  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  Laravel DB事务怎么使用_Laravel数据库事务回滚操作