一、static_cast
- 源生类型之间的隐式类型转换,可以用 static_cast 来明确告知编译器,避免警告,转换后可能丢失精度。正确性需要程序员自己保证。
- 用来将(void *p)转为具体的指针类型,取回原有的指针类型
- 用于类层次结构中父类和子类之间指针和引用的转换。其中上行转换是安全的,下行转换是不安全的。
- 总结:static_cast<>()是编译时静态类型检查,使用 static_cast 可以尽量发挥编译器的静态类型检查功能,但是并不能保证代码一定“正确”(譬如可能会丢失精度导致错误,可能经过(void*)之后导致指针类型错误,可能下行转换导致访问错误)
- 评价:能理解使用 static_cast 的意义,但是实际上只能解决很初级的编程问题,属于初级语法特性。
int* p; void* p1 = p; int* p2 = static_cast<int *>(p1);
二、 reintepret_cast
- 用于明确告知编译器该类型转换在编译时放行,正确性由程序员自己负责。
- reintepret_cast 转换前后对象的二进制未发生任何变化,只是对这些二进制位的编译器类型标识发生了变化,或者说是编译器看待这些二进制位的结论不同了。
- reintepret_cast 一般用于将指针转成 int 或者回转,将A类型指针转为B类型指针等
- reintepret_cast 其实就是让C++在本次转换中放弃严苛的编译器类型检查
int*