C++ 支持四种基本的类型转换:
-
静态类型转换(Static Cast):
使用static_cast<type>(expression)
进行基本的非多态类型转换,没有运行时类型检查。它主要用于内置的数据类型之间的转换,比如将float
转换为int
(舍去小数部分),或者在类层次结构中向上转型(从派生类指针转换为基类指针)。int i = 10; float f = static_cast<float>(i);
-
动态类型转换(Dynamic Cast):
使用dynamic_cast<type>(expression)
进行多态类型转换,有运行时类型检查。它主要用于类层次结构中的向下转型(从基类指针转换为派生类指针),以及将多态指针或引用安全地转换为其他类型。如果转换失败,指针类型会返回nullptr
。Base* b = new Derived(); Derived* d = dynamic_cast<Derived*>(b); // 如果 b 实际上指向 Derived 类型的对象,则成功转换
-
重新解释类型转换(Reinterpret Cast):
使用reinterpret_cast<type>(expression)
进行低级别的重新解释转换,没有任何类型检查。它可以将任何指针转换为任何其他指针类型,甚至可以将指针转换为足够大的整数类型。这种转换是非常危险的,因为没有任何安全性保证,完全由程序员负责确保转换的合理性。int* p = new int(65); char* ch = reinterpret_cast<char*>(p); // 将 int 指针转换为 char 指针
-
常量和易变类型转换(Const Cast):
使用const_cast<type>(expression)
用于移除const
或volatile
的限定符(或者添加它们,但这是不推荐的)。这种转换不改变表达式的值类型,只改变其类型属性。const int* ci = new int(10); int* modifiable = const_cast<int*>(ci); // 移除 const,使得可以通过 modifiable 修改值
C++11 起,添加了 constexpr
关键字,用于表示编译时常量。const_cast
也可以用来移除 constexpr
的限定,但只能用于不涉及多个对象或非字面类型的表达式。
使用类型转换时需要格外小心,因为不当的使用可能会导致未定义行为或程序错误。每种转换都有其特定的用途和限制,理解这些差异对于安全地进行类型转换至关重要。