我不太习惯何时使用静态演员和动态。有什么解释吗?
答案 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,它还遍历类层次结构以查看是否可以进行此类转换。
答案 3 :(得分:2)
动态强制转换需要RTTI,并且与静态强制转换相比具有一定的魔力。 static_cast只是一个编译时间转换,检查是否可以通过一些简单的规则将原始类提升为转换类。
例如,在虚拟继承的情况下,只有dynamic_cast可以解决这种情况。
另外,如果无法进行强制转换,dynamic_cast将返回NULL,因此您可以做出不同的决定。
另一方面,dynamic_cast速度较慢,因为它意味着正在执行某些代码,如前所述,它需要启用RTTI,这会增加二进制文件的大小。
答案 4 :(得分:2)
static_cast
类似于旧的C样式演员,可以应用于任何事情。当您确定某些类型时,将使用static_cast
。例如,我在static_cast
和int
之间投标时通常使用enum
。
dynamic_cast
只能与指针和引用一起使用。如果无法强制转换,则返回空指针。 dynamic_cast
通常在解析指向继承中使用的类的指针时使用,您希望确保所投射的指针属于预期类型。
另请查看C++ : Documentation : C++ Language Tutorial : Type Casting
答案 5 :(得分:2)
静态转换由编译器完成:它将结果视为目标类型,无论如何。当你完全确定参数属于目标类型时,你会这样做。
动态转换在运行时完成,因此需要运行时类型信息。当您不确定自己的类型时,可以执行此操作:强制转换可能会失败,返回值为null。它也只能用于指针和引用。
答案 6 :(得分:1)
如果你在谈论C ++。那么static_cast不是安全的类型。它可以转换为您的类型,但如果它错了它不会抛出任何错误/消息。所以你会从中得到不好的对象。如果转换失败,dynamic_cast会抛出错误:)希望这会有所帮助! :)