explicit是为了防止隐式使用拷贝构造函数。看如下例子:
extern void f(T i);
class T{
......
public:
T(int i);
......
}
调用函数f:
调用函数f:
......
int x=0;
f(x);
......
这时会有隐含的类型转换int -> T
......
int x=0;
f(x);
......
这时会有隐含的类型转换int -> T
但如果声明构造函数的时候有
explicit T(int i);
上述代码报错,explicit 阻止了隐含的类型转换。
f(99); //错误
f(Integer(99)); //OK,显式转换
f(static_cast<Integer>
(99)); //OK,强制转换