【C++】explicit关键字详解(explicit关键字是什么? 为什么需要explicit关键字? 如何使用explicit 关键字)
目录
一、前言
二、explicit关键字是什么?
三、构造函数还具有类型转换的作用
🍎单参构造函数
✨引出 explicit 关键字
🍍多参构造函数
✨为什么需要explicit关键字?
✨怎么使用explicit关键字?
四、总结
五、共勉
一、前言
在我们自己平时写 C++ 代码的时候,较少会用到 explicit关键字 。但是在C++相关的标准类库中,看到explicit关键字的频率还是很高的。既然出现的频率这么高,那么我们就来看看explicit关键字的作用到底是干什么的。
二、explicit关键字是什么?
explicit是C++中的一个关键字,它用来修饰只有一个参数的类构造函数,以表明该构造函数是显式的,而非隐式的。当使用explicit修饰构造函数时,它将禁止类对象之间的隐式转换,以及禁止隐式调用拷贝构造函数。
这能这么说,大家不太好理解,既然解释中提到了 类的构造函数 那么下面我将从构造函数中详细的给大家,讲解explicit其中的含义。
三、构造函数还具有类型转换的作用
在理解 explicit 关键字 之前,我们必须要了解构造函数的类型转换作用,以便于我们更好的理解 explicit 关键字 ,如果有不懂构造函数的老铁,可以来看看这篇文章:构造函数
🍎单参构造函数
还是来说说老朋友日期类,我们通过下面这个日期类进行讲解
class Date
{
public:
// 构造函数Date(int year):_year(year) // 初始化列表{}private:int _year;int _month = 3;int _day = 31;
};
- 对于下面的 d1 很清楚一定是调用了有参构造进行初始化,不过对于 d2 来说,也是一种构造方式
int main()
{// d1 和 d2 都会调用构造函数Date d1(2022); Date d2 = 2023;return 0;
}
- 我们依旧通过调试来看就会非常清晰,这种 【Date d2 = 2023】 写法也会去调用构造函数

此时,大家可能会产生疑问,这种构造方式从来没有见过,为什么 【Date d2 = 2023】会调用 构造函数呢? 其实这都是因为有【隐式类型转换】的存在,下面我将从一个简单的例子来为大家讲解。
- 在引用详解,我有提到过【隐式类型转换】这个概念,像下面将一个int类型的数值赋值给到一个double类型的数据,此时就会产生一个隐式类型转换
int i = 1;
double d = i;
- 对于类型转换而言,这里并不是将值直接赋值给到左边的对象,而是在中间呢会产生一个临时变量,例如右边的这个 i 会先去构造一个临时变量,这个临时变量的类型是 [double] 。把它里面的值初始化为 1,然后再通过这个临时对象进行拷贝构造给d,这就是编译器会做的一件事

- 那对于这个 d2 其实也是一样,2023会先去构造一个临时对象,这个临时对象的类型是
[Date]把它里面的year初始化为2023,然后再通过这个临时对象进行拷贝构造给到d2,
💬小蛋:不是说构造函数有初始化列表吗?拷贝构造怎么去初始化呢?
//拷贝构造
Date(const Date& d):_year(d._year),_month(d._month),_day(d._day)
{}
- 同学,别忘了【拷贝构造】也是属于构造函数的一种哦,也是会有初始化列表的
刚才说到了中间会产生一个临时对象,而且会调用构造 + 拷贝构造,那此时我们在Date类中写一个拷贝构造函数,调试再去看看会不会去进行调用
- 很明显没有,我在进入Date类后一直在按F11,但是却进不到拷贝构造中,这是为什么呢?

- 原因其实在于编译器在这里地方做了一个优化,将【构造 + 拷贝构造】优化成了【一个构造】,因为编译器在这里觉得构造再加拷贝构造太费事了,干脆就合二为一了。其实对于这里的优化不同编译器是有区别的,像一下VC++、DevC++可能就不会去优化,越是新的编译器越可能去进行这种优化。在本文的最后一个模块我还会详细展开分析
💬小蛋:但您是怎么知道中间赋值这一块产生了临时对象呢?如果不清楚编译器的优化机制这一块肯定就会认为这里只有一个构造
- 这点确实是,若是我现在不是直接赋值了,而是去做一个引用,此时会发生什么呢?
Date& d3 = 2024;
- 可以看到,报出了一个错误,原因就在于d3是一个Date类型,2024则是一个内置类型的数据

- 但若是我在前面加一个
const做修饰后,就不会出现问题了,这是为什么呢? - 其实这里的真正原因就在于产生的这个【临时变量】(临时变量具有常性),它就是通过Date类的构造函数构造出来的,同类型之间可以做引用。还有一点就是临时变量具有常性,所以给到一个
const类型修饰对象不会有问题
✨ 引出 explicit 关键字
但若是你不想让这种隐式类型转换发生怎么办呢?此时就可以使用到C++中的一个关键字叫做
explicit
- 它加在构造函数的前面进行修饰,有了它就不会发生上面的这一系列事儿了,它会【禁止类型转换】
explicit Date(int year):_year(year)
{}

🍍多参构造函数
对于上面所讲的都是基于单参的构造函数,接下去我们来瞧瞧多参的构造函数
//多参构造函数
Date(int year, int month ,int day = 31):_year(year),_month(month),_day(day)
{}
- 根据从右往左缺省的规则,我们在初始化构造的时候要给到2个参数,
d1没有问题传入了两个参数,但是若是像上面那样沿袭单参构造函数这么去初始化还行得通吗?很明显不行,编译器报出了错误

💬小蛋:那要怎么办呀,对于一定要传入多参数进行构造的场景
- 这个时候就要使用到我们C++11中的新特性了,在对多参构造进行初始化的时候在外面加上一个
{}就可以了,可能你觉得这种写法像是C语言里面结构体的初始化,但实际不是,而是在调用多参构造函数
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就能禁止类对象之间的隐式转换、禁止隐式调用拷贝构造函数。
四、总结

五、共勉
以下就是我对C++ explicit关键字的理解,如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对C++ 的理解,请持续关注我哦!!!

相关文章:
【C++】explicit关键字详解(explicit关键字是什么? 为什么需要explicit关键字? 如何使用explicit 关键字)
目录 一、前言 二、explicit关键字是什么? 三、构造函数还具有类型转换的作用 🍎单参构造函数 ✨引出 explicit 关键字 🍍多参构造函数 ✨为什么需要explicit关键字? ✨怎么使用explicit关键字? 四、总结 五…...
maven引入外部jar包
将jar包放入文件夹lib包中 pom文件 <dependency><groupId>com.jyx</groupId><artifactId>Spring-xxl</artifactId><version>1.0-SNAPSHOT</version><scope>system</scope><systemPath>${project.basedir}/lib/Spr…...
李沐37_微调——自学笔记
标注数据集很贵 网络架构 1.一般神经网络分为两块,一是特征抽取原始像素变成容易线性分割的特征,二是线性分类器来做分类 微调 1.原数据集不能直接使用,因为标号发生改变,通过微调可以仍然对我数据集做特征提取 2.pre-train源…...
【小程序】生成短信中可点击的链接
文章目录 前言一、如何生成链接二、仔细拜读小程序开发文档文档说明1文档说明2 总结 前言 由于线上运营需求,需要给用户发送炮轰短信,用户通过短信点击链接直接跳转进入小程序 一、如何生成链接 先是找了一些三方的,生成的倒是快速…...
欧拉函数(模板题)
给定 n 个正整数 ai,请你求出每个数的欧拉函数。 欧拉函数的定义 输入格式 第一行包含整数 n。 接下来 n 行,每行包含一个正整数 ai。 输出格式 输出共 n 行,每行输出一个正整数 ai 的欧拉函数。 数据范围 1≤n≤100, 1≤ai≤2109 输…...
Thingsboard PE 白标的使用
只有专业版支持白标功能。 使用 ThingsBoard Cloud 或安装您自己的平台实例。 一、介绍 ThingsBoard Web 界面提供了简便的操作,让您能够轻松配置您的公司或产品标识和配色方案,无需进行编码工作或重新启动服务。 系统管理员、租户和客户管理员可以根据需要自定义配色方案、…...
智能物联网远传冷水表管理系统
智能物联网远传冷水表管理系统是一种基于物联网技术的先进系统,旨在实现对冷水表的远程监测、数据传输和智能化管理。本文将从系统特点、构成以及带来的效益三个方面展开介绍。 系统特点 1.远程监测:系统可以实现对冷水表数据的远程监测,无…...
Qt教程3-Ubuntu(x86_64)上配置arm64(aarch64)交叉编译环境及QT编译arm64架构工程
汇创慧玩 写在前面1. 查看系统架构相关指令2. ARM64交叉编译器环境搭建3. Qt编译arm64环境搭建4. 配置 Qt的本地aarch64交叉编译器5. 工程建立及编译验证 写在前面 苦辣酸甜时光八载,春夏秋冬志此一生 Qt简介: Qt(官方发音 [kju:t]ÿ…...
2024年华为OD机试真题-最长子字符串的长度(二)-Python-OD统一考试(C卷)
题目描述: 给你一个字符串 s,字符串s首尾相连成一个环形 ,请你在环中找出l、o、x 字符都恰好出现了偶数次最长子字符串的长度。 输入描述: 输入是一串小写的字母组成的字符串。 输出描述: 输出是一个整数 补充说明: 1 <= s.length <= 5 x 10^5 s 只包含小写英文字母…...
【24届数字IC秋招总结】正式批面试经验汇总5——蔚来、tp-link
文章目录 一、蔚来-数字芯片验证工程师1.1 一面面试问题1.2 二面面试问题二、tp-link-数字IC验证工程师2.1 面试问题一、蔚来-数字芯片验证工程师 面试时间:9.6 10.6 1.1 一面面试问题 1、 讲下项目结构 2、 scoreboard如何进行数据对比的 3、 golden 数据怎么产生的 4、 在…...
【JAVA基础篇教学】第八篇:Java中List详解说明
博主打算从0-1讲解下java基础教学,今天教学第八篇:Java中List详解说明。 在 Java 编程中,List 接口是一个非常常用的集合接口,它代表了一个有序的集合,可以包含重复的元素。List 接口提供了一系列操作方法,…...
RN向上向下滑动组件封装(带有渐变色)
这段组件代码逻辑是出事有一个View和下面的块,下面的块也就是红色区域可以按住向上向下滑动,当滑动到屏幕最上面则停止滑动,再向上滑动的过程中,上方的View的背景色也会有个渐变效果,大概逻辑就是这样 代码如下 import React, {useEffect, useRef, useState} from react; impo…...
27、Lua 学习笔记之五(Lua中的数学库)
Lua中的数学库 Lua5.1中数学库的所有函数如下表: math.pi 为圆周率常量 3.14159265358979323846 数学库说明例子方法abs取绝对值math.abs(-15)15acos反余弦函数math.acos(0.5)1.04719755asin反正弦函数math.asin(0.5)0.52359877atan2x / y的反正切值math.atan2(9…...
【C++成长记】C++入门 | 类和对象(中) |拷贝构造函数、赋值运算符重载、const成员函数、 取地址及const取地址操作符重载
🐌博主主页:🐌倔强的大蜗牛🐌 📚专栏分类:C❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、拷贝构造函数 1、概念 2、特征 二、赋值运算符重载 1、运算符重载 2、赋值运算符重载 3、前置…...
OpenHarmony实战开发-页面深色模式适配。
介绍 本示例介绍在开发应用以适应深色模式时,对于深色和浅色模式的适配方案,采取了多种策略如下: 1. 固定属性适配:对于部分组件的颜色属性,如背景色或字体颜色,若保持不变,可直接设定固定色值…...
域名解析出现错误,该如何解决?
域名作为网络地址,是我们访问网站的必经之路,域名解析就是把你的域名解析成一个ip地址,在使用的过程中遇到域名解析文件异常也是常有的事。如果域名解析出现错误,该怎么解决呢? 一、打开网页时,显示域名解析…...
从iPhone恢复已删除照片的最佳软件
本文分享了从iPhone恢复已删除照片的最佳软件。如果您正在寻找如何从iPhone恢复已删除的照片,请查看这篇文章。 为什么您需要软件从iPhone恢复已删除的照片? 没有什么比丢失iPhone上的重要数据更痛苦的了,尤其是一些具有珍贵回忆的照片。有时…...
MySQL模糊查询
一、MySQL通配符模糊查询(%,_) 1.1.通配符的分类 1.“%”百分号通配符:表示任何字符出现任意次数(可以是0次) 2.“_”下划线通配符:表示只能匹配单个字符,不能多也不能少,就是一个字符。当然…...
QEMU_v8搭建OP-TEE运行环境
文章目录 一、依赖下载二、设置网络三、安装下载四、运行OP-TEE 一、依赖下载 更新依赖包,下载一系列依赖。比如Python需要Python3.x版本,需要配置git的用户名和邮箱等。这里不详细展开了,很多博客都有涉及到。 二、设置网络 这一点非常重…...
C++11 设计模式0. 设计模式的基本概念,设计模式的准则,如何学习设计模式,24种设计模式的分为3大类
一 设计模式的基本概念: 模式:指事物的标准样式 或者 理解成 针对特定问题的可重用解决方案。 设计模式,是在特定问题发生时的可重用解决方案。 设计模式一般用于大型项目中。 大型项目中,设计模式保证所设计的模块之间代码的灵…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
