【问题标题】:C++ type casting [duplicate]C ++类型转换[重复]
【发布时间】:2011-03-17 17:54:17
【问题描述】:

可能重复:
When should static_cast, dynamic_cast and reinterpret_cast be used?

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

我以前从未真正使用过 C++ 强制转换,所以我想知道是否有人可以告诉我(最好用他们自己的话)static_cast、reinterpret_cast 和 const_cast 之间的区别是什么?

我知道 const_cast 从某事中删除了一个“const”,但我不确定它们之间的区别是什么,以及我需要在不同情况下使用哪个。

【问题讨论】:

标签: c++ casting


【解决方案1】:

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

reinterpret_cast - 是 (void*) 的 c++ 等价物。它可能会在你的脸上爆炸。使用它来告诉编译器只是这样做,而其他程序员要非常小心。

dynamic_cast 是一个更安全的版本,如果无法完成转换,它会返回 null。这具有很小的运行时成本。

另见When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?

【讨论】:

  • 这是不正确的。 C-cast 的作用远不止static_cast,而且reinterpret_cast 永远不会返回null。
  • 抱歉,这是不正确的。 reinterpret_cast 是正常的 c-cast。 static_cast 是在编译时检查的强制转换,我认为您正在考虑 dynamic_cast
  • reinterpret_cast 与 C 转换相同是不正确的。并非每个 C 类型转换都可以使用 C++ 类型转换构建,那些可以使用 static_castreinterpret_cast 以及可选的 const_cast 的类型。
【解决方案2】:

static_cast<TYPE>(e-of-TYPE2) 是一个安全的演员表。这意味着有一个从 TYPE2 到 TYPE1 的转换。

reinterpret_cast 接近于 C 转换,因为它允许几乎任何转换(有一些限制)。编译器希望您知道类型转换是正确的。

static_castreinterpret_cast 都不允许做的一件事是删除一个常量。 IE。如果您有const char * 并且需要将其转换为char *,则static_castreinterpret_cast 都不允许这样做。相反,const_cast 是你的朋友; const_cast 用于从类型中删除 const 修饰符。

【讨论】:

  • const_cast 不是你的朋友——不要对它太友好,它是你最后的工具。 99% 看起来需要const_cast 的情况实际上需要重构。
  • reinterpret_cast 的限制是:源类型和目标类型必须具有相同的大小。
【解决方案3】:

说“C 类型转换很糟糕”是一种极端,它本身就和一直使用 C 风格类型转换一样糟糕。

应该使用“新”C++ 风格转换的领域是:分层转换(向上转换、向下转换、交叉转换)、常量正确性转换和重新解释转换。对于算术强制转换,C 风格的强制转换工作得非常好并且不会造成任何危险,这就是为什么它们可以安全地用于 C++ 代码的原因。事实上,我实际上建议使用专门的 C 风格强制转换作为算术强制转换 - 只是为了使算术强制转换看起来与其他强制转换类型不同。

【讨论】:

  • C 风格的演员表 (1) 不能通过简单的搜索找到,(2) 做坏事没有警告。所以最小化 C 风格的强制转换是一件好事。数字类型的强制转换可以通过构造函数风格的强制转换来完成,尽管这种强制转换仍然会受到 (1) 的影响,但不会受到 (2) 的影响。
  • @Ben Voigt:首先,如果演员表是在经过深思熟虑的约定系统中使用的(例如,作为我上面描述的那个)。而且,不,当以这种方式使用时,他们不会在没有警告的情况下做坏事。其次,如果功能型汽车一点也不比 C 型造型好,那么使用功能型汽车又有什么意义呢?此外,function-style 不能与多标记类型名称一起使用,例如 unsigned int
【解决方案4】:
  1. static_cast 是当程序员知道对象的类型和/或想让编译器知道时,在编译时进行强制转换的标准 C++ 方法。
  2. dynamic_cast 类似于 '(T)obj',在运行时检查强制转换。
  3. reinterpret_cast 用于在不进行运行时检查的情况下在不同对象之间进行转换。
  4. const_cast 通过删除 const 和 volatile 限定符显式转换为相同的类型。

【讨论】:

    猜你喜欢
    • 2013-02-13
    • 2012-05-10
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    相关资源
    最近更新 更多