static_cast在编译时进行类型转换,适用于已知安全的场景如基本类型转换和向上转型,无运行时开销;dynamic_cast在运行时检查,用于多态类型的向下转型,安全性高但性能开销大。

static_cast 和 dynamic_cast 是 C++ 中两种不同的类型转换操作符,它们在用途、机制和安全性方面有明显区别。理解它们的差异对于编写安全、高效的 C++ 代码非常重要。
static_cast:静态转换(编译时确定)
static_cast 在编译阶段执行类型转换,不进行运行时类型检查。它适用于已知安全的转换场景。
常见用途包括:- 基本数据类型之间的转换,如 int 转 double,double 转 int(可能截断)
- 指针或引用在继承层次结构中的向上转换(up-casting),如派生类指针转基类指针
- 有明确构造函数或转换运算符的类类型之间的转换
例如:
Derived* d = new Derived();Base* b = static_cast
注意:static_cast 不检查向下转型(down-cast)是否安全。如果错误地将一个实际不是派生类的基类指针转为派生类指针,结果是未定义行为。
立即学习“C++免费学习笔记(深入)”;
dynamic_cast:动态转换(运行时检查)
dynamic_cast 主要用于在继承体系中进行安全的向下转型或交叉转换,它依赖运行时类型信息(RTTI)来验证转换的合法性。
特点包括:- 只能用于多态类型(即包含虚函数的类)
- 转换失败时,对于指针返回 nullptr,对于引用抛出 std::bad_cast 异常
- 性能开销比 static_cast 高,因为需要运行时检查
例如:
Base* b = new Base();Derived* d = dynamic_cast
if (d) { /* 转换成功 */ } else { /* 转换失败 */ }
只有当基类有虚函数时,才能使用 dynamic_cast。它确保了类型安全,适合在不确定对象真实类型时使用。
关键区别总结
- 检查时机:static_cast 是编译时转换,dynamic_cast 是运行时检查
- 安全性:dynamic_cast 更安全,尤其用于向下转型;static_cast 依赖程序员判断
- 性能:static_cast 更快,无运行时开销;dynamic_cast 有 RTTI 检查成本
- 使用条件:dynamic_cast 要求类是多态的,static_cast 无此限制
一般建议:能用 static_cast 的安全上转型就用它;需要向下转型且不确定类型时,使用 dynamic_cast 来保证安全。










