转换操作符

来源:互联网 发布:win7 网络连接图标 编辑:程序博客网 时间:2024/04/29 18:36

有两种转换,我一向比较陌生,用得少嘛!并且都是编译器自动转换。
    
第一种:内置数据类型(大多数)到类的转换。最经典的是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

原创粉丝点击