C++的类型转换,两种函数允许编译器执行这样的操作:单参数构造和隐式类型转换操作符。
单参数构造指可能声明单一参数,有可能拥有多个参数,并且除了第一参数之外都有默认值:
class Name
{
public:
Name(const string& s); //可以把string转换为name
...
};
class Rational
{
public:
Rational(int numerator = 0, int denominator = 1); //可以把int转为Rational
...
}
隐式类型转换操作符,是一个拥有奇怪名称的member function:关键词operator之后加上一个类型名称。你不能为此函数指定返回值类型,因为其返回值类型基本上已经表在于函数名称上。
class Rational
{
public:
...
operator double() const; //将Rational转换为double
};
Rational r(1,2);
double d = 0.5 * r; //将r转换为double,然后执行乘法运算
假设你想像内建类型一样输出 Rational objects内容,也就是希望这么做:
Rational r(1, 2);
cout << r; //应该输出 1/2
但假设忘记为Rational写一个operator <<,编译器在执行上面的动作时候,它会想尽各种办法(包括找出一系列可接受的隐式类型转换)让函数调用成功,它发现了,只要调用Rational::operator double,将r隐式转换为double,调用动作便能成功,于是,上述代码将r以浮点数而非分数的形式输出。
解决办法就是将以功能对等的另一个函数取代类型转换操作符,不妨使用一个名为asDouble的函数取代operator double。
通过单参数构造完成的隐式转换,可以使用explicit声明进行消除。
template<class T>
class Array{
public:
explicit Array(int size);
...
};
|