对象的隐式转换:
对于类类型来说,非同类型的单参数构造函数定义了一条从该参数的类型向该类类型进行隐式转换的规则。
当采用单个实参的初始式时,编译器会自动根据实参的类型,调用单参数构造函数还是复制构造函数。
例如, std::string 有一个单参数构造函数 string(const char*); ,从而使得可以使用字符串字面 “hello” 直接去调用单参数构造函数,创建一个string 对象,相当于执行了string s = “hello” ,而不是去调用复制构造函数,执行了从字符串字面量对象到 string 对象的隐式转换。
void f(string s);
f("hello")
但是,在许多情况下隐式转换容易导致问题。例如,下面的代码不小 心使用 10 错误地作了一个调用 f(10) ,但是编译器不会报错。
class A{
public:
A(int i);
//...
};
void f(A a);
//...
f(10);//可以运行
为了防止这种错误,可以使用 explicit 修饰单参数构造函数,要求使用 值进行单参数初始化时,只能作复制初始化,禁止实参到对象的隐式转换
class A{
public:
explicit A(int i);
//...
};
void f(A a);
//...
f(10);//错误
f(A{5});//可以运行