任何具有明确定时的类型转换,只要不包含底层const,都可以使用static_cast。通常C语言里面的强制类型转换都可以换成static_cast。
包含底层const的请用const_cast。
static_cast 在编译时使用类型信息执行转换,在转换执行必要的检测(诸如指针越界计算, 类型检查). 其操作数相对是安全的。而reinterpret_cast 仅仅是重新解释了给出的对象的比特模型而没有进行二进制转换。
看下例:
int n=9;
double d=static_cast < double > (n);
上面的例子中, 我们将一个变量从 int 转换到 double。 这些类型的二进制表达式是不同的。 要将整数 9 转换到 双精度整数 9,static_cast 需要正确地为双精度整数 d 补足比特位。其结果为 9.0。而reinterpret_cast 的行为却不同:
int n=9;
double d=reinterpret_cast<double & > (n);
这次, 结果有所不同. 在进行计算以后, d 包含无用值. 这是因为 reinterpret_cast 仅仅是复制 n 的比特位到 d, 没有进行必要的分析。
还有下面的例子:
int *ip;
char *pc=reinterpret_cast<char *>(ip);
pc所指的真实对象是一个int而非字符,如果把pc当成普通的字符指针使用就可能在运行时发生错误。例如:
string str(pc);//会引起运行时发生错误。
因为在编译中没有任何告警或者错误,但这时候类型其实改变了的。
所以,请谨慎使用 reinterpret_cast.