首页 > 技术文章 > C++ cast 操作符

zjzazym 2015-03-26 12:58 原文

C风格的强制转换为 (T)expression

C++标准定义了四个新的转换符
 
1. dynamic_cast
只用于对象的指针和引用。转换失败时,指针为空,引用则抛出bad_cast异常。
主要用于执行“安全的向下类型的转换”。
要求父类必须有虚函数。
此cast根据RTTI信息检查操作是否有效,它是唯一可能有重大运行时代价的强制转型。
把指向父类的指针或引用转换为指向子类的,可能有重大的运行时开销
 
2. const_cast
const_cast<type_id>(expression)
用于修改类型的const或volatile属性。除了const或volatile修饰之外,type_id和expression的类型是一样的。一般用于强制消除对象的常量性。
去除const,volatile等属性
 
3.static_cast
static_cast<type-id>(expression)
把expression转换成type-id类型,但没有运行时类型检查来保证转换的安全性。它允许执行任意的隐式转换和相反转换动作。
此cast最类似于c的强制类型转换,但要注意:
a) 不能转换掉expression的const,volatile或者__unaligned属性。
b)在非基本类型或上下转型中,被转换的父类要检查是否与目的类型相一致,否则,如果在两个不相干的类之间进行转换,将会导致编译出错。
最像c的强制类型转换,对去除const属性无效,对不相关的类的类型转换无效,对指针引用与算数类型转换无效
 
4.reinpreter_cast
reinpreter_cast<type-id>(expression)
type-id必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针。
这个操作符能够在非相关的类型之间转换。操作结果只是简单的从一个指针到别的值的二进制拷贝。在类型之间只想的内容不做任何类型的检查和转换。reinpreter_cast是特意用于底层的强制转型,导致实现依赖(就是说,不可移植)的结果。
指针或引用同其他类型间的转换,典型用例为指针和int类型转换
不能对int和char等转换,它只是简单的二进制拷贝,这不同于static_cast

推荐阅读