任何c++的类型转换都可以用c风格的强制类型转换实现
static_cast(variable):静态转换
在编译期可以做类型转换检查,即原有的C风格类型转换没有任何检查,没有编译提示,但是静态类型转换会有编译期的类型检查,对不可转换类型进行编译错误提示。
但该函数只做编译期的静态检查,是没有动态检查,因此不适用于指针(继承体系)之间的转换
dynamic_cast(variable):动态转换
可以在运行期进行动态转换的类型检查;常用于 指针和引用(继承体系) 之间的动态转换,主要用于父子类继承时做下行转换,即将一个父类指针转换为子类指针,(上行转换,子类指针转为父类指针是不会有问题的)。
指针转换失败的话会返回空指针,引用转换失败的话会抛出异常。
class Base {
};
class SubA :public Base {
};
class SubB :public Base {
};
int main() {
Base* base = new Base();
SubA* sub_a = new SubA();
SubB* sub_b = new SubB();
SubA* a11 = static_cast<SubA*>(sub_b);
SubA* a111 = dynamic_cast<SubA*>(sub_b);
Base* base_true_B = new SubB();
SubA* a11 = static_cast<SubA*>(base_true_B);
SubA* a111 = dynamic_cast<SubA*>(base_true_B);
}
const_cast(variable):常转换
常量转换,可以将const类型转换为非const
reinterpret_cast(variable):重新解释
将原有变量对应的内存空间中的数据进行重新解释。无论原来变量是什么类型。
该种转换危险性较高,不建议使用。