const_cast:将const转换为非const
const int n = 0; int* p = const_cast<int*>(&n);
static_cast :只能用于良性转换。如:
- 整型间的转换
- void*和其他指针的转换
不能用于:
- 不能将整型转换为指针类型
- 不能再两个具体类型的指针之间进行转换
另外,static_cast再编译期间进行转换,转换失败的话就会抛出一个编译错误
#include <iostream> #include <cstdlib> int main() { //下面是正确的用法 int m = 100; long n = static_cast<long>(m); //宽转换,没有信息丢失 char ch = static_cast<char>(m); //窄转换,可能会丢失信息 int* p1 = static_cast<int*>(malloc(10 * sizeof(int))); //将void指针转换为具体类型指针 void* p2 = static_cast<void*>(p1); //将具体类型指针,转换为void指针 //下面的用法是错误的 float* p3 = static_cast<float*>(p1); //不能在两个具体类型的指针之间进行转换 p3 = static_cast<float*>(0X2DF9); //不能将整数转换为指针类型 return 0; }
reinterpret_cast:只是对二进制位进行重新解释,不会借助已有的转换规则对数据进行调整。reinterpret_cast 可以认为是 static_cast 的一种补充,一些 static_cast 不能完成的转换,就可以用 reinterpret_cast 来完成,例如两个具体类型指针之间的转换、int 和指针之间的转换(有些编译器只允许 int 转指针,不允许反过来)。
dynamic_cast: 用于在类的继承层次之间进行类型转换,它既允许向上转型也允许向下转型向上转型是无条件的,不会进行任何检测,所以都能成功;向下转型的前提必须是安全的,要借助 RTTI 进行检测,所有只有一部分能成功。
dynamic_cast 与 static_cast 是相对的,dynamic_cast 是“动态转换”的意思,static_cast 是“静态转换”的意思。dynamic_cast 会在程序运行期间借助 RTTI 进行类型转换,这就要求基类必须包含虚函数;static_cast 在编译期间完成类型转换,能够更加及时地发现错误。