explicit 关键字用于阻止编译器在转换构造函数上进行不期望的隐式类型转换。被声明为 explicit 的构造函数只能以显式方式调用,无法参与隐式转换。
示例代码
下面的例子对比了普通构造函数和带 explicit 修饰的构造函数在调用上的差异:
class A
{
public:
A(int x)
{
}
};
class B
{
public:
explicit B(int x)
{
}
};
A a = 5;//OK隐式调用
A a1(5);//OK 显式调用
B b = 5;//ERROR
B b1(5);/OK
类 A 的构造函数未被声明为 explicit,因此 A a = 5; 这种形式的隐式调用合法。而类 B 的构造函数被 explicit 修饰,B b = 5; 会被编译器拒绝,必须写成 B b1(5); 这样的显式构造形式才能通过编译。