static_cast 静态转换

  1. 主要用于内置数据类型之间的相互转换
  2. 用于自定义类时,静态转换会判断转换类型之间的关系,如果转换类型之间没有任何关系,则编译器会报错,不可转换
  3. void类型指针转为目标类型指针(不安全)

const_cast

  • 常量指针 被强转为 非常量指针,且仍然指向原来的对象
  • 常量引用 被强转为 非常量引用,且仍然指向原来的对象
  • 常量对象 被强转为 非常量对象

dynamic_cast

  1. dynamic_cast是运行时处理的,运行时要进行类型检查,而其他三种都是编译时完成的
  2. 不能用于内置基本数据类型间的强制转换
  3. 使用dynamic_cast进行转换时,基类中一定要有虚函数,否则编译不通过
  4. dynamic_cast转换若成功,返回的是指向类的指针或引用;若失败则会返回NULL
  5. 在类的转换时,在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的。在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。向下转换的成败取决于将要转换的类型,即要强制转换的指针所指向的对象实际类型与将要转换后的类型一定要相同,否则转换失败。

reinterpret_cast

用来处理无关类型之间的转换;它会产生一个新的值,这个值会有与原始参数(expression)有完全相同的比特位

  • 从指针类型到一个足够大的整数类型
  • 从整数类型或者枚举类型到指针类型
  • 从一个指向函数的指针到另一个不同类型的指向函数的指针
  • 从一个指向对象的指针到另一个不同类型的指向对象的指针
  • 从一个指向类函数成员的指针到另一个指向不同类型的函数成员的指针
  • 从一个指向类数据成员的指针到另一个指向不同类型的数据成员的指针