C++ 类型转换与 IO 流核心解析
在 C++ 开发中,类型安全与数据交互是两大基石。C 风格的隐式转换往往隐蔽且危险,而 C++ 提供的四种显式操作符能显著提升代码的可读性与安全性。同时,IO 流体系取代了传统的 C 语言函数,为控制台、文件及字符串处理提供了统一的面向对象接口。
四种命名强制类型转换
C++ 引入了四种明确的操作符来替代 C 风格的 (type) 转换,每种都有其特定的适用场景。
static_cast
用于非多态类型的静态转换。编译器在编译期就能确定的转换通常使用它,例如基本类型间的提升或向下转型(需确保类型兼容)。它不能用于无关类型之间的转换。
int a = 10;
double b = static_cast<double>(a); // 整型转浮点
reinterpret_cast
这是一个低级别的转换,仅对位模式进行重新解释。通常用于指针与整数之间的转换,或者不同指针类型之间的转换。使用时需格外小心,因为它不进行任何类型检查。
int x = 10;
void* p = reinterpret_cast<void*>(&x);
const_cast
主要用于移除变量的 const 属性。如果原始对象本身就是 const 的,修改它会导致未定义行为;但如果只是通过指针去除了顶层 const,则可能可行。注意编译器优化可能导致内存访问被忽略,此时可考虑使用 volatile。
const int n = 10;
int* p2 = const_cast<int*>(&n);
// 谨慎修改 n 的值
dynamic_cast
专用于多态类型的动态转换,即父类指针/引用转为子类指针/引用。要求基类至少包含一个虚函数。转换失败时返回空指针(针对指针)或抛出异常(针对引用),因此比 static_cast 更安全。
class Base { virtual void foo() {} };
class Derived : public Base {};
Base* base = new Derived();
Derived* derived = <Derived*>(base);


