目录
一、前言
二、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++ 的理解,请持续关注我哦!!!
玻璃钢生产厂家秋季商场美陈现价玻璃钢花盆有哪些好处大型玻璃钢雕塑合作公司玻璃钢烽火台雕塑蚌埠特色玻璃钢雕塑联系方式重庆玻璃钢彩绘雕塑玻璃钢雕塑师电话浙江佛像玻璃钢雕塑定制承德玻璃钢雕塑定制玻璃钢艺术雕塑供应商玻璃钢雕塑的手糊制作步骤玻璃钢雕塑鉴别安徽水果玻璃钢雕塑销售厂家遵义玻璃钢雕塑制作哪家好昆山玻璃钢雕塑沈阳承接玻璃钢座椅雕塑玻璃钢雕塑鲨鱼临沂广场玻璃钢雕塑价格浙江仿铜玻璃钢雕塑销售电话福建玻璃钢花盆花器井冈山玻璃钢胡萝卜雕塑厂家在哪韶关人物玻璃钢卡通雕塑河源玻璃钢雕塑工艺动漫人物玻璃钢雕塑供应商河南卡通玻璃钢雕塑工厂安徽学校玻璃钢抽象艺术雕塑摆件定西玻璃钢植物雕塑价格西安仿铜玻璃钢雕塑定做铸铜玻璃钢彩绘雕塑制造玻璃钢米老鼠雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万