C++语言中,如果类的构造函数只有一个参数,那么默认情况下存在一种隐式转换,新标准增加了explicit关键字来,来限制这种隐式转换。
另外地,如果类构造函数参数大于或等于两个时, 是不会产生隐式转换的, 所以explicit关键字也就无效了。但是当除了第一个参数以外的其他参数都有默认值的时候, explicit关键字依然有效, 此时, 当调用构造函数时只传入一个参数, 等效于只有一个参数的类构造函数。
默认使用隐式转换
class Func {
public:
Func(); // 空构造函数
Func(double a); // 含一个参数的构造函数
Func(int a, int b); // 含两个参数的构造函数
Func(int a, double b = 1.2); // 带有默认初始值的构造函数
~Func();
};
// 调用
Func v1(0.1); // 直接调用含一个参数的构造函数
Func v2 = 0.2; // 也是调用含有一个参数的构造函数,但是包含一次隐式转换
Func v3(2, 3);
Func v3 = 2; // 隐式转换,调用带有默认初始值的构造函数Func(int a, double b = 1.2)
使用explicit关键字,限制隐式转换
class Func {
public:
Func() {} // 空构造函数
explicit Func(double a); // 该构造函数无法进行隐式类类型转换
explicit Func(int a, int b); // 含有两个参数,explicit对其无效,构造函数本身也是不能隐式转换的
explicit Func(int a, double b = 1.2); // 该构造函数无法进行隐式类类型转换
~Func() {}
};
// 调用
Func v1(0.1); // 正确
Func v2 = 0.2; // 错误,不能进行隐式类类型转换
Func v3(2, 3); // 正确
Func v4 = 2; // 错误,不能进行隐式类类型转换



