在C语言中,类型转换有2种情况,分别是
- 隐式类型转换:编译器在编译阶段自动进行,能转就转成功,不能则编译失败
- 强制类型转换:需要用户自己处理
这种转换类型还是存在相关性的
C++的4种转换
static_cast``reinterpret_cast``const_cast``dynamic_cat
为什么C++又自己引入了4种类型转换呢?
因为c风格的转换格式还是又缺点的
- 隐式类型转换可能会造成进度的缺失
- 显式类型转换将所有情况混在一起,代码不够清晰
static_cast
static_cast
用于非多态类型的转换,其实和隐式类型转换差不多
float a = 1.2;
int b;
b = static_cast<int>(a);
reinterpret_cast
将一种类型转换为另一种不同的类型
double a = 13.14;
int b = static_cast<int>(a);
int* p = reinterpret_cast<int*>(b);
const_cast
最常用的用途就是删除变量的const属性,方便赋值
const int a = 1;
int* p = const_cast<int*>(&a);
*p = 2;
const_cast<>
尖括号里面是指针或引用,其他类型不可以。
dynamic_cast
dynamic_cat
用于将一个父类对象的指针或引用转换成子类对象的指针或引用
- 向上转型:子类对象指针、引用给父类(本身就支持不需要转换)
- 向下转型:父类对象指针、引用给子类(需要用
dynamic_cast
转换)
需要注意的是:
dynamic_cast
只能用于父类包含虚函数的类,也就是说,父类没有虚函数就不能这么用dynamic_cast
会检查是否能转换成功,能成功则转换,不能成功,则返回0
class A
{
public:
virtual void print()
{}
};
class B:public A
{};
int main()
{
A a;
B* b = dynamic_cast<B*>(&a);
}
下面这样就会转换不成功,那么此时a就是空的引用:
B b;
A& a = dynamic_cast<A&>(b);