C++ 的类型转换
C 语言中的类型转换存在可视性差、难以追踪的问题,容易在复杂程序中引发潜在的逻辑错误。为解决这一问题,C++ 引入了四种命名明确的强制类型转换操作符,通过规范的语法形式让类型转换过程更清晰、可控。
四种命名的强制类型转换操作符
static_cast
用于非多态类型的转换(静态转换),编译器隐式执行的任何类型转换都可用,但不能用于两个不相关的类型进行转换。
reinterpret_cast
用于不同类型之间的底层位模式转换。
const_cast
作用为删除变量的 const 属性。注意:在用指针改变原变量值时,编译器可能会优化掉对内存的访问操作,此时需使用 volatile 确保每次访问内存。
dynamic_cast
用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)。
- 只能用于父类含有虚函数的类。
- 会检查是否能转换成功,成功则转换,失败返回空指针。 如果是子类转换成父类,不需要 dynamic_cast,用 static_cast 即可;父类转子类建议使用 dynamic_cast,虽安全但不保证一定成功。
RTTI (运行时类型识别)
C++ 支持 RTTI 的方式有三种:
- typeid 运算符
- dynamic_cast 运算符
- decltype
C++ 的 IO 流
IO 流体系负责程序与外部设备之间的数据输入与输出。
- istream:输入流
- ostream:输出流
- iostream:输入输出流
C++ 兼容 C 语言的 IO 函数(如 fprintf, fscanf 等),但对于自定义类型,推荐使用 cin 和 cout 以支持更好的扩展性。
C++ 文件的 IO 流
- ifstream:专门用于从文件中读取数据。
- ofstream:专门用于向文件中写入数据。
- fstream:结合 ifstream 和 ofstream 的功能,允许对同一个文件进行读写操作。
// 示例用法
ifstream ifs("text.txt", ios_base::in | ios_base::binary);
ifs.read((char*)&info, sizeof(info)); // 读二进制
ifs >> info; // 读文本
注意:二进制读写不能用 string、vector 这样的对象存数据,否则写入的只是指针,进程结束后可能成为野指针。
stringstream
stringstream 主要用于字符串数据处理。 用途:
- 数据转换成字符串
- 序列化和反序列化结构数据(通常不推荐用于复杂场景)


