引入:
int main()
{
int i = 1;
// 隐式类型转换
double d = i;
printf("%d, %.2f\n", i, d);
return 0;
}
如下图所示:
int main()
{
int i = 1;
int* p = &i;
// 显示的强制类型转换
int address = (int)p;
printf("%p, %d\n", p, address);
return 0;
}
C风格的转换格式很简单,但是有不少缺点的:
因此C++提出了自己的类型转化风格,注意因为C++要兼容C语言,所以C++中还可以使用C语言的 转化风格。
int main()
{
// 相关类型/相近类型
double d = 12.34;
int a = static_cast<int>(d);
cout << a << endl;
return 0;
}
int main()
{
// 不相关类型
int* p1 = &a;
int address = reinterpret_cast<int>(p1);
return 0;
}
int main()
{
// 去掉const属性
volatile const int n = 10;
int* p2 = const_cast<int*>(&n);
return 0;
}
class A
{
public:
virtual void f() {}
int _x = 0;
};
class B : public A
{
public:
int _y = 0;
};
void fun(A* pa)
{
// pa是指向子类对象B的,转换可以成功,正常返回地址
// pa是指向父类对象A的,转换失败,返回空指针
B* pb = dynamic_cast<B*>(pa);
if (pb)
{
cout << "转换成功" << endl;
pb->_x++;
pb->_y++;
}
else
{
cout << "转换失败" << endl;
}
}