转换
- 隐身转换:一般是安全的(精度小转换为精度大的)
- 显示转换:一般是不安全的(精度大得转换为精度小的)
- 尽可能避免强制类型转换(显示转换)
- 如果无法避免,推荐使用新式类型转换。
旧式转换
- (T)expr
- T(expr)
新式转换
const_cast
const_cast<T>(expr)
- 用来移除对象的常量性
- 不能用于对象,一般用于指针或引用
- 使用const_cast去除const限定的目的不是为了修改它的内容
- 使用const_cast去除const限定,通常是为了函数能够接受这个实际参数
1 | void func(int& val) |
static_cast
static_cast<T>(expr)
- 编译器隐式执行的任何类型转换都可以由static_cast完成
- 当一个较大的算术类型赋值给较小的类型时,可以用static_cast进行强制转换。
- 可以将
void*
指针转换成为某一类型的指针 - 可以将积累指针转成派生类指针
- 无法将const转化为nonconst,这个只有const_cast才可以办得到
1 | int main(void) |
reinterpret_cast
reinterpret_cast<T>(expr)
- 通常为操作数的位模式提供较低层的重新解释,也就是说将数据以二进制存在的形式的重新解释
1 | int i; |
dynamic_cast
dynamic_cast<T>(expr)
- 执行”安全向下”转型操作,也就是说支持运行时识别指针或所指向的对象,这是唯一一个无法用旧式语法来进行的转型操作。
- 通常用于派生类、基类之间的转型