博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c/c++ explicit用法
阅读量:5286 次
发布时间:2019-06-14

本文共 1035 字,大约阅读时间需要 3 分钟。

试想一个类,它的构造函数只有一个参数,

1 class test2 {3     test( int a ) {} 4 }

这时我想用一个int b = 10初始化它,这当然没问题,但如果你用一个字符例如'c'初始化test类,会发现代码成功编译

1 test a = 12; //OK!2 3 test b = 'c'; //also OK!

这时因为字符’c'自动转型为了一个int,这在c++中是可行的,一般来说,这种转型是很方便的,因为你不需要刻意为了一个变量的类型而去用相应的关键字,但在某些情况下,程序员们不希望自己的类被一些“奇奇怪怪”的变量给初始化了,这很可能导致错误( 例如,12.4567转化为int就变为12了)

 

所以我们就需要使用explicit了。

C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式)

当构造函数被explicit修饰时,刚才的用’c'初始化的类编译器就会报错了,因为explicit表示了你只希望用int而不是其他的什么类型(哪怕它可以转化为int)来初始化这个类。

 

explicit关键字只对有一个参数的类构造函数有效, 如果类构造函数参数大于或等于两个时, 是不会产生隐式转换的, 所以explicit关键字也就无效了

这种情况下,加不加explicit效果是一样的,当然这也有例外,构造函数除了第一个参数外剩下参数都有默认值时,explicit仍然有用

1 int main() 2 { 3     class test  4     { 5         test( int a, int b, int c ) { } 6         //加不加explicit都一样,多参数情况自动不允许隐式转化 7     }; 8      9     class test_2 10     {11         explicit test_2( int a, int b = 0, int c = 0 ) { }12         //当构造函数只传入一个参数时,explicit仍能保证其不能隐式转化13     };14 }

 

转载于:https://www.cnblogs.com/chaoswr/p/7783877.html

你可能感兴趣的文章
Python数据类型-布尔/数字/字符串/列表/元组/字典/集合
查看>>
【刷题】SPOJ 705 SUBST1 - New Distinct Substrings
查看>>
IEEE 754浮点数表示标准
查看>>
declare 结构用来设定一段代码的执行指令
查看>>
图解算法读书笔记
查看>>
调试学习笔记
查看>>
解开lambda最强作用的神秘面纱
查看>>
Java基础:Object类中的equals与hashCode方法
查看>>
C#拦截Http请求
查看>>
图片下载器
查看>>
找不到docker.socket解决方法
查看>>
Activity生命周期
查看>>
HTML中head头结构
查看>>
sql server和mysql中分别实现分页功能
查看>>
jQuery CircleCounter的环形倒计时效果
查看>>
kafka server管理
查看>>
系统设计与分析(六)
查看>>
Java IO-1 File类
查看>>
HW5.29
查看>>
Linux查看物理CPU个数,核数,逻辑CPU个数;内存信息
查看>>