对于标准数据类型的转换,编译系统有章可循,知道怎样进行转换。而对用户自己声明的类型,编译系统并不知道怎样进行转换,解决这个问题的关键是让编译系统知道怎样去进行折现转换,需要定义一些专门的函数类处理。
1、转换构造函数
转换构造函数的作用是将一个其它类型的数据转换成一个类的对象以复数类Complex为例,我们来介绍一下 转换构造函数。
转换构造函数是构造函数的重载,它只有一个形参,如
Complex(double r)
{
_real=r;
_imag=0;
}
其作用是将double类型的参数r转换成Complex类的对象,将r作为复数的实部,虚部为0。用户可以自己根据需要定义转换构造函数,在函数体中告诉编译系统怎样去进行转换。在类体中,可以有转换构造函数,也可以没有转换构造函数,视情况而定。假如在Complex类中定义了上面的转换构造函数,在Complex类的作用域中有以下声明语句:
Complex c(2.4) //建立对象c,由于只有一个参数,所以调用转换构造函数
建立对象c,其实部值为2.4,虚部值为0。它的作用就是将double类型的常数转换成一个名为c的Complex类对象。
如果已经对+运算符进行了重载,使之能进行两个Complex类对象的相加则:
c1=c+1.2; //错误,不能将一个Complex类对象与浮点数相
c2=c+Complex(1.2); //正确,将1.2转换成Complex类的对象
不仅可以将一个标准类型数据转换成类对象,也可以将另一个类的对象转换成转换构造函数所在的类的对象。
2、类型转换函数
类型转换函数的作用是将一个类对象转换成另一类型的数据。假设已经声明了复数类Complex,则可以这样定义类型转换函数:
operator double()
{
return _real;
}
函数返回double型变量_real的值。它的作用是将一个Complex类的对象转换成一个double类型的数据,其返回值是Complex类中数据成员_real的值。
注意,这个函数不能指定类型,没有参数operator double是函数名,这和运算符重载是一样的。类型转换函数的一般类型是:
operator 类型名()
{实现转换的语句}
其返回值的类型与函数名中的类型一致,类型转换函数只能作为成员函数,因为转换的主体是类的对象。转换构造函数和类型转换函数有一个共同的功能,当需要的时候,编译系统会自动调用,建立一个无名的临时对象。
例:定义d1,d2是double类型,c1是Complex类对象,类中已经定义类型转化函数。
d1=d2+c1 //系统会将c1转换成double类型数据,建立一个临时的double类型变量,d2相加,最后将一个double类型数据赋给d1。