在C++中,有一些构造函数可以进行隐式类型转换,比如下面的例子:
class Widget
{
public:
Widget(); //构造函数1,不能进行隐式转换
Widget(int a); //构造函数2,可以进行int的隐式转换
Widget(float a, int b=0,int c=0); //构造函数3,可以进行float的隐式转换
};
上面Widget类有三个构造函数,其中构造函数2和3都可以进行隐式转换:
Widget w;
w = 2;
w = 3.5f;
从中也可以看到,只有一个参数的构造函数,或者构造函数有n个参数,但有n-1个参数提供了默认值,这样的构造函数才能进行隐式转换。
这种隐式的转换有时并不一定是合乎要求的,可能会导致一些隐藏的bug;因此C++11新增了关键字explicit,可以禁止这种隐式转换:
class Widget
{
public:
Widget();
explicit Widget(int a);
explicit Widget(float a, int b=0,int c=0);
};
这样一来,无论是哪个构造函数都不能再进行隐式转换了:
Widget w;
w = Widget(2);
w = (Widget)3;