1.类型转换按方式分为隐式转换和显式转换。
        隐式转换:由编译器自动完成,无需用户干预。
        显式转换:采用一定的形式进行转换:类型名(数据) / C中(类型名)数据
2.关于转换构造函数
        构造函数的一种,主要用于类型转换,格式严格规定为单参数构造函数。
        例:Complex类
             Complex(double r){Real=r;imag=0;}  int(double r);
             Complex a;
              a=2.4; 相当于a=Complex(2.4);
         编译器如果发现语法有问题,会检查是否存在转换构造函数,有,则隐式转换。
 3.关于类型转换函数
         转换构造函数是将一种数据类型转换成类对象。如果编译器发现需要将类转换成某种数据类型,那该怎么办?
         类型转换函数的一般形式:operator 类型名(){转换函数的实现}
        没有函数类型,没有参数。
         例:
     #include<iostream>
     using namespace std;
      class Complex
      {
        public :
         Complex(){real=0;imag=0;}
         Complex(double r,double i){real=r;imag=i;}
          operator double(){return real;}
          private:
           double real;
           double imag;
       };
       int main()
    {
         Complex c1(3,4),c2(5,-10),c3;
         double d;
         d=2.5+c1;
         cout<<d<<end1;
         return0;
    }
     d=2.5+c1;
     由于类成员没有对运算符+重载,所以2.5与c1无法直接向加。编译器发现存在类型转换函数,故将 隐式调用double(), c1转换为 double 型3,并将该结果存放在临时变量里。运算d=2.5+3得到结果。
 若主函数中有c3=2.5+c1;如果没有运算符+的重载,编译器会出错。当 运算符重载函数作为类成员出现时,编译器会理解为c3=2.5.operator +(c1);由于2.5非complex类,这种解析编译器也会出错。对于c3=c1+2.5的格式,编译器会正确处理。
 这种情况使用户不能方便的使用交换率,为了改变这一不便,需要将重载函数作为友元函数而不是类成员函数。(双目运算符的重载一般都采用友元函数的方式)
 friend Complex operator +(Complex c1,complex c2);
    在函数体外定义:
 Complex operator +(Complex c1,complex c2);
  {return Complex (c1.real +c2.real,c1.imag+c2.imag);}
这样,对于c3=2.5+c1;(需要增加转换构造函数)编译器在遇到+号时,会搜索+两端的数据并引用友元的运算符重载函数,其形式变为:c3=operator+(2.5,c1); 而参数定义都是Complex对象,因此,隐式调用转换构造函数,形式变为:c3=operator+(Complex (2.5),c1);