-
static_cast
用于比较温和的低风险的转换 整型、浮点型、字符型
如果类重载了强制类型转换运算符可以用
不能用于指针之间的转换
class A { public: operator int() { return 1; } }; int main() { A a; int n; n = static_cast<int>(a); return 0; }
-
reinterpret_cast
用于不同类型指针、不同类型引用,指针和能容纳指针的整数,之间的转换
执行的是逐个比特的复制操作,说白了就是很强的转换
class A { public: int a1; int a2; A(int n) : a1(n), a2(n) {} }; int main() { A a(20); // 强转为int&,按比特复制,所以后续的赋值操作只能改变a1 int &r = reinterpret_cast<int &>(a); r = 200; // 注意这里只能采用指针的强转 a1的操作x变成40, a2的操作越界了,可能产生未知问题 int x = 20; A *pa = reinterpret_cast<A *>(&n); pa->a1 = 40; pa->a2 = 10; }
-
const_cast
用于去除const属性的转换
将const引用转换为非const引用
将const指针转换为非const指针
-
dynamic_cast
用于将父类指针转换为子类指针
对于不安全的转换返回NULL
(虽然reinterpret_cast也可以完成父类转为子类,但是不检查是否安全,可能导致访问内存越界)