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

C++:初始化列表

一、什么是初始化列表?

在C++中,构造函数用于初始化对象。但你有没有想过:成员变量到底是在哪里完成初始化的?是在构造函数的大括号内部,还是在冒号后面?今天我们就来深入探讨构造函数的初始化列表——这个常常被初学者忽略,却至关重要的语法。

初始化列表是构造函数的一种特殊语法,写在函数参数列表之后、函数体之前,以冒号:开头,后面列出成员变量的初始化方式。

classStudent{public:// 初始化列表:name和score在进入函数体之前就完成了初始化Student(string n,ints):name(n),score(s){// 函数体(可做额外操作)}private:string name;intscore;};
  • 一般认为:初始化列表是每个成员变量定义初始化的地方。

二、为什么需要初始化列表?

1. 效率更高

对于类类型的成员,使用初始化列表是直接初始化,而在函数体内赋值是先默认构造再赋值,多了一次函数调用。

classTest{public:Test(){cout<<"默认构造"<<endl;}Test(intx){cout<<"带参构造"<<endl;}Test&operator=(intx){cout<<"赋值"<<endl;return*this;}};classDemo{Test t;public:// 初始化列表:一次带参构造Demo(intx):t(x){}// 函数体内赋值:先默认构造,再赋值Demo(intx){t=x;// 先调用Test(),再调用operator=}};
  • 结论:对于类类型成员,初始化列表更高效。
2. 有些成员只能在初始化列表中初始化
  • 以下四种成员必须使用初始化列表(不可改变,所以必须在定义时就赋初值),不能在构造函数体内赋值:
(1) const成员变量
classConstDemo{constintci;public:ConstDemo(intx):ci(x){}// 正确// ConstDemo(int x) { ci = x; } // 错误!const不能赋值};
(2) 引用成员变量
classRefDemo{int&ref;public:RefDemo(int&r):ref(r){}// 正确// RefDemo(int& r) { ref = r; } // 错误!引用必须初始化};
(3) 成员对象没有默认构造函数
classMember{public:Member(intx){}// 有带参构造,没有默认构造};classContainer{Member m;public:// 必须在初始化列表中调用Member的带参构造Container(intx):m(x){}};
(4) 基类没有默认构造函数
classBase{public:Base(intx){}};classDerived:publicBase{public:// 必须在初始化列表中显式调用基类构造Derived(intx):Base(x){}};

三、初始化列表的语法

类名(参数列表) :
成员1(值1),
成员2(值2),
… ,
成员n(值n) {
// 函数体
}

  • 多个成员用逗号分隔
  • 可以混合使用初始化列表和函数体赋值
  • 初始化列表在函数体执行之前执行

示例:

classPoint{intx,y;public:Point(inta,intb):x(a),y(b){cout<<"Point构造完成"<<endl;}};

四、初始化顺序

  • 成员变量的初始化顺序由它们在类中声明的顺序决定,与初始化列表中的书写顺序无关。
classDemo{inta;intb;public:// 易错写法:想先用b初始化a,但实际a先初始化Demo(intx):b(x),a(b){}// a先初始化,此时b未初始化,a是随机值};

五、初始化列表 vs 函数体赋值

对比维度初始化列表函数体内赋值
执行时机对象成员内存分配后立即执行进入函数体后执行
对const/引用✅ 支持❌ 不支持
效率(类类型)直接构造,一次操作先默认构造再赋值,两次操作
代码风格更专业,推荐可用于简单类型或需要额外逻辑的场合

七、完整示例

#include<iostream>#include<string>usingnamespacestd;classCourse{public:Course(string n):name(n){cout<<"课程《"<<name<<"》已创建"<<endl;}private:string name;};classStudent{private:constintid;// const成员string&mentor;// 引用成员Course c;// 对象成员(Course无默认构造)intscore;// 普通成员public:// 初始化列表处理所有必须成员Student(inti,string&m,string courseName,ints):id(i),mentor(m),c(courseName),score(s){cout<<"学生"<<id<<"注册成功"<<endl;}voidshow(){cout<<"学号:"<<id<<",导师:"<<mentor<<",成绩:"<<score<<endl;}};intmain(){string mentorName="张教授";Studentstu(1001,mentorName,"C++程序设计",95);stu.show();return0;}

输出:
text
课程《C++程序设计》已创建
学生1001注册成功
学号:1001,导师:张教授,成绩:95

六、补充

  • C++11支持在成员变量声明的位置给缺省值,用以给没有显示在初始化列表初始化的成员使用
  • 所有成员都会走初始化列表,哪怕是没有写在初始化列表中的成员。所以我们尽量用初始化列表进行初始化。
  • 无论是否显示写初始化列表,每个构造函数都有初始化列表。
http://www.rkmt.cn/news/1499522.html

相关文章:

  • 2026年展柜厂家推荐榜单:内衣展柜/酒柜/鞋柜/眼镜柜/珠宝展柜,专业定制与空间美学深度解析 - 企业推荐官【官方】
  • 2026东莞配眼镜镜片膜层工艺深度解析:防反射、耐磨、疏水三大镀膜技术详解 - 配眼镜新资讯
  • ijkplayer vs ffplay.c:架构优化与工程实践深度解析
  • 【Redis分布式缓存实战】第22章 企业级Redis缓存项目架构复盘
  • 2026年北京刑事律师权威榜单TOP10:刑事案件辩护深度评估 - 新闻快传
  • 2026年郑州机场货物人工搬卸公司权威分享报告:港区搬迁服务优选指南! - 品研笔录
  • Web分布式网站架构之-Squid缓存【20260608】002篇-Squid 工作流程图
  • 斯坦福李瑞江团队在Nat Med发表能够融合病理切片与虚拟CODEX染色的多模态医学AI框架
  • 2026煤磨气体分析仪品牌盘点:防爆燃监测设备哪家强?全国厂家排名揭晓 - 品研笔录
  • 2026年如何降AI率?「三层过滤法」教你高效降AI【附降AI提示词】
  • Web分布式网站架构之-Squid缓存【20260608】003篇-Squid 工作流程图
  • 无锡高考复读学校核心提分技术与管理体系深度拆解 - 起跑123
  • 项目实训个人工作记录(四):用户管理模块全流程开发
  • 【NLP自然语言处理】4.基础-文本特征处理文本数据增强
  • Function Calling 与 MCP 深度对比:从原理到实践,一文讲透区别与关系
  • 在Python中,不可变(immutable)数据类型是指一旦创建后,其内容不能被修改的数据类型
  • 2026 香奈儿名牌包包回收规则,无锡门店回收对哪些款式更热忠 - 奢侈品回收评测
  • 【Uniapp 插件 una-banner 】轮播图 / banner / swiper
  • 2026上海百达翡丽回收价格怎么算?全套、单表、成色差价明细解析 - 奢侈品回收评测
  • 素材去水印实用技巧:按场景选择工具,兼顾效率与画质
  • 伺服电机仿真(3):PMSM在三相静止坐标系下的数学模型
  • 系统规划与管理师选老师:案例不好的人,需要什么样的老师?
  • 新装修的石材为什么开裂?5大原因+预防措施(2026版) - 宁波融诚石业
  • 2026窑炉气体分析系统选购指南:全国优质厂家排名与实战经验分享 - 品研笔录
  • Python之encrypti0n包语法、参数和实际应用案例
  • 如何利用 OpenCV 将图像显示在对话框窗口上
  • 2026合肥市生成式引擎优化(GEO)技术能力权威测评报告|百分制量化技术版 - 安徽工业
  • 2026 成都爱马仕香奈儿回收指南,热门经典款行情与估价细节解析 - 奢侈品回收评测
  • 鸿蒙原生应用实战(三):笔记详情与编辑页面的路由与CRUD
  • 南宁黄金回收全攻略:精选正规门店,教你安全高价变现 - 奢侈品回收评测