什么是正确的用法:
static_cast
dynamic_cast
const_cast
reinterpret_cast
C型铸件(type)value
函数式类型转换 type(value)
如何决定在哪些特定情况下使用哪个?
static_cast
是您应该尝试使用的第一个类型转换。它执行类型之间的隐式转换(例如 int
到 float
,或指向 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)继承——它总是无法通过protected
或 private
遗产。然而,这很少成为问题,因为这种形式的继承很少见。
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 风格强制转换的另一个原因。
我是一名优秀的程序员,十分优秀!