C++ 类型转换
C 语言的类型转换虽然简洁,但在复杂程序中可视性较差,容易引发逻辑错误。C++ 引入了四种命名明确的强制类型转换操作符,让过程更清晰可控。
四种命名强制类型转换操作符
static_cast 用于非多态类型的静态转换。编译器隐式执行的转换通常可用它替代,但不能用于无关类型间转换。
reinterpret_cast 用于不同类型间的底层位模式转换,风险较高,需慎用。
const_cast 用于移除变量的 const 属性。注意:若编译器优化了内存访问,直接修改可能无效,此时需配合 volatile 使用。
dynamic_cast 用于父类指针/引用转子类(动态转换)。要求父类含虚函数,失败返回空指针。子类转父类用 static_cast 即可。
RTTI
运行时类型识别(RTTI)支持三种方式:typeid 运算符、dynamic_cast 运算符、decltype。
C++ IO 流
IO 流体系涵盖 istream、ostream 及文件流 ifstream、ofstream、fstream,支持控制台与文件交互。C 语言 IO 函数如 fprintf、fscanf 等仍可使用,但自定义类型推荐使用 cin 和 cout。
提示:程序一直要求输入时,可按 Ctrl+Z 终止输入(Windows),Ctrl+C 也可行。
ios 流中有一个 operator bool() 成员函数,可用于判断输入输出流的状态。
C++ 文件的 IO 流
ifstream:专门用于从文件中读取数据。 ofstream:专门用于向文件中写入数据。 fstream:结合两者功能,允许对同一个文件进行读写操作。
// 打开文件:文本或二进制模式
ifstream ifs("text.txt", ios_base::in | ios_base::binary);
// 读二进制数据
ifs.read((char*)&info, sizeof(info));
// 读文本数据
ifs >> info;
注意:二进制读写不能用 string、vector 这样的对象存数据,这样写进去的只会是一个指针,如果进程结束了就成野指针了。
stringstream
stringstream 主要用于将数据转换成字符串,或序列化和反序列化结构数据。不过一般不推荐用它来实现复杂的序列化逻辑。
提示:了解即可,实际开发中使用频率不高。


