目录
1. C语言中的类型转换
2. 为什么C++需要四种类型转换
3.C++有了四种类型转换,仍兼容c的类型转换
4. C++强制类型转换
(1) static_cast
(2)reinterpret_cast
(3)const_cast
(4)dynamic_cast 动态转换
5. RTTI(了解)
出了C++的四种类型转换,委员会只是期望大家使用上面规范的去转换,可读性会提升,出错的概率会降低。因为不是强制的,所以实际效果不好,大家都不遵守
static_cast 相近类型之间的类型
reinterpret_cast 不相近类型之间的类型
const_cast 去掉对象const属性的转换
dynamic_cast 规范向下转换,转换是安全的
static_cast 对应c语言隐式类型转换, reinterpret_cast 和 const_cast对应c语言强制类型转换(显式类型转换)
int main()
{
double d = 12.34;
int a = static_cast(d);
cout << a << endl;
return 0;
}
int a = 10;
int* p = &a;
//int x = static_cast(p); // 报错
int x = reinterpret_cast(p);
cout << x << endl;
int main()
{
const int ca = 2;
int* pi = const_cast(&ca);
*pi = 3;
cout << ca << endl;
cout << *pi<< endl;
return 0;
}
可以加volatile解决
dynamic_cast 规范向下转换,转换是安全的
dynamic_cast使用前提必须是多态,父类中必须有虚函数,无虚函数不可用
dynamic_cast使用:B* ptr = dynamic_cast(pa); ,指针是子类,才会转成子类指针;指针是父类,不会转成子类指针,会转成空指针。(因为父类指针转成子类指针时,会多看一段内存,这段内存就是子类比父类多的,就会导致越界)
class A
{
public:
virtual void f() {}
};
class B : public A
{};
// pa可能指向父类对象,也可能指向子类对象
// 如何区分pa是指向子类还是父类?
void fun(A* pa)
{
B* ptr = dynamic_cast(pa);
//B* ptr = reinterpret_cast(pa);
//B* ptr = (B*)pa;
if (ptr)
{
cout << "转换成功" << ptr << endl;
}
else
{
cout << "转换失败" << ptr << endl;
}
}
int main()
{
A a;
B b;
fun(&a);
fun(&b);
return 0;
}