打印
[其它应用]

说说强制类型转换运算符

[复制链接]
1938|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
duo点|  楼主 | 2024-3-16 11:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

「static_cast」

  • 用于非多态类型的转换
  • 不执行运行时类型检查(转换安全性不如 dynamic_cast)
  • 通常用于转换数值数据类型(如 float -> int)
  • 可以在整个类层次结构中移动指针,子类转化为父类安全(向上转换),父类转化为子类不安全(因为子类可能有不在父类的字段或方法)

「dynamic_cast」

  • 用于多态类型的转换
  • 执行行运行时类型检查
  • 只适用于指针或引用
  • 对不明确的指针的转换将失败(返回 nullptr),但不引发异常
  • 可以在整个类层次结构中移动指针,包括向上转换、向下转换

「const_cast」

  • 用于删除 const、volatile 和 __unaligned 特性(如将 const int 类型转换为 int 类型 ) reinterpret_cast
  • 用于位的简单重新解释
  • 滥用 reinterpret_cast 运算符可能很容易带来风险。除非所需转换本身是低级别的,否则应- 使用其他强制转换运算符之一。
  • 允许将任何指针转换为任何其他指针类型(如 char* 到 int* 或 One_class* 到  Unrelated_class* 之类的转换,但其本身并不安全)
  • 也允许将任何整数类型转换为任何指针类型以及反向转换。
  • reinterpret_cast 运算符不能丢掉 const、volatile 或 __unaligned 特性。
  • reinterpret_cast 的一个实际用途是在哈希函数中,即,通过让两个不同的值几乎不以相同的索引结尾的方式将值映射到索引。

「bad_cast」

  • 由于强制转换为引用类型失败,dynamic_cast 运算符引发 bad_cast 异常。

bad_cast 使用

try {
    Circle& ref_circle = dynamic_cast<Circle&>(ref_shape);
}
catch (bad_cast b) {
    cout << "Caught: " << b.what();
}

使用特权

评论回复
沙发
CarterERO| | 2024-3-18 11:19 | 只看该作者
这几个运算符还真没用过,强制转换时候都是加括号

使用特权

评论回复
板凳
LEDyyds| | 2024-3-18 15:02 | 只看该作者
有时候会强转不过来,为何

使用特权

评论回复
地板
Jacquetry| | 2024-3-28 10:17 | 只看该作者
还是用()方便

使用特权

评论回复
5
在水一方00| | 2024-3-28 16:25 | 只看该作者
关于 C++ 中四种强制类型转换运算符 static_cast、dynamic_cast、const_cast 和 reinterpret_cast 的详细解释确实比较繁琐,我也回帖记录一下。、

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

427

主题

1586

帖子

1

粉丝