gpt4 book ai didi

c++ - 什么时候应该使用 static_cast、dynamic_cast、const_cast 和 reinterpret_cast?

转载 作者:bug小助手 更新时间:2023-10-28 01:29:44 30 4
gpt4 key购买 nike

什么是正确的用法:

  • static_cast
  • dynamic_cast
  • const_cast
  • reinterpret_cast
  • C型铸件(type)value
  • 函数式类型转换 type(value)

  • 如何决定在哪些特定情况下使用哪个?

    最佳答案

    static_cast 是您应该尝试使用的第一个类型转换。它执行类型之间的隐式转换(例如 intfloat ,或指向 void* 的指针),它还可以调用显式转换函数(或隐式转换函数)。在许多情况下,明确说明 static_cast不是必需的,但重要的是要注意 T(something)语法等价于 (T)something并且应该避免(稍后会详细介绍)。一个 T(something, something_else)然而,是安全的,并且保证调用构造函数。
    static_cast也可以通过继承层次结构进行转换。向上(向基类)转换时没有必要,但向下转换时,只要不通过 virtual 转换就可以使用。遗产。然而,它不做检查,而且它是 static_cast 的未定义行为。沿着层次结构向下移动到实际上不是对象类型的类型。

    const_cast 可用于删除或添加 const到一个变量;没有其他 C++ Actor 能够删除它(甚至不是 reinterpret_cast )。需要注意的是,修改以前的 const仅当原始变量为 const 时,值才未定义;如果你用它取const关闭对未使用 const 声明的内容的引用,是安全的。这在基于 const 重载成员函数时很有用, 例如。也可用于添加 const到一个对象,例如调用成员函数重载。
    const_cast也同样适用于 volatile ,虽然这不太常见。

    dynamic_cast 专门用于处理多态性。您可以将指向任何多态类型的指针或引用转换为任何其他类类型(多态类型至少具有一个声明或继承的虚函数)。您不仅可以将其用于向下抛掷 – 您还可以向侧面抛掷甚至向上抛掷另一条链。 dynamic_cast将寻找所需的对象并在可能的情况下返回它。如果不能,则返回 nullptr在指针的情况下,或抛出 std::bad_cast在引用的情况下。
    dynamic_cast但是有一些限制。如果继承层次结构中有多个相同类型的对象(所谓的“可怕的菱形”)并且您没有使用 virtual,则它不起作用。遗产。它也只能通过公共(public)继承——它总是无法通过protectedprivate遗产。然而,这很少成为问题,因为这种形式的继承很少见。

    reinterpret_cast 是最危险的 Actor ,应该非常谨慎地使用。它将一种类型直接转换为另一种类型——例如将值从一个指针转换为另一种,或者将指针存储在 int 中。 ,或各种其他令人讨厌的事情。在很大程度上,这是您获得的唯一保证 reinterpret_cast通常,如果您将结果转换回原始类型,您将获得完全相同的值(但 而不是 ,如果中间类型小于原始类型)。有许多转换 reinterpret_cast 也做不到。它主要用于特别奇怪的转换和位操作,例如将原始数据流转换为实际数据,或将数据存储在指向对齐数据的指针的低位中。

    C型铸件函数式 Actor 是使用 (type)object 的类型转换或 type(object) ,分别,并且在功能上是等效的。它们被定义为以下第一个成功的:

  • const_cast
  • static_cast (尽管忽略访问限制)
  • static_cast (见上文),然后 const_cast
  • reinterpret_cast
  • reinterpret_cast ,然后 const_cast

  • 因此,在某些情况下,它可以用作其他 Actor 的替代品,但由于具有演变成 reinterpret_cast 的能力,因此可能非常危险。 ,当需要显式转换时应该首选后者,除非您确定 static_cast会成功或 reinterpret_cast将失败。即便如此,请考虑更长、更明确的选项。

    C 风格的强制转换在执行 static_cast 时也会忽略访问控制,这意味着他们有能力执行其他 Actor 无法执行的操作。不过,这主要是杂乱无章,在我看来,这只是避免 C 风格强制转换的另一个原因。

    关于c++ - 什么时候应该使用 static_cast、dynamic_cast、const_cast 和 reinterpret_cast?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/332030/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com