C++ 类型转换
C 语言的隐式转换虽然简洁,但在复杂逻辑中往往缺乏可见性,容易埋下隐患。为了解决这个问题,C++ 引入了四种命名明确的强制类型转换操作符,让转换意图更加清晰可控。
static_cast
主要用于非多态类型的静态转换。编译器隐式执行的任何类型转换都可以用 static_cast 替代,但无法用于两个完全不相关的类型之间。
reinterpret_cast
用于底层比特位的重新解释,可以在不同类型指针或整数之间进行转换。使用时需格外小心,确保目标类型确实能容纳源数据。
const_cast
作用是移除变量的 const 属性。需要注意的是,如果原变量本身是 const 的,通过指针修改其值可能导致未定义行为。此时建议配合 volatile 关键字,强制编译器每次从内存读取,避免优化导致的缓存不一致。
dynamic_cast
专用于多态类型的动态转换,将父类指针/引用安全地转换为子类。它要求基类至少包含一个虚函数。如果转换失败,指针会返回 nullptr,引用则抛出异常。如果是子类转父类,直接使用 static_cast 即可。
提示:RTTI(运行时类型识别)支持三种方式:
typeid运算符、dynamic_cast运算符以及decltype,了解其原理有助于调试多态问题。
C++ 的 IO 流
C++ 的 IO 流体系基于面向对象设计,兼容 C 语言函数的同时提供了更灵活的接口。核心组件包括:
istream:输入流,对应标准输入设备。ostream:输出流,对应标准输出设备。iostream:输入输出流组合。
对于自定义类型,C 风格的 scanf/printf 系列函数不再适用,推荐使用 cin/cout 以支持重载操作符。
实用技巧:在控制台程序中若需终止输入,可按
Ctrl+Z(Windows)或Ctrl+D(Linux/Mac)。ios流对象提供operator bool()成员函数,可用于判断流状态是否有效。
C++ 文件的 IO 流
文件操作主要依赖以下三个类:
ifstream:文件输入流,专门用于读取。ofstream:文件输出流,专门用于写入。fstream:文件读写流,兼具两者功能。
示例代码如下:
#include <fstream>
// 打开文件,指定读取模式及二进制标志
std::ifstream ifs("text.txt", std::ios_base::in | std::ios_base::binary);
// 读取二进制数据
struct Info { int id; char name[20]; } info;
ifs.((*)&info, (info));
ifs >> info.name;


