先看下面的一个例子:
class Number
{
public:
Number(int a):m_num(a){}
~Number();
private:
int m_num;
};
int main()
{
Number num1=10; //隐式调用构造函数
Number num2(20); //显示调用构造函数
Number *num3=new Number(30);//显示调用构造函数
return 0;
}
执行 Number num1=10的时候编译器会进行默认的类型转化。即:
Number temp(10);
num1=temp;
也就是说会默认调用Number(int a):m_num(a){}。
但是如果在Number(int a):m_num(a){}之前添加一个explicit的话,就可以阻止这种默认的转化。并且编译器会把该构造函数看成默认构造函数,注意构造函数只能有一个参数才能使用explicit修饰!
class Number
{
public:
explicit Number(int a):m_num(a){}
~Number();
private:
int m_num;
};
int main()
{
Number num1=10; //隐式调用构造函数,由于声明了explicit,所以调用失败
Number num2(20); //显示调用构造函数
Number *num3=new Number(30);//显示调用构造函数
return 0;
}