不同数据间的类型转换
c++中数据间的类型转换常见的两种情况:
系统预定义的基本数据类型之间的转换和用户自定义的类类型和其他数据类型之间的转换。
一、系统预定义的基本数据类型之间的转换
系统预定义的基本数据类型之间的转换,c++中提供了两种方式:隐式类型转换和显式类型转换。
int a = 15,sum;
double b = 3.87;
sum = a + b;//-------(1)
cout<<"隐式转换:a+b="<<sum<<endl;
sum=(int)(a+b);//c
sum=int(a+b);//c++
cout<<"显式转换:a+b="<<sum<<endl;
对于隐式类型转换,编译系统先将a值转化为double类型,然后再和b值相加,得到18.87。最后18.87赋值给整型变量sum时,转化为整型18。对于显式类型转换,a + b 得到18.87,然后被强制类型转换为int型。
二、用户自定义的类类型和其他数据类型之间的转换
用户自定义的类类型和其他数据类型之间的转换一般通过两种方法:转换构造函数和类型转换函数
1、转换构造函数
转换构造函数不仅可以将预定义的数据类型转换为自定义类的对象;也可以将另一个类的对象转换成转换构造函数所在类的对象,但是转换构造函数不能把类的对象转换为基本数据类型。
一般转换构造函数的定义形式如下:
类名(待转换类型)
{
函数体;
}
<span style="font-size:18px;">class Point //坐标类
{
private://私有
double x;//x坐标
double y;//y坐标
public:
Point(double x,double y)
{
this->x = x;
this->y = y;
}
Point(double d = 0)//转换构造函数
{
x = d;//
y = 0;//
}
Point operator+(Point com1);//或friend Complex operator+(Complex com1,Complex com2);
void showComplex();
};
Point Point ::operator+(Point com1)
{
return Point (x+com1.x,y+com1.y);
}
void Point ::showComplex()
{
cout<<x;
cout<<",";
cout<<y<<endl;
}
int main()
{
Point point(10,10),sum;
sum = point + Point(15.8);//这段语句可以换成 Point ha(15.8); sum = point + Point(15.8);
sum.showComplex();//
return 0;
}</span>
Point(15.8)这个是产生了一个无名Point类的临时对象。
2、类型转换函数
转换构造函数不能把类的对象转换为基本数据类型,为此c++利用类型转换函数来解决。
类型转换函数一般定义形式如下:
operator 目标类型()
{
return 目标类型的数据;
}
附加说明:
目标类型是所要转化成的类型名,类型转换函数的函数名前不能指定返回类型,且没有参数。
class Complex //复数类
{
private://私有
double real;//实数
double imag;//虚数
public:
Complex(double real,double imag)
{
this->real=real;
this->imag=imag;
}
operator double();//声明类型转换函数
};
Complex::operator double()//定义类型转换函数
{
return real;//返回实数部分
}
int main()
{
Complex com(10,10);
double total;
//total = double(com)+8.7;//double(com)把复数(10+10i)转换为双精度数10.0 这个与下面的语句实现同样的功能
total = com.operator double() + 8.7;
cout<<"把Complex类对象转化为double类型与8.7相加为:"<<total;
return 0;
}
注意:(1)类型转换函数只能作为类的成员函数,不能定义为类的友元函数;(2)类型转换函数中必须有return语句,即必须送回目标类型的数据作为函数返回值;(3)一个类可以定义多个类型转换函数,C++编译器会根据函数名来自动调用相应的类型转换函数