1.66、强制类型转换有哪几种类型?
1. static_cast
- • 特点:用于相关类型之间的转换,如基本数据类型之间(
int
转char
)、类层次结构中基类与派生类指针或引用的转换(上行转换安全,下行转换不安全且无运行时检查),以及空指针和void
类型转换。 - • 原理:编译时转换,直接根据类型信息进行转换,不做运行时类型检查,转换时不会改变对象的内存二进制表示,只是重新解释类型。
- • 注意:不能去除
const
或volatile
属性,下行转换需保证安全,否则可能导致未定义行为。
2. const_cast
- • 特点:专门用于添加或移除对象的
const
或volatile
修饰符。常用于将常量指针或引用转换为非常量指针或引用。 - • 原理:编译时转换,不改变对象内存,只是修改类型的常量属性标识。
- • 注意:不能用于去除变量本身的常量性,只能去除指针或引用的常量性。对真正声明为
const
的对象修改会导致未定义行为。
3. reinterpret_cast
- • 特点:用于不同类型之间的指针、引用或整数类型的转换,常用于底层操作,如将指针转换为整数,或不同无关类型指针之间转换。
- • 原理:直接按位拷贝内存,不做任何类型安全检查,纯粹重新解释内存中的比特模式。
- • 注意:极不安全,容易导致未定义行为,必须谨慎使用,且不能去除
const
或volatile
属性。
4. dynamic_cast
- • 特点:用于多态类型(含虚函数的类)之间的安全类型转换,支持运行时类型检查。
- • 原理:运行时通过RTTI(运行时类型信息)检查对象的实际类型,确保转换安全。
- • 行为:
- • 上行转换(派生类转基类)与
static_cast
类似,安全且隐式允许。 - • 下行转换(基类转派生类)有运行时检查,失败时指针返回
nullptr
,引用抛异常。
- • 上行转换(派生类转基类)与
- • 限制:只能用于含虚函数的类层次结构,不能用于基本数据类型。
总结表格
类型 | 主要用途 | 是否安全 | 转换时机 | 是否改变内存表示 | 备注 |
static_cast | 基本类型转换,类层次指针转换(无检查) | 编译时安全需保证 | 编译时 | 否 | 不可去除const/volatile |
const_cast | 去除或添加const/volatile属性 | 编译时安全 | 编译时 | 否 | 不能修改真正const对象 |
reinterpret_cast | 不相关类型间指针/整数转换 | 非常不安全 | 编译时 | 否(按位拷贝) | 纯位模式重解释,慎用 |
dynamic_cast | 多态类安全向下转换 | 运行时安全 | 运行时 | 否 | 需虚函数支持,失败返回nullptr或异常 |
额外说明
- • 强制类型转换本质上是告诉编译器如何解释内存中的数据,除了
dynamic_cast
会在运行时检查类型外,其他转换均不改变对象的内存二进制表示。 - • 使用
static_cast
和reinterpret_cast
时,必须确保转换的合理性,否则会导致未定义行为。 - •
const_cast
仅用于类型修饰符的添加或去除,不改变对象本身的存储。 - •
dynamic_cast
依赖RTTI机制,适合多态类型安全转换,尤其是向下转换。
本文首发于【讳疾忌医-note】公众号,未经授权,不得转载。
(加入我的知识星球,免费获取账号,解锁所有文章。)
阅读剩余
版权声明:
作者:讳疾忌医-note
链接:https://www.1217zy.vip/archives/1425
文章版权归作者所有,未经允许请勿转载。
THE END