c/c++ explicit用法

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

1 class test
2 {
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 }

 

posted @ 2017-11-04 17:08  LBNOQYX  阅读(322)  评论(0编辑  收藏  举报