直到几天前,我一直在C++中使用C风格的类型转换,因为它似乎很好用。最近我发现,在C++中使用C非常糟糕。
我以前从来没有使用过C++转换,所以我想知道有人能不能告诉我(最好用自己的话),static_cast、reinterpret_cast和const_cast的区别是什么?
我知道const_cast可以从某些东西中去除一个“const”,但我不确定它们之间的区别以及在不同情况下需要使用哪种。
直到几天前,我一直在C++中使用C风格的类型转换,因为它似乎很好用。最近我发现,在C++中使用C非常糟糕。
我以前从来没有使用过C++转换,所以我想知道有人能不能告诉我(最好用自己的话),static_cast、reinterpret_cast和const_cast的区别是什么?
我知道const_cast可以从某些东西中去除一个“const”,但我不确定它们之间的区别以及在不同情况下需要使用哪种。
unsigned int
。 - AnT stands with Russiastatic_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 修饰符。
const_cast
不是你的朋友——不要过于亲近它,它是你最后的工具。99%看似需要const_cast
的情况实际上需要重构。 - Ben Voigtstatic_cast - 只是 c cast,例如 (int)1.000。它不需要任何费用,也不会失败。但它的唯一价值在于语法糖(在编辑器中搜索很有用)
reinterpret_cast - 是C++中等效于 (void*) 的转换。它可能会导致程序崩溃。使用这个来告诉编译器直接转换,并提醒其他程序员要非常小心。
dynamic_cast 是一个更安全的版本,如果转换无法完成,则返回 null。这会带来一些运行时成本。
static_cast
做得更多,而 reinterpret_cast
从不返回 null。 - GManNickGreinterpret_cast
等同于 C cast 并不正确。并非每个 C cast 都可以使用 C++ casts 构建,而那些可以构建的可能需要使用 static_cast
或 reinterpret_cast
,以及可选的 const_cast
。 - Ben Voigt