当构造函数只有一个参数或有n个参数,但有n-1个参数有默认值时
class A
{
public:
A(int a, int b = 10) x(a),y(b){}
private:
int x;
int y;
};
A a(1);//定义一个对象a
A a = 1;//虽然有点莫名其妙,但在编译器看来这合法的,编译器会用1来建立一个A类对象,等效于A a(1);或A b(1); A a = b;
//这种操作成为隐式转换
问题来了,如何取消这种骚操作呢?可以在构造函数前加explicit,即explict A (int a, int b = 10) x(a), y(b){}
。这样编译器就不会进行隐式转换了。注:无参和多参构造函数是不存在隐式转换的,也就没有必要加explicit。