隐式类类型转换
C++primer Note :
- 能通过 单个形参 来调用的构造函数定义了从 形参类型 到 该类类型 的一个隐式转换
什么是“隐式类类型转换”呢? 上面提到了,是从 构造函数形参类型 到 该类类型 的一个编译器的自动转换。举例如下:
class A
{
public:
A(string s):str(s){} //构造函数
string getStr()
{
return str;
}
private:
string str;
};
void print(A a) //非成员函数
{
cout<<a.getStr()<<endl;
}
当我们想调用void print(A a)函数时有以下两种方法:
string s = "abc";
//普通方法
print(A(s)); //正确:传入的是一个A类型的对象
//隐式类型转化方法(一步)
print(s); //正确:传入的是一个string,编译器自动给string创建了一个A类型对象,完成隐式类型转换
//隐式类型转换(两步)
print("abc"); //错误:先把"abc"转换为string对象,然后再把string对象转化为A类型对象
注:只允许一步类类型转换
explicit关键字
explicit关键字放在构造函数前,禁止上述的隐式类型转换,但不禁止显示类型转换。例:
class A
{
public:
explicit A(string s):str(s){} //构造函数
string getStr()
{
return str;
}
private:
string str;
};
void print(A a) //非成员函数
{
cout<<a.getStr()<<endl;
}
string s = "abc";
print(s); //错误:禁止隐式类类型转换
print(A(s)); //正确:实参是一个显示构造的A对象
print(static_cast<A>(s));//正确:static_cast显示类型转换可以使用explicit的构造函数
总结:
- 能通过 单个形参 来调用的构造函数定义了从 形参类型 到 该类类型 的一个隐式转换;但explicit能够禁止这种转换。