试想一个类,它的构造函数只有一个参数,
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 }