c++中四种cast转换
C++四种强制转换方式,应用场景,细节
1、const_cast
- 用于将
const变量
转为非const
。 - 用来修饰类型的
const
或volatile
属性。除了去掉const
或者volatile
修饰之外,type_id
和expression
得到的类型是一样的。 - 但需要特别注意的是
const_cast
不是用于去除变量的常量性,而是去除指向常数对象的指针或引用的常量性,其去除常量性的对象必须为指针或引用。
2、static_cast
- 用于各种隐式转换,比如
非const转const
,void * 转指针
等,static_cast
能用于多态向上转化,如果向下转能成功但是不安全,结果未知; - 用于基本数据类型之类的转换,如把int转换为char,把int转换成enum。这种转换的安全性也要开发人员来保证。
3、dynamic_cast
用于动态类型转换。只能用于含有虚函数的类,用于类层次间的向上和向下转化。只能转指针或引用。向下转化时,如果是非法的对于指针返回NULL,对于引用抛异常。 要深入了解内部转换的原理。
- 向上转换:指的是子类向基类的转换。
- 向下转换:指的是基类向子类的转换。
它通过判断在执行到该语句的时候变量的运行时类型和要转换的类型是否相同来判断是否能够进行向下转换。
dynamic_cast
会动用运行时信息RTTI
来进行类型安全检查,因此dynamic_cast
存在一定的效率损失。当使用dynamic_cast
时,该类型必须含有虚函数,这是因为dynamic_cast
使用了存储在vtable
中的信息来判断实际的类型,RTTI
运行时类型识别用于判断类型。typeid
表达式的形式时typeid(e)
,typeid
操作的结果是一个常量对象的引用,该对象的类型是type_info
或type_info
的派生。
4、reinterpret_cast
- 几乎什么都可以转,比如将
int
转指针 ,可能会出问题,尽量少用; - 可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。
为什么不使用C的强制转换?
- C的强制转换表面上看起来功能强大什么都能转,但是转化不够明确,不能进行错误检查,容易出错。