explicit关键字:用于防止单参数构造函数的隐式转换功能(多参数构造函数不会执行隐式转换)
class myDig {
int value;
public:
explicit myDig(int n) {
value = n;
}
}
void doSomething(myDig num); //函数,接受一个myDig参数,函数体不重要,故省略
void Test1() {
myDig dig1; // 错误,没有默认构造函数
doSomething(dig1); // 正确
myDig dig2(10); // 正确
doSomething(10); // 错误,myDig不支持隐式转换
doSomething(myDig(10)); //正确,调用**类型转换操作符**进行显示转换(也叫转型,cast), 调用myDig构造函数。
}
/*
* 如果去掉explicit则doSomething(10)正确, 执行了隐式转换
* 过程相当于执行 myDig tmp(10); doSomething(tmp);
*
* myDig dig3 = 10; //正确,也是隐式转换。
* /
在Effective c++中
被声明为explicit的构造函数通常比其non-explicit兄弟更受欢迎,因为它们禁止编译器执行非预期(往往也不被期望)的类型转换。