C++类型转换

6

可能重复:
何时应使用static_cast、dynamic_cast和reinterpret_cast?

直到几天前,我一直在C++中使用C风格的类型转换,因为它似乎很好用。最近我发现,在C++中使用C非常糟糕。

我以前从来没有使用过C++转换,所以我想知道有人能不能告诉我(最好用自己的话),static_cast、reinterpret_cast和const_cast的区别是什么?

我知道const_cast可以从某些东西中去除一个“const”,但我不确定它们之间的区别以及在不同情况下需要使用哪种。


你可能应该找一本好书,好好学习C++. :) 这里有一个很好的参考列表:https://dev59.com/_3RC5IYBdhLWcg3wK9yV,这里也有一个很好的总结:https://dev59.com/83VD5IYBdhLWcg3wR5ko#1255015。 - GManNickG
1
在这里https://dev59.com/IXRC5IYBdhLWcg3wVvct - Martin Beckett
1
这并不是“非常糟糕”,而是危险的,需要一些小心,并且有维护陷阱。实际上,使用原始指针也是如此。在C中,你没有更好的选择,但C++为你提供了表达意义并让编译器产生更好警告和错误的工具。 - Ben Voigt
4个回答

3
说“C语言强制转换是不好的”这种说法本身就像总是使用C风格转换一样糟糕。
应该使用“新”的C++风格转换的领域包括:层次结构转换(向上转换,向下转换,交叉转换),常量正确性转换和重新解释转换。对于算术转换,C风格转换完全可以正常工作并且没有危险,因此它们可以在C++代码中安全地使用。实际上,我建议特别使用C风格转换作为算术转换 - 只是为了使算术转换与其他转换类型看起来不同。

C风格的强制类型转换(1)不能通过简单搜索找到,且(2)会在没有警告的情况下进行有害操作。因此,最小化使用C风格的强制类型转换是一件好事。数值类型的转换可以使用构造函数风格的强制类型转换来完成,尽管仍然受到(1)的影响,但不会受到(2)的影响。 - Ben Voigt
@Ben Voigt:首先,对我来说,搜索转换并不是什么实际有用的东西,如果转换在一个经过深思熟虑的约定系统中使用(例如我上面描述的那个),它们就不会在没有警告的情况下做出坏事。其次,如果函数式转换没有比C风格转换更好的地方,那么使用它们有什么意义呢?此外,函数式不能与多令牌类型名称一起使用,例如unsigned int - AnT stands with Russia

2
  1. static_cast是在编译时进行类型转换的标准C++方法,当程序员知道对象的类型和/或想让编译器知道时使用。
  2. dynamic_cast类似于“(T)obj”,其中强制转换在运行时进行检查。
  3. reinterpret_cast用于在不进行运行时检查的情况下在不同的对象之间进行类型转换。
  4. const_cast通过去除const和volatile限定符来显式地转换为相同类型。

1

static_cast<TYPE>(e-of-TYPE2) 是一种安全的转换方式。它意味着从 TYPE2 到 TYPE1 存在一种转换。

reinterpret_cast 类似于 C 语言中的强制类型转换,允许进行几乎任何转换(有一些限制)。编译器希望您知道类型转换是正确的。

既不 static_cast 也不 reinterpret_cast 允许删除 const。例如,如果您有一个 const char * 并需要将其转换为 char *,则既不 static_cast 也不 reinterpret_cast 允许这样做。相反,const_cast 是您的好朋友;const_cast 用于从类型中删除 const 修饰符。


1
const_cast不是你的朋友——不要过于亲近它,它是你最后的工具。99%看似需要const_cast的情况实际上需要重构。 - Ben Voigt
reinterpret_cast 的限制是:源类型和目标类型必须具有相同的大小。 - YeenFei

-2

static_cast - 只是 c cast,例如 (int)1.000。它不需要任何费用,也不会失败。但它的唯一价值在于语法糖(在编辑器中搜索很有用)

reinterpret_cast - 是C++中等效于 (void*) 的转换。它可能会导致程序崩溃。使用这个来告诉编译器直接转换,并提醒其他程序员要非常小心。

dynamic_cast 是一个更安全的版本,如果转换无法完成,则返回 null。这会带来一些运行时成本。

参见何时使用static_cast、dynamic_cast、const_cast和reinterpret_cast?


这是不正确的。C-cast 比 static_cast 做得更多,而 reinterpret_cast 从不返回 null。 - GManNickG
抱歉,但那不正确。reinterpret_cast 是普通的 C 式转换。static_cast 是在编译时检查的转换,我想你可能在想 dynamic_cast。 - AndersK
使用 reinterpret_cast 等同于 C cast 并不正确。并非每个 C cast 都可以使用 C++ casts 构建,而那些可以构建的可能需要使用 static_castreinterpret_cast,以及可选的 const_cast - Ben Voigt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接