目录
一、前言
二、explicit关键字是什么?
三、构造函数还具有类型转换的作用
🍎单参构造函数
✨引出 explicit 关键字
🍍多参构造函数
✨为什么需要explicit关键字?
✨怎么使用explicit关键字?
四、总结
五、共勉
在我们自己平时写 C++ 代码的时候,较少会用到 explicit关键字 。但是在C++相关的标准类库中,看到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; };
int main() { // d1 和 d2 都会调用构造函数 Date d1(2022); Date d2 = 2023; return 0; }
此时,大家可能会产生疑问,这种构造方式从来没有见过,为什么 【Date d2 = 2023】会调用 构造函数呢? 其实这都是因为有【隐式类型转换】的存在,下面我将从一个简单的例子来为大家讲解。
int i = 1; double d = i;
[Date]
把它里面的year初始化为2023,然后再通过这个临时对象进行拷贝构造给到d2
,💬小蛋:不是说构造函数有初始化列表吗?拷贝构造怎么去初始化呢?
//拷贝构造 Date(const Date& d) :_year(d._year) ,_month(d._month) ,_day(d._day) {}
刚才说到了中间会产生一个临时对象,而且会调用构造 + 拷贝构造,那此时我们在Date类中写一个拷贝构造函数,调试再去看看会不会去进行调用
💬小蛋:但您是怎么知道中间赋值这一块产生了临时对象呢?如果不清楚编译器的优化机制这一块肯定就会认为这里只有一个构造
Date& d3 = 2024;
const
做修饰后,就不会出现问题了,这是为什么呢?const
类型修饰对象不会有问题 但若是你不想让这种隐式类型转换发生怎么办呢?此时就可以使用到C++中的一个关键字叫做
explicit
explicit Date(int year) :_year(year) {}
对于上面所讲的都是基于单参的构造函数,接下去我们来瞧瞧多参的构造函数
//多参构造函数 Date(int year, int month ,int day = 31) :_year(year) ,_month(month) ,_day(day) {}
d1
没有问题传入了两个参数,但是若是像上面那样沿袭单参构造函数这么去初始化还行得通吗?很明显不行,编译器报出了错误💬小蛋:那要怎么办呀,对于一定要传入多参数进行构造的场景
{}
就可以了,可能你觉得这种写法像是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关键字在C++中只能用于修饰类的构造函数,它用来修饰只有一个参数的类构造函数,以表明该构造函数是显式的,而非隐式的。
只要在构造函数名前加上explicit就能禁止类对象之间的隐式转换、禁止隐式调用拷贝构造函数。
以下就是我对C++ explicit关键字的理解,如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对C++ 的理解,请持续关注我哦!!!
上一篇:2022版开挂we poke有挂的(脚本)微扑克的辅助工具(2023已更新)(哔哩哔哩)
下一篇:2023 最新版IntelliJ IDEA 2023.1创建Java Web前(vue3)后端(spring-boot3)分离 项目详细步骤(图文详解)