什么时候应该使用 static_cast、dynamic_cast、const_cast 和 reinterpret_
技术问答
259 人阅读
|
0 人回复
|
2023-09-11
|
正确的用途是什么:- D' s- y& P4 n8 @
static_cast# R9 C9 _+ [' m- p. h
dynamic_cast
+ @% t, H0 k7 i+ j, m& H+ \% ]const_cast
$ q9 r, U, D2 r8 greinterpret_cast' g8 D. `* o; ]% p8 P2 r
C型演员表(type)value5 a0 ^, c& b1 y, c8 ~, C( `
函数式强制转换type(value)在特定情况下,如何决定使用哪个?
) w6 h' B; {: O2 f& B v - B; E( p4 |. {3 q# ?0 ~1 d
解决方案: # m8 ?" c% i8 k/ n7 O
static_cast这是你应该尝试使用的第一个演员表。它执行类型之间的隐藏转换(例如inttofloat或指向 指针void*)它还可以调用显式转换函数(或隐式转换函数)。在许多情况下,static_cast不需要明确的声明,但重要的是要注意T(something)语法等效于(T)something并且应该避免(稍后会详细介绍)。然而,AT(something,something_else)结构函数的调用是安全的。
3 _ x# U; {$ `static_cast也可以通过继承层结构进行转换。向上转换(向基类)是不必要的,但向下转换时,只要不通过virtual继承可以用于转换。但是,它不会被检查,而且会被检查static_cast不是对象类型的类型是未定义的行为。
5 r% z& ~0 [4 A$ econst_cast可用于删除或添加const变量;没有别的 C 演员可以删除(甚至没有)reinterpret_cast)。需要注意的是,只有当原始变量为时,才能修改以前的变量const值是未定义的。const如果你用它来取消对方const引用未声明的内容const,它是安全的。例如,它对基于 重载成员函数非常有用const。也可用于添加const例如,在一个对象中调用成员函数的重载。5 e/ N+ _ D0 P6 U8 g9 [8 \+ P' x
const_cast也同样适用于volatile,尽管这种情况并不常见。8 x3 `' F* R4 Y; u
dynamic_cast专门用于处理多态性。您可以将指向任何多态类型的指针或引用转换为任何其他类型(多态类型至少有一个声明或继承的虚拟函数)。您不仅可以将其用于向下投射 - 你也可以向侧面投射,甚至向上投射另一条链。dynamic_cast在可能的情况下找到所需的对象并返回它。如果没有,它会nullptr返回指针情况下返回,或在引用的情况下抛出std::bad_cast。$ V' X% W- _2 y1 j
dynamic_cast但也有一些限制。virtual如果继承层结构中有许多相同类型的对象(所谓的可怕的钻石),而你不使用继承,它就不起作用。它只能通过公共继承——它总是不能通过protected或private继承。然而,这很少成为问题,因为这种继承形式很少见。7 V: m. U7 t6 m3 G' h
reinterpret_cast*它是最危险的演员表,应该非常小心使用。它直接将一种类型转换为另一种类型——例如,将值从一个指针转换为另一个指针,或将指针存储在 中int,或者其他烦人的事情。在很大程度上,你得到的唯一保证reinterpret_cast是的,通常,如果你将结果转换为原始类型,你将获得相同的值(但如果中间类型小于原始类型,则不会)。*也有许多reinterpret_cast**不能做的转换。它主要用于特别奇怪的转换和位操作,如将原始数据流转换为实际数据,或将数据存储在指向对齐数据的指针的低位。
$ B8 s( A3 H4 S' oC 风格转换和函数风格单独使用转换(type)objector进行转换type(object),而且在功能上是等价的。它们被定义为以下成功的第一个:
$ _5 T4 S1 P# `4 T5 x' ~const_cast
9 @. L9 J5 x2 Q# Istatic_cast(虽然忽略了访问限制)
4 {* W/ }! H9 R2 P/ Y* T4 nstatic_cast(见上文),然后const_cast4 z# W' s, O6 T9 \5 {0 B
reinterpret_cast. h& q, T9 X: Y6 Q- B' {$ h
reinterpret_cast,然后const_cast因此,在某些情况下,它可以用作其他类型转换的替代品,但它可以演变成 a reinterpret_cast,因此,除非你确定,否则可能非常危险,需要显式转换时应首选后者static_cast会成功或reinterpret_cast会失败.即便如此,也要考虑更长、更清晰的选项。
X5 z, B6 P) `6 r2 AC 风格的强制转换转换a 也会忽略访问控制static_cast,这意味着它们可以执行其他不能执行强制转换的操作。然而,这主要是一种杂物。在我看来,这只是为了避免 C 风格转换的另一个原因。 |
|
|
|
|
|