c++中explicit关键字的作用_c++构造函数隐式转换【详解】
发布时间 - 2026-01-23 00:00:00 点击率:次explicit关键字用于禁止单参数构造函数的隐式转换,触发场景包括函数传参、赋值初始化和返回值匹配;它仅作用于可单实参调用的构造函数,显式调用需用直接初始化或显式构造。
explicit 关键字用来禁止编译器执行单参数构造函数的隐式转换,这是防止意外类型转换最直接有效的手段。
什么时候会触发隐式转换?
当类有一个接受单个参数的构造函数(或多个参数但其余都有默认值),且该构造函数未加 explicit 时,编译器可能在不写明构造调用的情况下自动完成类型转换。
常见场景包括:
- 函数传参:把一个基础类型(如
int)直接传给期望该类对象的函数 - 赋值语句:用
=进行初始化(非拷贝初始化,而是直接初始化的语法糖) - 返回值匹配:函数声明返回类类型,却 return 了一个兼容的基础类型值
例如:String s = "hello"; 若 String(const char*) 构造函数没加 explicit,这行就合法——但你未必想要这种“悄悄构造”。
explicit 只对单参数构造函数有效
explicit 修饰的是构造函数声明本身,不是调用方式。它只对恰好能通过一个实参调用的构造函数起作用(含多参数但其余均有默认值的情况)。
以下写法都受 explicit 约束:
explicit String(int n);-
explicit String(const char* s, bool copy = true);(因为可仅用一个参数调用)
而这些不受影响:
-
String(int n, const char* s);(必须两个参数,无法隐式转换) -
explicit operator int() const;(C++11 起也支持explicit类型转换函数,但这是另一回事)
加了 explicit 后怎么正确调用?
加了 explicit 不代表不

- 使用直接初始化语法:
String s(42);或String s{"hello"}; - 在函数调用中显式构造:
foo(String(100));而不是foo(100); - 用
static_cast(不推荐,除非接口强制要求):foo(static_cast(100));
注意:String s = String(42); 是允许的(这是拷贝初始化,但右边是显式构造),而 String s = 42; 会被拒绝。
容易忽略的坑:模板推导和 std::make_unique
即使构造函数加了 explicit,某些模板上下文仍可能绕过限制,比如:
-
std::vector—— 这里v(10, "abc"); "abc"会尝试隐式转成String,若构造函数是explicit,编译失败 -
std::make_unique是 OK 的(参数直接转发给构造函数),但(42) std::make_unique同样依赖是否允许隐式转换("abc")
更隐蔽的是聚合初始化与 explicit 无关,所以 struct S { explicit S(int); }; S s{42}; 合法,但 S s = {42}; 非法。
真正要注意的不是“要不要加 explicit”,而是“这个构造意图是否应该被用户无感知地触发”。多数情况下,单参数构造函数代表一种明确的、有代价的转换,显式比隐式更安全、更可维护。
# c++
# 隐式转换
# String
# 构造函数
# const
# bool
# char
# int
# 接口
# Struct
# operator
# 实参
# copy
# 类型转换
# 对象
# 这是
# 隐式
# 的是
# 只对
# 默认值
# 返回值
# 情况下
# 都有
# 多个
# 什么时候
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
LinuxCD持续部署教程_自动发布与回滚机制
Python函数文档自动校验_规范解析【教程】
如何在搬瓦工VPS快速搭建网站?
Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】
如何用y主机助手快速搭建网站?
详解Android图表 MPAndroidChart折线图
清除minerd进程的简单方法
Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】
动图在线制作网站有哪些,滑动动图图集怎么做?
高端网站建设与定制开发一站式解决方案 中企动力
教学论文网站制作软件有哪些,写论文用什么软件
?
标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
Android自定义listview布局实现上拉加载下拉刷新功能
VIVO手机上del键无效OnKeyListener不响应的原因及解决方法
Laravel怎么实现微信登录_Laravel Socialite第三方登录集成
linux写shell需要注意的问题(必看)
Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】
微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】
Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载
如何为不同团队 ID 动态生成多个独立按钮
如何挑选优质建站一级代理提升网站排名?
Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置
如何快速生成橙子建站落地页链接?
Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)
如何注册花生壳免费域名并搭建个人网站?
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
如何快速辨别茅台真假?关键步骤解析
EditPlus中的正则表达式实战(5)
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
Bootstrap CSS布局之列表
米侠浏览器网页背景异常怎么办 米侠显示修复
Laravel如何自定义错误页面(404, 500)?(代码示例)
Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】
Laravel如何使用Livewire构建动态组件?(入门代码)
Laravel如何使用查询构建器?(Query Builder高级用法)
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
如何解决hover在ie6中的兼容性问题
网页设计与网站制作内容,怎样注册网站?
Android中AutoCompleteTextView自动提示
网站优化排名时,需要考虑哪些问题呢?
北京网站制作的公司有哪些,北京白云观官方网站?
Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用
如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体
javascript中对象的定义、使用以及对象和原型链操作小结
如何快速搭建高效简练网站?
如何用已有域名快速搭建网站?
Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】

