C++ 的类型转换
C 语言的类型转换包含隐式类型转换和强制类型转换,但可视性较差,容易引发逻辑错误。C++ 引入了四种命名的强制类型转换操作符,以增强类型转换的可视性和可控性:static_cast、reinterpret_cast、const_cast 和 dynamic_cast。
四种命名的强制类型转换操作符
static_cast
用于非多态类型的转换(静态转换)。编译器隐式执行的任何类型转换均可使用,但不能用于两个不相关的类型进行转换。
reinterpret_cast
用于不同类型之间的底层位模式重解释转换。
const_cast
用于删除变量的 const 属性。注意:修改 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 以支持重载。
程序持续要求输入时,可通过 Ctrl+Z 终止输入,Ctrl+C 亦可终止进程。
ios 流提供了 operator bool() 成员函数来判断输入输出流的状态。
C++ 文件的 IO 流
C 语言文件 IO 在 C++ 中同样可用,C++ 提供了更面向对象的文件流类:
- ifstream:专门用于从文件中读取数据。
- ofstream:专门用于向文件中写入数据。
- fstream:结合读写功能,允许对同一文件进行读写操作。
示例用法:
ifstream ifs("text.txt", ios_base::in | ios_base::binary);
ifs.read((char*)&info, sizeof(info));
ifs >> info;


