尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
【C++】类和对象--构造函数进阶(初始化列表与explicit)
目录初始化列表必须使用初始化列表的情况初始化列表的注意事项explicit 关键字在前面的构造函数基础中我们在函数体内进行赋值操作。但C还提供了一种更高效、在语义上更明确的初始化方式——初始化列表。同时我们将探讨控制隐式转换的explicit关键字。初始化列表初始化列表的语法形式紧跟在构造函数形参列表之后以冒号:开头后面是逗号分隔的成员初始化项每项格式为成员变量(初始值/表达式)。classDate{public:Date(intyear,intmonth,intday):_year(year),_month(month),_day(day){}// 函数体可为空private:int_year,_month,_day;};必须使用初始化列表的情况有三种成员变量必须在初始化列表中初始化因为在函数体内部赋值是非法的或做不到const成员变量引用成员变量没有默认构造函数的自定义类型成员无法在函数体内先默认构造再赋值示例classMyQueue{public:MyQueue(intn,intrr):_pushst(n)// Stack 没有默认构造必须在这里初始化,_popst(n),_x(1)// const 成员,ptr((int*)malloc(12)),ref(rr)// 引用成员{}private:Stack _pushst;Stack _popst;constint_x;int*ptr;intref;};初始化列表的注意事项每个成员变量在初始化列表中只能出现一次只能初始化一次。成员变量实际初始化的顺序取决于它们在类中声明的次序而与初始化列表中的书写顺序无关。这是常见陷阱容易产生意料之外的依赖问题。classA{public:A(inta):_a2(a),_a1(_a2){}// 实际顺序先初始化 _a2随机值再 _a1(_a2)voidPrint(){cout_a1 _a2endl;}private:int_a2;// 声明的顺序 _a2 在前因此它先于 _a1 初始化int_a1;};// 结果_a1 是随机值_a2 是 a所以尽量保持初始化列表顺序与成员声明顺序一致避免依赖。explicit 关键字C允许单个参数或除首参数外都有默认值的构造函数进行隐式类型转换。例如classA{public:A(inta):_a1(a){}private:int_a1;};A a3;// 隐式转换3 构造为临时 A 对象再拷贝给 a编译器可能优化为直接构造这种隐式转换有时很方便但也可能引入不易察觉的错误。在构造函数前加上explicit关键字可以禁止编译器进行这种隐式转换explicitA(inta):_a1(a){}// A a 3; // 编译错误Aa(3);// 显式构造允许A aA(3);// 显式调用构造后赋值也允许多参数构造函数从C11开始也支持列表初始化引发的隐式转换A(inta1,inta2):_a1(a1),_a2(a2){}A a{1,2};// 隐式转换constAref{1,2};// 绑定临时对象同样explicit可禁止这种列表隐式转换。在日常开发中出于安全和可读性考虑建议将大部分单参构造函数声明为explicit除非确实需要扮演类型转换的角色。学完构造的进阶技巧接下来我们把目光转向类的成员可以共享的数据——静态成员。
RELATED

相关推荐

工业场景优化器常见问题排查:10个典型故障场景与解决方案

工业场景优化器常见问题排查:10个典型故障场景与解决方案

工业场景优化器常见问题排查:10个典型故障场景与解决方案 【免费下载链接】industrial-scene-optimizer A multi-scenario performance adaptive tuning tool specifically designed for industrial settings. 项目地址: https://gitcode.com/openeuler/industria…

📅 2026/9/14 21:38:19
嵌入式接口时序设计:从建立时间到PCB布局的实战指南

嵌入式接口时序设计:从建立时间到PCB布局的实战指南

1. 项目概述与核心价值在嵌入式硬件开发领域,尤其是基于德州仪器(TI)这类高性能多核处理器的复杂系统设计中,接口时序规范文档往往是决定项目成败的“生死线”。我接触过不少工程师,他们能熟练地编写驱动、配置寄存器&…

📅 2026/10/23 3:17:46
模板驱动型文档自动化:零代码实现动态内容填充与品牌一致性

模板驱动型文档自动化:零代码实现动态内容填充与品牌一致性

1. 项目概述:当文档生成变成“填空题”,而不是“写作文” 你有没有过这种体验:每周一早上花两小时,把上一周的销售数据、客户反馈、项目进度,机械地复制粘贴进一份固定格式的PDF周报里;或者每次签新客户&a…

📅 2026/10/1 5:57:10
MORE NEWS

更多资讯

📰

CAD注册表清理工具:解决AutoCAD安装残留问题

1. 工具定位与核心痛点解析这个CAD注册表清理工具本质上是一个针对AutoCAD系列软件卸载残留问题的专项解决方案。在十多年的CAD使用和教学经历中,我见过太多因为注册表残留导致的安装失败案例——明明已经卸载了旧版本,安装新版本时却提示"已安装&q…

📰

PostgreSQL从0到1选型与落地:能力边界、配置与故障排查

接手一个内部数据平台重构时,团队在选型上卡了整整两天。需求单摊开来什么都有:订单是标准的关系型结构,用户画像是一大坨嵌套 JSON,运营要按关键词搜工单正文,风控要算“三公里内”的门店,后来还追加了一个…

📰

通用大模型 vs 垂直行业大模型:选型要点与落地实践

这两年做大模型落地的朋友应该都有同一种感受:通用大模型像一把万能瑞士军刀,什么都行,什么都差口气;垂直行业大模型像一把定制手术刀,切得准,但打不打磨、打磨得好不好,直接决定你是救人还是误…

📰

数据结构核心原理与实战应用全解析

1. 数据结构基础概念全景解析在程序设计的江湖里,数据结构就像武侠世界中的内功心法。记得我第一次参加技术面试时,面试官在白板上画了个二叉树就让我现场实现遍历,那一刻突然意识到:不理解数据结构就像练武不扎马步,再…

📰

Oracle EBS财务模块三层结构、账套配置与总账数据流解析

简介:围绕 Oracle EBS 财务模块整理的五部分学习文档,面向正在接触 Oracle ERP 财务实施、运维或希望系统理解财务模块的初、中级读者,也适合作为培训参考,可用于梳理传统财务流程与 EBS 财务功能的对应关系。压缩包内共 1 个 doc…

📰

MSMQ与Spring Boot缓存预热提升电商系统性能

1. 项目概述:消息队列与缓存预热的工程实践在分布式系统架构中,消息队列和缓存机制是解决性能瓶颈的经典组合拳。最近我在一个电商促销系统项目中,就遇到了高并发下单导致的数据库压力问题。通过采用MSMQ实现异步消息处理,并结合S…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬