static_cast在编译时进行类型转换,适用于基本类型转换和继承中的向上转换,效率高但需程序员确保安全;dynamic_cast在运行时检查,用于多态类型的向下转换,安全性高但有性能开销。
在C++中,类型转换(casting)是将一种数据类型转换为另一种类型的操作。C++提供了四种主要的类型转换操作符:static_cast、dynamic_cast、const_cast 和 reinterpret_cast。本文重点讲解 static_cast 与 dynamic_cast 的区别,帮助理解它们各自的使用场景和特点。
static_cast 是在编译期间进行类型转换的操作符,适用于已知安全或逻辑上合理的类型转换。它不进行运行时类型检查,因此效率较高,但需要程序员确保转换的正确性。
常见用途包括:
在继承层次结构中的向上转换(up-casting),即派生类转基类示例:
class Base {};
class Derived : public Base {};
Derived d;
Base b = static_cast >(&d); // 合法:派生类指针转基类指针
注意:static_cast 也可以用于向下转换(down-cast),但不安全,如果目标类型不匹配,结果未定义。
dynamic_cast 主要用于在继承体系中进行安全的向下转换或跨继承转换。它依赖于运行时类型信息(RTTI),在转换失败时返回 nullptr(对于指针)或抛出 std::bad_cast 异常(对于引用)。
关键特性:
示例:
class Base {
public:
virtual ~Base() {} // 必须有虚函数以启用 RTTI
};
class Derived : public Base {};
Base b = new Base();
Derived d = dynamic_cast(b);
// d 将为 nullptr,因为 b 实际指向 Base 对象
如果 b 指向的是 Derived 对象,则转换成功;否则返回 nullptr,程序可据此判断并处理错误。
选择建议:优先使用 static_cast 进行明确且安全的类型转换;当需要在继承链中安全地进行向下转换时,使用 dynamic_cast。
基本上就这些,掌握好这两个 cast 的使用场景,能有效避免类型转换带来的运行时错误。