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