一、系统预定义类型间的转换
1. 隐式类型转换
在赋值表达式 A=B 的情况下,赋值运算符右端B的值需转换为A类型后进行赋值;
当char或short类型变量与int类型变量进行运算时,将char或short类型转换成int类型;
当两个操作对象类型不一致时,在算术运算前,级别低的自动转换为级别高的类型。
2. 显式类型转换
强制转换法: (类型名)表达式
函数法: 类型名(表达式)
二、类类型与系统预定义类型间的转换
1. 通过构造函数进行类型转换
说明:
构造函数具有类型转换的作用,它将其他类型的值转换为它所在类的类型的值;
为了用构造函数完成类类型转换,类内至少定义一个只带一个参数(或其他参数都带有默认值)的构造函数;
当需要类型转换,系统自动调用该构造函数,创造该类的一个临时对象,该对象由被转换的值初始化,从而实现类型转换;
此种转换方式只能从基本类型(如int等)向自定义的类类型转换,不能把自定义类型的数据类型转换成基本类型的数据。
例子:
#include <iostream>
using namespace std;
class KExample
{
private:
int num;
public:
KExample(int);
void Print();
};
KExample::KExample(int n)
{
num = n;
cout<<"Initializing with : "<<num<<endl;
}
void KExample::Print()
{
cout<<"num = "<<num<<endl;
}
int main()
{
KExample X(3);
X.Print();
cout<<"-------------------/n";
KExample Y = KExample(6); //通过构造函数KExample(int),
Y.Print(); //将6转换为类类型KExample后赋值给对象Y
cout<<"-------------------/n";
KExample Z = 9; //通过构造函数KExample(int),
Z.Print(); //将9转换为类类型KExample后赋值给对象Z
return 0;
}
程序结果:
Initializing with : 3
num = 3
---------------------
Initializing with : 6
num = 6
---------------------
Initializing with : 9
num = 9
2. 通过类类型转换函数进行类型转换
类类型转换函数定义的一般格式:
operator 目的类型()
{
//函数体
return 目的类型的数据;
}
访问格式:
目的类型(源类类型);
说明:
定义格式中的目的类型(为要转换成的类型)既可以是自定义的类型,也可以是预定义的基本类型;
此方法是将自定义类型转换成基本类型或自定义类型;
类类型转换函数只能定义为一个类的成员函数;
类类型转换函数没有参数,也不显示给出返回类型,且必须返回目的类型数据;
一个类可定义多个类类型转换函数,c++编译器将根据操作数的类型自动地选择一个合适的类类型转换函数与之匹配;
在可能初相二义性的情况下,应显示地使用类类型转换函数进行类型转换;
类型转换函数可分为显示转换和隐式转换。
显示转换的例子:
#include <iostream>
using namespace std;
class KComplex
{
private:
float real, imag;
public:
KComplex(float r = 0.0, float i = 0)
{
real = r;
imag = i;
cout<<"Constructing.../n";
}
operator float() //类类型转换函数
{
cout<<"Type changed to float.../n";
return real;
}
operator int() //类类型转换函数
{
cout<<"Type changed to int.../n";
return int(imag);
}
void Print()
{
cout<<'('<<real<<','<<imag<<')'<<endl;
}
};
int main()
{
KComplex a(2.2, 4.4);
a.Print();
cout<<float(a) * 0.5<<endl; //显示转换
KComplex b(4.4, 6.6);
b.Print();
cout<<int(b) * 2<<endl; //显示转换
return 0;
}
程序结果:
Constructing...
(2.2,4.4)
Type changed to float...
1.1
Constructing...
(4.4,6.6)
Type changed to int...
12
隐式转换的例子:
#include <iostream>
using namespace std;
class KComplex
{
private:
float real, imag;
public:
KComplex(float r = 0.0, float i = 0.0)
{
real = r;
imag = i;
cout<<"Constructing.../n";
}
operator int() //类类型转换函数
{
cout<<"Type changed to int.../n";
return int(imag + real);
}
void Print()
{
cout<<'('<<real<<','<<imag<<')'<<endl;
}
};
int main()
{
KComplex a(2.2, 4.4);
a.Print();
cout<<int(a) * 0.5<<endl;
cout<<"----------------------"<<endl;
KComplex b(4.4, 6.6);
b.Print();
cout<<int(b) * 2<<endl; //显示转换
cout<<"----------------------"<<endl;
KComplex c;
c = a + b; //隐式转换
c.Print();
return 0;
}
程序结果:
Constructing...
(2.2,4.4)
Type changed to int...
3.3
---------------------------
Constructing...
(4.4,6.6)
Type changed to int...
22
---------------------------
Constructing...
Type changed to int...
Type changed to int...
Constructing...
(17,0)
分析此程序中的隐式转换(c = a + b )的过程:
首先寻找成员函数“+”运算符,此处未找到;
再寻找非成员函数“+”运算符,此处未找到;
由于系统中存在内部运算符函数operator+(int,int),所以假定匹配其程序中的加法;
寻找能将参数(类KComplex的对象a1和a2)转换成int型的类型转换函数operator int(),结果找到;
于是将a1和a2转换成int类型,匹配内部的int加法,得到一个int型的结果;
左边的是KComplex对象,于是将这个结果转换成KComplex类的一个临时对象,然后将其赋值给KComple对象(其中调用了c的构造函数)。