显示类型转换
1.静态类型转换
•static_cast<目标类型> (源类型对象)
–编译器对源类型和目标类型做相容性检查,检查不通过报错
–源类型和目标类型只要在一个方向上可以做隐式类型转换,那么在两个方向上就都可以做静态类型转换
–如果将目标类型从源类型的类型转换构造函数,或者源类型向目标类型的类型转换运算符函数,被声明为explicit,
那么从源类型到目标类型的类型转换就必须显式完成,静态类型转换可用于这样的场合
2.动态类型转换
•dynamic_cast<目标类型> (源类型对象)
–编译器首先检查源类型和目标类型是否同为指针或引用且其类型之间存在具有多态性的继承关系,不存在直接报错
–编译器生成一段指令,运行时执行该指令,检查源和目标的类型是否一致,不一致通过返回空指针或抛出异常报错
–常被用于具有多态继承关系的父子类对象的指针或引用之间的转换
3.去常类型转换
•const_cast<目标类型> (源类型对象)
–编译器检查源类型和目标类型是否同为指针或引用,且其目标类型之间除常属性以外必须完全相同,否则直接报错
–去除指针或引用上的const属性
int const volatile x = 100;
int const* p = &x;
*p = 200; // 错误
int* q = const_cast<int*> (p);
*q = 200;
4.重解释类型转换
•reinterpret_cast<目标类型> (源类型对象)
–编译器检查源类型和目标类型是否同为指针或引用,或者一个是指针一个是整型,否则直接报错
–在任意类型的指针或引用之间转换,意味着可以将同一个对象视作不同的类型,并以不同的方式访问或处理之
–无论何种类型的指针,从本质上讲都与整数无异,即地址空间中一个特定字节的顺序号