static_cast vs dynamic_cast

时间:2009-08-10 13:08:01

标签: c++

  

可能重复:
  Regular cast vs. static_cast vs. dynamic_cast

我不太习惯何时使用静态演员和动态。有什么解释吗?

7 个答案:

答案 0 :(得分:33)

从基类类型转换为派生类类型时使用dynamic_cast。它检查正在转换的对象实际上是派生类类型,如果对象不是所需类型,则返回空指针(除非您正在转换为引用类型 - 然后它会引发bad_cast异常)。

如果不需要额外检查,请使用static_cast。正如Arkaitz所说,由于dynamic_cast执行额外检查,它需要RTTI信息,因此具有更大的运行时开销,而static_cast则在编译时执行。

答案 1 :(得分:8)

在某些情况下,像这样,“静态”是指编译时,“动态”是指运行时。

对于编译时检查,请使用static_cast(限于编译器知道的内容)。 对于运行时检查,请使用dynamic_cast(仅限于带有RTTI的类)。 如果不进行检查,请使用reinterpret_cast。

答案 2 :(得分:3)

dynamic_cast检查运行时可用的信息,例如RTTI,它还遍历类层次结构以查看是否可以进行此类转换。

检查C++ type casting tutorial at cplusplus.com

答案 3 :(得分:2)

动态强制转换需要RTTI,并且与静态强制转换相比具有一定的魔力。 static_cast只是一个编译时间转换,检查是否可以通过一些简单的规则将原始类提升为转换类。

例如,在虚拟继承的情况下,只有dynamic_cast可以解决这种情况。

另外,如果无法进行强制转换,dynamic_cast将返回NULL,因此您可以做出不同的决定。

另一方面,dynamic_cast速度较慢,因为它意味着正在执行某些代码,如前所述,它需要启用RTTI,这会增加二进制文件的大小。

答案 4 :(得分:2)

static_cast类似于旧的C样式演员,可以应用于任何事情。当您确定某些类型时,将使用static_cast。例如,我在static_castint之间投标时通常使用enum

dynamic_cast只能与指针和引用一起使用。如果无法强制转换,则返回空指针。 dynamic_cast通常在解析指向继承中使用的类的指针时使用,您希望确保所投射的指针属于预期类型。

另请查看C++ : Documentation : C++ Language Tutorial : Type Casting

答案 5 :(得分:2)

静态转换由编译器完成:它将结果视为目标类型,无论如何。当你完全确定参数属于目标类型时,你会这样做。

动态转换在运行时完成,因此需要运行时类型信息。当您不确定自己的类型时,可以执行此操作:强制转换可能会失败,返回值为null。它也只能用于指针和引用。

答案 6 :(得分:1)

如果你在谈论C ++。那么static_cast不是安全的类型。它可以转换为您的类型,但如果它错了它不会抛出任何错误/消息。所以你会从中得到不好的对象。如果转换失败,dynamic_cast会抛出错误:)希望这会有所帮助! :)