1.66、强制类型转换有哪几种类型?

1. static_cast

  • • 特点:用于相关类型之间的转换,如基本数据类型之间(intchar)、类层次结构中基类与派生类指针或引用的转换(上行转换安全,下行转换不安全且无运行时检查),以及空指针和void类型转换。
  • • 原理:编译时转换,直接根据类型信息进行转换,不做运行时类型检查,转换时不会改变对象的内存二进制表示,只是重新解释类型。
  • • 注意:不能去除constvolatile属性,下行转换需保证安全,否则可能导致未定义行为。

2. const_cast

  • • 特点:专门用于添加或移除对象的constvolatile修饰符。常用于将常量指针或引用转换为非常量指针或引用。
  • • 原理:编译时转换,不改变对象内存,只是修改类型的常量属性标识。
  • • 注意:不能用于去除变量本身的常量性,只能去除指针或引用的常量性。对真正声明为const的对象修改会导致未定义行为。

3. reinterpret_cast

  • • 特点:用于不同类型之间的指针、引用或整数类型的转换,常用于底层操作,如将指针转换为整数,或不同无关类型指针之间转换。
  • • 原理:直接按位拷贝内存,不做任何类型安全检查,纯粹重新解释内存中的比特模式。
  • • 注意:极不安全,容易导致未定义行为,必须谨慎使用,且不能去除constvolatile属性。

4. dynamic_cast

  • • 特点:用于多态类型(含虚函数的类)之间的安全类型转换,支持运行时类型检查。
  • • 原理:运行时通过RTTI(运行时类型信息)检查对象的实际类型,确保转换安全。
  • • 行为
    • • 上行转换(派生类转基类)与static_cast类似,安全且隐式允许。
    • • 下行转换(基类转派生类)有运行时检查,失败时指针返回nullptr,引用抛异常。
  • • 限制:只能用于含虚函数的类层次结构,不能用于基本数据类型。

总结表格

类型 主要用途 是否安全 转换时机 是否改变内存表示 备注
static_cast 基本类型转换,类层次指针转换(无检查) 编译时安全需保证 编译时 不可去除const/volatile
const_cast 去除或添加const/volatile属性 编译时安全 编译时 不能修改真正const对象
reinterpret_cast 不相关类型间指针/整数转换 非常不安全 编译时 否(按位拷贝) 纯位模式重解释,慎用
dynamic_cast 多态类安全向下转换 运行时安全 运行时 需虚函数支持,失败返回nullptr或异常

额外说明

  • • 强制类型转换本质上是告诉编译器如何解释内存中的数据,除了dynamic_cast会在运行时检查类型外,其他转换均不改变对象的内存二进制表示。
  • • 使用static_castreinterpret_cast时,必须确保转换的合理性,否则会导致未定义行为。
  • • const_cast仅用于类型修饰符的添加或去除,不改变对象本身的存储。
  • • dynamic_cast依赖RTTI机制,适合多态类型安全转换,尤其是向下转换。
    本文首发于【讳疾忌医-note】公众号,未经授权,不得转载。
    (加入我的知识星球,免费获取账号,解锁所有文章。)
阅读剩余
THE END