首页 文章

C型铸造[重复]

提问于
浏览
4

可能重复:什么时候应该使用static_cast,dynamic_cast和reinterpret_cast?

直到几天前,我总是在C中使用C风格类型的铸造,因为它看起来效果很好 . 我最近发现在C中使用C非常糟糕..

我之前从未真正使用C版,所以我想知道是否有人能告诉我(最好用他们自己的话说)static_cast,reinterpret_cast和const_cast之间有什么区别?

const_cast我知道从某个东西中移除了一个“const”,但我不确定它们之间的区别是什么,以及我需要在不同情况下使用什么 .

4 回答

  • -2

    说“C cast is bad”是一个极端,它本身就像使用C风格的演员一样糟糕 .

    应该使用“新”C样式转换的区域是:分层转换(向上转换,向下转换,横向转换),const-correctness转换和重新解释转换 . 对于算术演员来说,C型演员表现非常精细并且没有危险,这就是为什么它们可以安全地用于C代码 . 事实上,我实际上建议使用特定的C风格的演员作为算术演员 - 只是为了使算术演员与其他演员类型看起来不同 .

  • 3

    static_cast<TYPE>(e-of-TYPE2) 是一个安全演员 . 这意味着存在从TYPE2到TYPE1的转换 .

    reinterpret_cast 接近于C版,因为它允许几乎任何转换(有一些限制) . 编译器希望您知道类型转换是否正确 .

    既不允许 static_cast 也不允许 reinterpret_cast 做的一件事就是删除一个const . I.E.如果你有一个 const char * 并且需要将它投射到 char * ,那么 static_castreinterpret_cast 都不允许这样做 . 相反, const_cast 是你的朋友; const_cast 用于从类型中删除const修饰符 .

  • 1

    当程序员知道对象的类型和/或想让编译器知道时,

    • static_cast是在编译时进行强制转换的标准方法 .

    • dynamic_cast类似于'(T)obj',其中在运行时检查强制转换 .

    • reinterpret_cast用于在不进行运行时检查的情况下在不同对象之间进行转换 .

    • const_cast通过删除const和volatile限定符显式转换为相同的类型 .

  • 1

    static_cast - 只是c cast,例如 . (INT)1.000 . 它没有任何成本,也不会失败 . 但它唯一的 Value 是语法糖(它对于在编辑器中搜索很有用)

    reinterpret_cast - 是(void *)的等价物 . 它可能会在你的脸上爆炸 . 使用它来告诉编译器只是这样做,其他程序员要非常小心 .

    dynamic_cast是一个更安全的版本,如果无法完成转换,则返回null . 这具有较小的运行时成本 .

    另见When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?

相关问题