C风格的强制类型转换很简单,均用 Type b = (Type)a 形式转换。C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用,如下表:

转换类型操作符 作用
const_cast 去掉类型的const或volatile属性
static_cast 无条件转换,静态类型转换
dynamic_cast 有条件转换,动态类型转换,运行时检查类型安全(转换失败返回NULL)
reinterpret_cast 仅重新解释类型,但没有进行二进制的转换

1、const_cast

用于移除类型的const、volatile和__unaligned属性。
常量指针被转换成非常量指针,并且仍然指向原来的对象;常量引用被转换成非常量引用,并且仍然引用原来的对象。

  1. const char *pc;
  2. char *p = const_cast<char*>(pc);

2、static_cast

类似C风格的强制转换,进行无条件转换,静态类型转换,这几种写法都是等效的。
例:int(z), (int)z, static_cast(z)

3、dynamic_cast

有条件转换,动态类型转换,运行时检查类型安全(转换失败返回NULL):
1)安全的基类和子类之间的转换。
2)必须有虚函数。
3)相同基类不同子类之间的交叉转换,但结果返回NULL。

  1. class Base {
  2. public:
  3. int _i;
  4. virtual void foo() {}; //基类必须有虚函数。保持多态特性才能使用dynamic_cast
  5. };
  6. class Sub : public Base {
  7. public:
  8. char *_name[100];
  9. void Bar() {};
  10. };
  11. int main() {
  12. Base* pb = new Sub();
  13. Sub* ps1 = static_cast<Sub*>(pb); //子类->父类,静态类型转换,正确但不推荐
  14. Sub* ps2 = dynamic_cast<Sub*>(pb); //子类->父类,动态类型转换,正确
  15. Base* pb2 = new Base();
  16. Sub* ps21 = static_cast<Sub*>(pb2); //父类->子类,静态类型转换,危险!访问子类_name成员越界
  17. Sub* ps22 = dynamic_cast<Sub*>(pb2);//父类->子类,动态类型转换,安全,但结果为NULL
  18. return 0;
  19. }

4、reinterpret_cast

非常激进的指针类型转换,在编译期完成,可以转换任何类型的指针,所以极不安全。非极端情况不要使用。
格式:

  1. reinterpret_cast<type>(expression)

例如:

  1. int *ip;
  2. char *pc = reinterpret_cast<char*>(ip);