c++学习笔记分享--explicit关键字
日常分享整合的学习笔记首先explict中文意思是 清楚明白的易于理解的明确的直言的 ;显式在编程中explicit用来告诉编译器“不要偷偷用这个构造函数做隐式类型转换1.先看一个反面例子没有 explicit假设有一个类class Number { public: Number(int x) { // 只有一个参数的构造函数 value x; } private: int value; }; void printNumber(Number n) { // 假装打印一下... } int main() { printNumber(42); // 这里发生了甚么 }printNumber(42);在这里你本来想传入一个Number类给printNumber但你传错了而且这里发生了隐式类型转换等价于Number n 42; //这个是可以编译过的可以试一下并输出一下value成员变量结果是42 //相当于调用构造函数 Number n(42);这很奇怪对吧因为编译器看到printNumber需要Number对象但你传了一个int恰好是Number类对应的构造函数参数,于是它会自动调用Number(int)构造函数把42变成Number(42)。这就是隐式类型转换。加上 explicit 之后class Number { public: explicit Number(int x) { // 加了个 explicit value x; } private: int value; }; void printNumber(Number n) { /* ... */ } int main() { // printNumber(42); // 这行现在会报错 printNumber(Number(42)); // 必须显式构造这样写才行 }加了explicit后编译器不会再偷偷帮你把42转换成Number你必须自己明确写出构造过程。这让代码意图更清晰也避免了一些隐蔽的错误。2. 多参数构造函数C11 起从 C11 开始explicit也可以用在多参数构造函数上。它的作用是禁止使用花括号初始化列表进行隐式转换。class Point { public: explicit Point(int x, int y) : mx(x), my(y) {} //初始化列表 private: int mx, my; }; void draw(Point p) {} int main() { draw({1, 2}); // ❌ 错误不能隐式转换 draw(Point{1, 2}); // ✅ 正确显式构造 }注意这里说的是花括号初始化列表​{1, 2}这种写法。如果是draw(Point(1, 2))圆括号构造本来就没有隐式转换的问题。3.常见疑惑与陷阱疑惑 1explicit 会影响拷贝/移动构造函数吗不影响。​explicit只影响普通构造函数和转换运算符。拷贝构造函数和移动构造函数即使加了explicit也不影响它们正常的拷贝/移动行为但一般没人给它们加。class Foo { public: explicit Foo(int) {} // 普通构造禁止隐式转换 // 拷贝构造函数不需要 explicit Foo(const Foo) default; };疑惑 2explicit 和 default / delete 一起用可以。比如你想禁止某些隐式转换但仍然保留默认构造class Bar { public: explicit Bar(int) default; // 显式构造且使用默认实现 Bar(double) delete; // 完全禁止 double 类型的构造 };疑惑 3explicit 到底能不能提高性能通常不能。​explicit不影响运行时的性能它只影响编译器的行为——是否允许某种写法通过编译。所以不用担心加了explicit会让程序变慢疑惑 4什么时候应该不加 explicit很少见但有几种情况可以考虑不加包装类比如一个类只是对底层类型的一层薄包装而且经常需要和底层类型互操作。例如std::string_view可以用const char*隐式构造。数值类型比如你自己写的BigInteger类允许int隐式转换成它可能会方便一些。仿函数/适配器某些设计模式里隐式转换反而让代码更简洁。不过作为新手先一律加explicit等你真的遇到需要去掉的情况再改这样最安全。4.什么时候用建议所有单参数构造函数都建议加上explicit除非你有非常明确的理由需要隐式转换这种情况极少。比如标准库里的std::vector有一个explicit vector(size_t count)就是为了防止你不小心写出这样的代码std::vectorint v 10; // 如果没有 explicit这行可能就编译过了但语义很奇怪End.............如果这篇笔记对你有帮助留下赞蟹蟹

相关新闻

谁是省时神器?8款AI写作辅助平台榜单,毕业季救星!

谁是省时神器?8款AI写作辅助平台榜单,毕业季救星!

论文写到一半卡壳怎么办?文献检索耗时费力却找不到重点?格式调整反复修改还容易出错? 别担心!AI论文写作工具正在改变传统的学术写作方式。本文将从学术严谨性、文献整合能力、格式自动生成、查重优化效果四大维度,对…

2026/6/24 8:08:14阅读更多 →
Android 开发者为什么必须掌握 AI 能力?端侧视角下的技术变革

Android 开发者为什么必须掌握 AI 能力?端侧视角下的技术变革

过去十年,Android 开发的核心几乎没有变化:写 UI调接口管状态一个典型的数据流是这样的:用户点击 → API 请求 → 服务端返回 → UI 展示开发者的价值,集中在界面构建 业务逻辑 网络通信。但随着以 ChatGPT 为代表的大模型出现&…

2026/6/24 8:08:14阅读更多 →
智能分析+预警推送+自动研判,AI在声誉管理中的三大应用场景

智能分析+预警推送+自动研判,AI在声誉管理中的三大应用场景

一、开头(结论前置)2025年企业声誉管理行业正经历三大核心变革:AI技术深度渗透、合规要求持续提升、服务模式从单一向三维协同升级。企业若要在激烈的舆论环境中守住声誉防线,必须把握这三大趋势,选择具备技术 法律 …

2026/6/24 8:08:14阅读更多 →
安装VMware Tools灰了怎么点亮以及后续安装(lunix版)

安装VMware Tools灰了怎么点亮以及后续安装(lunix版)

先关闭虚拟机,然后在设置里面把这三都勾上自动检测,重新开机就行了(像主包一样不行的就接着往下👀)好了不用看了,是设备状态那个启动时连接,这个要取消勾选,主包已经解决了哈哈补充一…

2026/6/24 10:54:27阅读更多 →
2026年声音克隆工具深度实测:声线APP领衔,8款主流产品全场景选型指南

2026年声音克隆工具深度实测:声线APP领衔,8款主流产品全场景选型指南

摘要:2026年,AI声音克隆技术已全面进入"普惠应用时代"。据行业公开数据显示,主流工具的主观听感保真度已突破较高阈值,普通用户越来越难区分AI合成语音与真人录制的差异。本文以深度实测为核心,从克隆精度、…

2026/6/24 10:54:27阅读更多 →
论文修改记录优化方案,AI识别能力带来更清晰整理体验

论文修改记录优化方案,AI识别能力带来更清晰整理体验

论文修改意见常分散在邮件、微信语音、线下会议录音等不同渠道,手动查找和整理耗时费力。AI识别能力的成熟,提供了新的整理思路。 传统做法与AI方案的根本差异 维度 传统做法 AI辅助方案 信息获取方式 主动从不同渠道搜寻信息,手动拼接 统一接…

2026/6/24 10:54:27阅读更多 →
全程仅 3 步!5分钟完成 Hermes 本地 Windows 端搭建【爱马仕智能体】

全程仅 3 步!5分钟完成 Hermes 本地 Windows 端搭建【爱马仕智能体】

🤖 一、简单认识 Hermes & 主流应用场景 Hermes 是一款本地化运行的智能应用工具,专注于自动化操作、智能交互和本地任务处理等核心功能。 区别于常见的在线问答 AI,Hermes 是一款本地 Agent 工具。它就像安装在您设备上的智能桌面助手…

2026/6/24 10:54:27阅读更多 →
VMware在虚拟机鼠标锁定了,如何退出

VMware在虚拟机鼠标锁定了,如何退出

快捷键ctrlalt就可以退出

2026/6/24 10:54:27阅读更多 →
彻底搞懂 SLF4J 桥接模块:让老日志 API 乖乖听话

彻底搞懂 SLF4J 桥接模块:让老日志 API 乖乖听话

在现实世界的 Java 项目中,我们几乎不可能只使用一套日志 API。你的应用可能直接使用了 java.util.logging,而依赖的第三方库却写死在 Log4j 1.x 上,另一个内部组件又选择了 Apache Commons Logging(JCL)。结果就是&am…

2026/6/24 10:49:26阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM,WorkFlow,Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1)LLM2)Prompt3)Me…

2026/6/24 7:33:03阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件:从原理到实战的深度解析在嵌入式系统开发中,图形用户界面(GUI)的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台,嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/24 2:12:09阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”,而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时,第一反应可能是:又一个免费额度?领完就完事?我亲手试过——这300美金根本不是红包,而是一张入场券&…

2026/6/24 7:37:00阅读更多 →
TaskJuggler脚本编程入门:用代码实现自动化项目管理

TaskJuggler脚本编程入门:用代码实现自动化项目管理

TaskJuggler脚本编程入门:用代码实现自动化项目管理 【免费下载链接】TaskJuggler TaskJuggler - Project Management beyond Gantt chart drawing 项目地址: https://gitcode.com/gh_mirrors/ta/TaskJuggler TaskJuggler是一款强大的开源项目管理工具&#…

2026/6/24 0:02:41阅读更多 →
终极教程:使用angular-mobile-nav实现流畅的移动页面过渡效果

终极教程:使用angular-mobile-nav实现流畅的移动页面过渡效果

终极教程:使用angular-mobile-nav实现流畅的移动页面过渡效果 【免费下载链接】angular-mobile-nav An angular navigation service for mobile applications 项目地址: https://gitcode.com/gh_mirrors/an/angular-mobile-nav angular-mobile-nav是一款专为…

2026/6/24 0:02:41阅读更多 →
Wan2.1-Fun-V1.1-1.3B-InP Web UI使用教程:无需代码的AI视频创作

Wan2.1-Fun-V1.1-1.3B-InP Web UI使用教程:无需代码的AI视频创作

Wan2.1-Fun-V1.1-1.3B-InP Web UI使用教程:无需代码的AI视频创作 【免费下载链接】Wan2.1-Fun-V1.1-1.3B-InP 项目地址: https://ai.gitcode.com/hf_mirrors/PAI/Wan2.1-Fun-V1.1-1.3B-InP Wan2.1-Fun-V1.1-1.3B-InP是一款强大的AI视频创作工具,…

2026/6/24 0:02:41阅读更多 →