static_cast
静态类型转换:用于基本类型之间的转换,有继承关系之间的转换,void* 与其他指针类型转换。
编译时候检查,无运行时开销,不保证安全性,继承体系可能因类型不匹配导致未定义行为
cpp
class Base{
Base(){
}
~Base(){}
};
class Child:public Base
{
};
//派生类指针或引用转为基类表示
Base * base = new Child;//进行上行转换时安全的,因为new申请的地址空间大于base需要的地址空间
Child * child = static_cast<Child *> (base);
dynamic_cast
动态类型转换:note:如果发生多态,那么类型转换必定是安全的。
运行时检查类型有效性,只有转换时安全的,那么才会进行转换。
const_cast
常量类型转换:用于移除或者添加const限定符
不修改底层数据,仅仅修改编译器对类型的解释
cpp
const char* msg = "Hello";
const_cast<char*>(msg)
note:不能对非指针类型或者引用使用
reinterpret_cast
重新解释类型转换
低层次的位模式重新解释
高度不安全,依赖平台和编译器实现,不推荐使用