有两种转换,我一向比较陌生,用得少嘛!并且都是编译器自动转换。
第一种:内置数据类型(大多数)到类的转换。最经典的是C类型字符串到string类对象的转换。如:
fun(string str);
fun("wangyi");//编译器调用了string(char*),自动转换。
如果希望编译器不自动调用具有此参数的构造函数,在构造函数前加上explicit。
第二种:类到内置数据类型或者其他类的转换。也是编译器自动调用。如:
class SmallInt
{
public:
SmallInt(int i=0):val(i)
{
if(i<0 ||k>255)
throw std::out_of_range("bad");
}
operator int() const //从SmallInt转换成int.
{
return val;
}
private:
std::size_t val;
}
转换函数需要注意:
1)无返回类型,但必须显示返回一个指定类型的值。
2)必须是成员函数,形参表为空。
3)通常定义为const。
编译器在哪些地方会自动调用转换函数呢?如下:
SmallInt si;
double d;
si+d;//si->int->double
if(si);//si->int->bool
cout<<si<<endl;//si->int
int calc(int);
calc(si);//si->int
int i=static_cast<int>(si)//显示转换中也要调用。
注意:只能应用一个类类型转换。即编译器不会连续调用类的转换函数。如:类Integral实现了转换成SmanllInt的转换函数。
Intgral ival;
ival+3;//error.不能ival->SmallInt->int
以上两种转换,就会出现很多二义性,都和重载函数有关:
1)由转换转换函数重载引起的
class SmallInt
{
operator int() const;
operator double() const;
};
fun(long double);
SmallInt si;
fun(si);//error。调用哪一个转换函数呢?是si->int->long double还是 si->double->long double?
2)由构造函数重载引起的二义性
class SmallInt
{
SmallInt (int);
SmallInt(double);
};
SmallInt si;
fun(SmallInt);
long double ld;
fun(ld);//error。是调用哪个构造函数呢?是ld->int ->SmallInt还是ld->double->SmallInt?
3)相互提供隐式转换的类引起的二义性
class SmallInt
{
Smallnt(Integral);
};
Integral
{
operator SmallInt() const;
};
fun(SmallInt);
Intetal iVal;
fun(iVal);//error.是调用SmllInt(Intetal)还是operator SmallInt()?
提示:所以最好避免编写相互提供隐式转换的成对的类。
4)转换函数,构造函数,和操作符引起的二义性
class SmallInt
{
SmllInt(int i=0);
operator int () const;
friend SmallInt operator+(cosnt SmallInt&,const SmallInt&);
};
SmllInt s1,s2;
SmallInt s3=s1+s2;//operator+
int i=s1+10;//s1->int,内置的operator+;10->SmallInt,友元operator+;
转自:http://hi.baidu.com/%BC%F2%B5%A5%BE%CD%BA%C3_88/blog/item/fff1021184fa147aca80c495.html