什么时候应该使用静态转换、动态转换、常量转换和重新解释转换?

以下各项的正确用途是什么:

  • static\u cast
  • dynamic\u cast
  • const\u cast
  • 重新解释演员阵容
  • C型铸造(类型)值
  • 函数样式转换类型(值)

如何决定在哪些特定情况下使用哪一种

static\u cast是您应该尝试使用的第一个cast。它可以在类型之间进行隐式转换(例如intfloat,或指向void*)的指针),还可以调用显式转换函数(或隐式转换函数)。在许多情况下,显式地声明static\u cast是不必要的,但是需要注意的是t(something)语法相当于(t)something,应该避免(稍后将详细介绍)。然而,T(某物,某物)是安全的,并且保证调用构造函数

static\u cast也可以通过继承层次结构进行强制转换。向上强制转换(朝向基类)时不需要它,但向下强制转换时,只要它不通过virtual继承强制转换,就可以使用它。但是,它不进行检查,将层次结构向下转换为实际上不是对象类型的类型是未定义的行为


const\u cast可用于删除变量或将const添加到变量中;没有其他C++编译器能够删除它(甚至不 RealTytCase)。需要注意的是,只有在原始变量为const时,修改以前的const值才是未定义的;如果使用它将const从对未使用const声明的内容的引用中移除,则它是安全的。例如,当基于const重载成员函数时,这可能很有用。它还可用于向对象添加const,例如调用成员函数重载

const_cast也同样适用于volatile,尽管这不太常见


dynamic\u cast专门用于处理多态性。您可以将指向任何多态类型的指针或引用强制转换为任何其他类类型(多态类型至少有一个声明或继承的虚拟函数)。你可以使用它,而不仅仅是向下抛投——你可以侧向抛投,甚至是向上抛投另一条链条。dynamic_cast将查找所需对象,并在可能的情况下返回该对象。如果不能,它将在指针的情况下返回nullptr,或者在引用的情况下抛出std::bad_cast

尽管如此,dynamic_cast有一些限制。如果继承层次结构(即所谓的“可怕的钻石”)中有多个相同类型的对象,并且您没有使用virtual继承,那么它就不起作用。它也只能通过公共继承-它将始终无法通过受保护私有继承。然而,这很少是一个问题,因为这种形式的继承很少


重新解释施法是最危险的施法,应该非常谨慎地使用。它将一种类型直接转换为另一种类型-例如将值从一个指针转换为另一个指针,或者将指针存储在int中,或者其他各种讨厌的东西。在很大程度上,您通过重新解释转换得到的唯一保证是,通常情况下,如果您将结果转换回原始类型,您将获得完全相同的值(但如果中间类型小于原始类型,则不会得到相同的值)。有许多转换重新解释\u cast也无法完成。它主要用于特别奇怪的转换和位操作,如将原始数据流转换为实际数据,或将数据存储在指向对齐数据的指针的低位


C-style cast函数样式cast分别使用(类型)对象类型(对象)进行强制转换,并且在功能上是等效的。它们被定义为以下成功的第一项:

  • const\u cast
  • static\u cast(尽管忽略访问限制)
  • static\u cast(见上文),然后const\u cast
  • 重新解释演员阵容
  • 重新解释cast,然后const\u cast

因此,在某些情况下,它可以用作其他类型转换的替代品,但可能非常危险,因为它可以转化为一个重新解释类型转换,并且在需要显式转换时,应首选后者,除非您确定static\u cast将成功或reinterpret\u cast将失败。即使这样,也要考虑更长、更明确的选择。

C样式转换在执行静态转换时也会忽略访问控制,这意味着它们能够执行其他转换无法执行的操作。不过,这主要是一个难题,在我看来,这只是避免使用C风格演员的另一个原因

发表评论