Zhonghui

每个不曾起舞的日子,都是对生命的辜负

User Tools

Site Tools


程序:cpp:类型转换

C++类型转换

C++提供了4种更安全的(显式)类型转换方式
相较于C风格的强制类型转换更安全

  1. static_cast<T>(expression)
  2. dynamic_cast<T>(expression)
  3. const_cast<T>(expression)
  4. reinterpret_cast<T>(expression)

RTTI(Run Time Type Identification)即通过运行时类型识别,程序能够使用基类的指针或引用来检查着这些指针或引用所指的对象的实际派生类型。


static_cast

任何编写程序时能够明确的类型转换都可以使用static_cast
由于不提供运行时的检查所以叫static_cast
主要使用场景包括

  • 用于类层次结构中父类和子类之间指针和引用的转换
  • 用于基本数据类型之间的转换
  • 把void指针转换成目标类型的指针

dynamic_cast

dynamic_cast会在运行时检查类型转换是否合法
由于运行时的检查所以会额外消耗一些性能
dynamic_cast使用场景与static_cast 相似
在类层次结构中使用,下行转换时
dynamic_cast会检查转换的类型,相比static_cast更安全
dynamic_cast转换仅适用于指针或引用
若指针转换失败则返回空指针,若引用转换失败则抛出异常
在类层次间进行转换时,要求类必须有虚函数成员(Why?)

const_cast

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

reinterpret_cast

非常激进的指针类型转换
在编译期完成,可以转换任何类型的指针
极不安全,及其自由
适合转为字节等操作(?)

用过才发现这个的好用啊,但是也要理解此操作的危险
AI: 在 C++ 中,保持字节不变的强制类型转换可以通过 reinterpret_cast 来实现。它允许你在不同的指针类型或引用类型之间进行转换,而不会修改底层字节内容。这种转换只是在类型层面上改变了视角,但并不更改数据的实际表示。
AI: 以下是一些常见用法

  1. (很好理解)如果你想把某种类型的指针转换为其他类型的指针(如 int* 转换为 char*),可以使用 reinterpret_cast:
  2. 同样可以将某种类型的引用强制转换为其他类型的引用
    1. reinterpret_cast<long&>(some_double) 将 double 视为 long
    2. reinterpret_cast<long>(some_double) 这样是不行的,因为reinterpret_cast不负责double→long的转换。reinterpret_cast 的适用范围明确规定不支持将非指针或引用的标量类型直接转换为另一个标量类型
    3. memcpy 可以实现类似的功能(把 double 的数据复制到一个 long,基本上相当于:二进制数据不变,将一个 double 视为 long)
  3. (很好理解)reinterpret_cast 可以在指针和整数之间互相转换(通常用于底层地址操作)
/var/www/DokuWikiStick/dokuwiki/data/pages/程序/cpp/类型转换.txt · Last modified: 2025/01/06 16:16 by zhonghui