类型转换分为自动转换和手动转换,也就是在代码中是否需要显式说明。
考虑这样一个问题,转换时,编译器要做什么操作?
比如,
short - > int
int -> short
int -> float
float -> int
subClass -> BaseClass
BaseClass -> subClass
我们用下面这一段代码验证一下:
class A
{
int na;
};
class B : public A{
};
class C
{
};
// 使用
short int s = 2;
int na = 3;
float f = 1.1;
A * pa = new A();
B * pb = new B();
s = na;
na = s;
f = na;
na = f;
pa = pb;
pb = (B*)pa;
//C * pc = new C();
//pa = (A)pc; //没有继承关系的类不能相互强转。
s = na; // 直接赋值,无其他操作
0017815D mov ax,word ptr [na]
00178161 mov word ptr [s],ax
na = s; // 直接赋值,无其他操作
00178165 movsx eax,word ptr [s]
00178169 mov dword ptr [na],eax
f = na; // 补码 到IEEE 浮点编码转换
0017816C cvtsi2ss xmm0,dword ptr [na]
00178171 movss dword ptr [f],xmm0
na = f; // IEEE 浮点编码 到补码转换
00178176 cvttss2si eax,dword ptr [f]
0017817B mov dword ptr [na],eax
pa = pb;// 直接赋值,无其他操作
0017817E mov eax,dword ptr [pb]
00178181 mov dword ptr [pa],eax
pb = (B*)pa;// 直接赋值,无其他操作
00178184 mov eax,dword ptr [pa]
00178187 mov dword ptr [pb],eax
可以看到,如果存储方式相同,不会做任何转换,存储方式不同时,才会进行必要转换。
没有继承关系的类不能相互强转。