当前位置: 首页 > 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.jsqmd.com/news/987780/

相关文章:

  • 【单智能体】AI健康与健身规划师 - 案例讲解(附完整源码)
  • 2026年吹膜机厂家推荐榜单:PE吹膜机/降解袋吹膜机/快递袋/背心袋/ABA共挤/全自动/小型/多层共挤吹膜机品牌实力精选 - 品牌发掘
  • 2026年上海注册公司代理记账哪家好?五大品牌深度测评与对比 - 新闻快传
  • 2026年展柜厂家推荐榜单:内衣展柜/酒柜/鞋柜/眼镜柜/珠宝展柜,专业定制与空间美学深度解析 - 企业推荐官【官方】
  • 宝塔面板如何设置网站伪静态 宝塔|Nginx网站部署 伪静态配置|静态资源访问配置
  • 2026东莞配眼镜镜片膜层工艺深度解析:防反射、耐磨、疏水三大镀膜技术详解 - 配眼镜新资讯
  • [AI Agent 01]对话记忆、Agent 循环、Function Calling
  • 2026年怎么降低论文AIGC率?7种高效方法必收藏!
  • ijkplayer vs ffplay.c:架构优化与工程实践深度解析
  • 2026年郑州机场货物人工搬卸公司权威分享报告:港区搬迁服务优选指南! - 品研笔录
  • 2026年 过滤/过滤器/高效过滤器/初效/中效/化学/活性碳/箱式过滤器厂家推荐榜单,G4/F5/F6/H13/H14高效空气过滤器实力品牌精选 - 品牌发掘
  • 【Redis分布式缓存实战】第22章 企业级Redis缓存项目架构复盘
  • 二、SCI常用逻辑词
  • 2026年北京刑事律师权威榜单TOP10:刑事案件辩护深度评估 - 新闻快传
  • 09Java 泛型
  • 郑州人注意!闲置迪奥包别乱卖,看完少踩坑 - 奢侈品回收评测
  • 2026年实测有效:4个指令+3个技巧助你把论文AI率从50%降到10%
  • 2026年哈尔滨系统门窗厂家推荐榜:家装/别墅/德式/极简/隔音/防渗漏/大玻璃品牌深度解析 - 企业推荐官【官方】
  • Web分布式网站架构之-Squid缓存【20260608】002篇-Squid 工作流程图
  • 三、SCI熟词生意(一)
  • 2026年 湿毛巾厂家推荐排行榜:一次性/酒店/餐饮/独立包装湿毛巾源头工厂,专业清洁与定制服务优选 - 品牌发掘
  • 斯坦福李瑞江团队在Nat Med发表能够融合病理切片与虚拟CODEX染色的多模态医学AI框架
  • 2026煤磨气体分析仪品牌盘点:防爆燃监测设备哪家强?全国厂家排名揭晓 - 品研笔录
  • OpenFeign 实战指南:微服务远程调用的优雅之道
  • 人工智能专业术语详解(G)
  • 2026年如何降AI率?「三层过滤法」教你高效降AI【附降AI提示词】
  • 微信小程序实战:微型电车充电记账工具(可直接部署)
  • 想转就转,想压就压!2026免费PDF转换器全攻略:转格式+高效压缩,零套路上手 - 时时资讯
  • IEC 61850:GOOSE报文详细解析(下篇)
  • Web分布式网站架构之-Squid缓存【20260608】003篇-Squid 工作流程图