跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++

C++ explicit 关键字详解:作用、原因与使用

C++ explicit 关键字用于修饰类构造函数,禁止隐式类型转换及隐式拷贝构造调用。单参构造函数默认允许从参数类型到类的隐式转换,可能导致意外行为,如 Date d2 = 2023。添加 explicit 后需显式调用构造函数。多参构造函数可通过花括号初始化,但 explicit 同样可防止此类隐式转换。该关键字提升代码可读性与安全性,是 C++ 标准库常用特性。

蜜桃汽水发布于 2026/2/5更新于 2026/10/243.8K 浏览
C++ explicit 关键字详解:作用、原因与使用

一、前言

在编写 C++ 代码时,explicit 关键字出现的频率很高。理解其作用对于掌握类型转换机制至关重要。

二、explicit 关键字是什么?

explicit 是 C++ 中的关键字,用于修饰只有一个参数的类构造函数,表明该构造函数是显式的,而非隐式的。当使用 explicit 修饰构造函数时,它将禁止类对象之间的隐式转换,以及禁止隐式调用拷贝构造函数。

三、构造函数还具有类型转换的作用

单参构造函数

通过日期类进行讲解:

class Date {
public:
    // 构造函数
    Date(int year) : _year(year) {}
private:
    int _year;
    int _month = 3;
    int _day = 31;
};

对于下面的代码,d1 和 d2 都会调用构造函数:

int main() {
    Date d1(2022);
    Date d2 = 2023;
    return 0;
}

Date d2 = 2023 这种写法也会调用构造函数。这是因为存在隐式类型转换。将 int 类型的数值赋值给 double 类型的数据时,会产生隐式类型转换,中间会构造一个临时变量。

同理,2023 会先去构造一个临时对象(类型为 Date),将其 year 初始化为 2023,然后再通过这个临时对象进行拷贝构造给到 d2。编译器通常会优化这一过程,将【构造 + 拷贝构造】优化为【一个构造】。

若尝试将内置类型直接引用赋值给类类型对象:

Date& d3 = 2024;

这会报错,因为 d3 是 Date 类型,2024 是内置类型。但如果加 const 修饰:

const Date& d3 = { 2024, 4 };

则不会出现问题,因为产生的临时变量具有常性,可以与 const 引用绑定。

引出 explicit 关键字

如果不想让这种隐式类型转换发生,可以使用 explicit 关键字。它加在构造函数的前面进行修饰,有了它就不会发生上面的隐式转换。

explicit Date(int year) : _year(year) {}

多参构造函数

对于多参构造函数:

Date(int year, int month, int day = 31) : _year(year), _month(month), _day(day) {}

根据从右往左缺省的规则,初始化时需要传入两个参数。若像单参那样初始化,编译器会报错。

对于一定要传入多参数进行构造的场景,可以使用 C++11 的新特性,在外面加上一个 {} 来调用多参构造函数:

Date d2 = { 2023, 3 };

不仅如此,对于下面这种也同样适用,调用构造去产生一个临时对象:

const Date& d3 = { 2024, 4 };

那要如何去防止这样的隐式类型转换发生呢?还是可以使用到 explicit 关键字吗?

// 多参构造函数
explicit Date(int year, int month, int day = 31) : _year(year), _month(month), _day(day) {}

可以看到,加上 explicit 关键字做修饰,同样可以起到禁止类型转换的作用。

还有一种例外,当缺省参数从右往左给到两个的时候,此时只需要传入一个实参即可,那也就相当于是单参构造,explicit 关键字依旧可以起到作用。

explicit Date(int year, int month = 3, int day = 31) : _year(year), _month(month), _day(day) {}
为什么需要 explicit 关键字?

对于可读性不是很好的代码,可以使用 explicit 修饰构造函数,将会禁止构造函数的隐式转换,避免潜在的类型混淆错误。

怎么使用 explicit 关键字?

explicit 关键字在 C++ 中只能用于修饰类的构造函数,它用来修饰只有一个参数的类构造函数,以表明该构造函数是显式的,而非隐式的。只要在构造函数名前加上 explicit 就能禁止类对象之间的隐式转换、禁止隐式调用拷贝构造函数。

四、总结

explicit 关键字主要用于控制构造函数的隐式转换行为,提升代码的安全性和可读性。在使用单参构造函数时,建议默认添加 explicit 除非确实需要隐式转换。

目录

  1. 一、前言
  2. 二、explicit 关键字是什么?
  3. 三、构造函数还具有类型转换的作用
  4. 单参构造函数
  5. 引出 explicit 关键字
  6. 多参构造函数
  7. 为什么需要 explicit 关键字?
  8. 怎么使用 explicit 关键字?
  9. 四、总结

更多推荐文章

查看全部
  • 基于 PaddleOCR-VL-WEB 实现多语言快递面单智能解析
  • 基于 WebRTC+AI 的智能远程控制解决方案
  • 低小慢无人机目标识别跟踪技术分析
  • OpenClaw QQ 机器人接入指南
  • 2023 年网络安全入职与转行职业规划指南
  • DeepSeek R1-Zero 为何比 R1 更值得关注:纯强化学习范式解析
  • AirSim 无人机物理引擎与动力学模拟:碰撞风场传感器噪声
  • Python pip 安装路径查看与修改指南
  • 宙斯漏洞扫描器 Zeus-Scanner 功能特性与安装部署
  • CSS 基础语法、选择器与常用属性实战指南
  • Dalvik 虚拟机核心架构与运行机制解析
  • C++ 多态底层实现原理详解
  • Ubuntu 部署 OpenClaw 并接入飞书机器人
  • GLM-4.5V-FP8 开源:多模态视觉推理新范式
  • LangGraph 入门与实战:基于 Agent 状态机的工具调用实践
  • 基于 DeepFace 和 OpenCV 的情绪分析器实现
  • 2026 年 3 月 17 日热点解读:楼市分化、医保覆盖与中东风险
  • Hadoop MapReduce 协同过滤推荐算法实战
  • Segment Anything 论文详解:可提示图像分割基础模型
  • Motrix WebExtension 浏览器扩展配置指南

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online