static_cast <type-id> ( expression )
和C风格的类型转换相似,可以转换一个指针到基类,或者派生类。不做Run-time类型检查,这样转换并不总是安全的。也可以转换枚举类型到int或者int到float。使用static_cast从基类指针转换成派生类指针可能不安全,因为派生类可能有基类没有的函数或者变量。但是从派生类指针转换成基类指针,通常是安全的。
reinterpret_cast < type-id > ( expression )
允许指针类型转换成其他指针类型,并允许整型转换为任务指针类型反之亦然。不对类型转换做校验。reinterpret_cast会将null指针值转换为目标类型的null指针值。reinterpret_cast是非常不安全的,尽量避免使用。
const_cast < type-id > ( expression )
用于从类中移除const、 volatile和 __unaligned等属性。对于指针和引用将引用原始对象,对于指向的数据成员将引用原始的数据成员。不能使用const_cast覆盖常量的常量状态。
只用于指针和引用,有Run-time检查。type-id必须为一个已经定义的类的指针或者引用或者使用void*。如果type-id为指针,则表达式必须为指针。
bad_cast
class bad_cast : public exception { public: bad_cast(const char * _Message = "bad cast"); bad_cast(const bad_cast &); virtual ~bad_cast(); };
当使用dynamic_cast转换失败时,会抛出bad_cast异常。
总结:
对于指针和引用的转换使用dynamic_cast,对于普通整型值转换使用static_cast,移除const等关键字时用const_cast,但是实际上并不能修改常量的值。尽量避免使用reinterpret_cast。