可能重复:什么时候应该使用static_cast,dynamic_cast和reinterpret_cast?
直到几天前,我总是在C中使用C风格类型的铸造,因为它看起来效果很好 . 我最近发现在C中使用C非常糟糕..
我之前从未真正使用C版,所以我想知道是否有人能告诉我(最好用他们自己的话说)static_cast,reinterpret_cast和const_cast之间有什么区别?
const_cast我知道从某个东西中移除了一个“const”,但我不确定它们之间的区别是什么,以及我需要在不同情况下使用什么 .
4 回答
说“C cast is bad”是一个极端,它本身就像使用C风格的演员一样糟糕 .
应该使用“新”C样式转换的区域是:分层转换(向上转换,向下转换,横向转换),const-correctness转换和重新解释转换 . 对于算术演员来说,C型演员表现非常精细并且没有危险,这就是为什么它们可以安全地用于C代码 . 事实上,我实际上建议使用特定的C风格的演员作为算术演员 - 只是为了使算术演员与其他演员类型看起来不同 .
static_cast<TYPE>(e-of-TYPE2)
是一个安全演员 . 这意味着存在从TYPE2到TYPE1的转换 .reinterpret_cast
接近于C版,因为它允许几乎任何转换(有一些限制) . 编译器希望您知道类型转换是否正确 .既不允许
static_cast
也不允许reinterpret_cast
做的一件事就是删除一个const . I.E.如果你有一个const char *
并且需要将它投射到char *
,那么static_cast
和reinterpret_cast
都不允许这样做 . 相反,const_cast
是你的朋友;const_cast
用于从类型中删除const修饰符 .当程序员知道对象的类型和/或想让编译器知道时,
static_cast是在编译时进行强制转换的标准方法 .
dynamic_cast类似于'(T)obj',其中在运行时检查强制转换 .
reinterpret_cast用于在不进行运行时检查的情况下在不同对象之间进行转换 .
const_cast通过删除const和volatile限定符显式转换为相同的类型 .
static_cast - 只是c cast,例如 . (INT)1.000 . 它没有任何成本,也不会失败 . 但它唯一的 Value 是语法糖(它对于在编辑器中搜索很有用)
reinterpret_cast - 是(void *)的等价物 . 它可能会在你的脸上爆炸 . 使用它来告诉编译器只是这样做,其他程序员要非常小心 .
dynamic_cast是一个更安全的版本,如果无法完成转换,则返回null . 这具有较小的运行时成本 .
另见When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?