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);