static_cast
静态转型的用途
- 与dynamic_cast不同,static_cast不仅可以用于指针和引用,还可以用于其他型式
- 一般用于非类型式的普通数据对象转型
静态转型的问题
- 不进行运行期型式检查,不安全
- 若转型失败,结果无定义
const_cast
常量转型的目的
- 用于取消或者设置量的const状态(如设置为const或者取消const)
常量转型的问题
- 如果原始数据对象不能写入,则取消常量修饰可能会导致未知的结果
例子:
#include <iostream> class ConstCastTest { public: void SetNum(int num) { _num = num; } void PrintNum() const; private: int _num; }; void ConstCastTest::PrintNum() const { //临时取消常量约束,修改目标对象的内容 //this指向const ConstCastTest*,指向常对象的指针 const_cast<ConstCastTest*>(this)->_num--; std::cout << _num; }
reinterpret_cast
复诠转型的目的
- 将任意型式的数据对象转型为目标型式,即重新解释其位序列的意义
- 可以用于整型与指针型的互转
复诠转型的问题
- 由程序员保证重新解释的数据对象是否有意义,编译器简单按照目标型式理解该存储区的内容
- 注意:在64位操作系统中,指针可能为64位,而整型可能为32位,复诠转型有可能丢失数据或者得到错误结果
例子:
#include <iostream> using namespace std; int f(void *p) { unsigned int n = reinterpret_cast<unsigned int>(p); return n; } int main() { int a[8] = { 1,2,3,4,5,6,7,8 }; int n = f(a); cout << n << endl; }