首先是定义:
explicit关键字只能修饰只有一个参数的构造函数,或者有多个参数,但是除第一个参数外其他的参数都有默认值的构造函数。它的作用是表明构造函数是显式方式显示的。(类构造函数默认为隐式)
如果类构造函数参数大于或等于两个时, 是不会产生隐式转换的, 所以explicit关键字也就无效了
举个例子:
class AMD{
public:
AMD(int level){ //这里的构造函数默认就是隐式声明
.....
}
.....
}
在这种情况下,如果运行以下语句:
AMD a(3);
AMD b=10;
这两种都是没有问题的,第二句 AMD b=10; 没有问题的原因是:
C++中, 如果的构造函数只有一个参数时, 那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象.
也就是说 AMD b=10 在实际执行时操作等同于以下语句:
AMD b(10);
//或者
AMD c(10);
AMD b = c;
虽然解释的通了,但是这种写法仍然是不友好的,毕竟 AMD b=10 这种写法看上去就像是将整数赋值给对象,显得不伦不类,而且在复杂代码中容易让人感到迷惑 -->所以现在就要使用到explicit关键字了
经过explicit修饰后:
class AMD{
public:
explicit AMD(int level){ //修饰后构造函数就是显式声明
.....
}
.....
}
此时,再去执行之前那两条语句,
AMD a(3);依旧是没什么问题,但是 AMD b=10 就不再可行了(explicit防止了类构造函数的隐式自动转换)
(此时编译就会出错)
依照explicit关键字的定义,它还可以修饰多个参数(其中只有一个没有缺省值)的构造函数:
class AMD{
public:
explicit AMD(int level,int size=0....){ //除了第一个参数都有缺省值
.....
}
.....
}
这种情况下explicit关键字也是起作用的,使用AMD b = 10 等会产生隐式类型转换的语句依旧会报错。
由于用explicit修饰的构造函数会避免 意料不到 的类型变换,而且没有什么缺点,所以一般情况下还是鼓励使用explicit的
来源:51CTO
作者:sonissa
链接:https://blog.51cto.com/14232799/2483022