文件IO:文件流
核心要点速览 本质区别:文本基于字符编码(含格式 / 编码转换),二进制基于原始字节流(无任何转换); 差异:可读性(文本可读 / 二进制不可读)、效率(二进制 > 文本)、适用场景(文本→日志 / 配置,二进制→图片 / 结构体); 操作:文本用>>/<</getline(),二进制用read()/write()+ios::binary; 补充:本质区别对比、结构体二进制读写禁忌、场景选择依据、跨平台兼容原理。 一、本质区别:从存储到操作的差异文本处理和二进制处理的所有差异,根源在于数据存储形式和读写时是否进行转换 对比维度 文本处理(Text Mode) 二进制处理(Binary Mode) 存储形式 以字符编码(ASCII/UTF-8 等)存储,数据需转换为字符编码(如int 123→字符串 “123”) 以原始二进制存储,直接复刻内存字节布局(如int 123→0x7B 0x00 0x00 0x00) 读写转换 自动处理换行符(Windows:...
异常处理:异常传播与栈展开
核心要点速览 异常传播:无匹配catch时,异常逐层向上传递至调用者,直至捕获或触发std::terminate() 栈展开:传播过程中自动逆序销毁局部对象(按构造逆序),保障资源回收 规则:析构函数禁止抛异常(避免双重异常),未完全构造对象不执行析构 异常安全:依赖栈展开原子性 + RAII 机制,避免资源泄漏 补充:异常匹配优先精确 / 继承兼容,捕获const引用可避免异常切片 一、异常传播:从抛出点到捕获点的传递逻辑概念函数抛出异常且自身无匹配try-catch时,异常会沿函数调用栈逐层向上传播,依次遍历调用者上下文,直到被某个catch块捕获;若全程无捕获,程序调用std::terminate()终止(默认执行std::abort())。 传播流程 函数调用链:A→B→C,C 中抛出异常; C 无catch匹配,异常传播至 B; B 无catch匹配,继续传播至 A; A 的try块监控到异常,匹配catch执行处理; 若 A 仍无匹配,异常传播至main函数,最终未捕获则程序终止。 细节 异常传播时,被跳过函数中 “已执行但未进入try块” 的代码不再...
文件IO:二进制与文本处理
核心要点速览 区别:文本处理基于字符编码(有格式转换),二进制处理基于原始字节流(无转换)。 差异:文本可人类直接阅读,二进制不可;文本有换行符 / 编码转换,二进制无;文本适合日志 / 配置,二进制适合图片 / 结构体。 操作:文本用>>/<</getline(),二进制用read()/write()+ios::binary。 一、区别 维度 文本处理(Text Mode) 二进制处理(Binary Mode) 存储形式 字符编码(如 ASCII、UTF-8),每个字符对应编码值。 数据原始二进制(如 int 的 4 字节、结构体的连续字节)。 格式转换 自动处理换行符(Windows:\n→\r\n;Linux:不转换),部分编码可能转换(如宽字符)。 无任何转换,字节数据原样读写(\n就是 0x0A,\r就是 0x0D)。 可读性 人类可直接阅读(如记事本打开txt文件)。 人类不可读(打开为乱码,需程序解析)。 效率 读写需编码 / 解码,效率较低。 直...
文件IO:文件操作
核心要点速览 文本文件:>>/<<、getline()读写,自动转换换行符,适配人类可读数据(日志、配置)。 二进制文件:read()/write()操作原始字节流,适配非文本数据(图片、结构体),效率更高。 文件指针:seekg()/seekp()定位、tellg()/tellp()获取位置,支持随机访问。 关键:模式区分、读写混用问题、字节对齐、缓冲区刷新、跨平台兼容核心点。 一、文本文件:读写逻辑与易错文本文件以字符编码(ASCII/UTF-8)存储,读写时自动处理换行符转换(如 Windows 下\n→\r\n),核心关注 “读写一致性” 与 “缓冲区问题”。 1. 读写方法(1)写入操作(ofstream)12345ofstream ofs("text.txt", ios::out | ios::app); // 追加模式if (!ofs) return -1; // 检查打开失败ofs << "姓名:Tom" << endl; ...
模板与STL:STL
核心要点速览 组件:容器(存储)、算法(操作)、迭代器(桥梁)、仿函数(自定义逻辑)、适配器(接口转换)、分配器(内存管理) 容器分类:序列式(vector/list/deque)、关联式(有序红黑树 / 无序哈希表)、适配器(stack/queue/priority_queue) 关键:底层实现、迭代器失效、容器选型、算法适用条件、内存与效率权衡 一、STL 组件 容器:类模板,封装数据结构(如 vector/map),存储数据的载体。 算法:函数模板,提供通用操作(sort/find),通过迭代器操作容器。 迭代器:类似指针的对象,提供元素访问接口,是容器与算法的桥梁。 仿函数:重载operator()的类 / 结构体(函数对象),传递自定义逻辑(比较 / 筛选)。 适配器:转换已有组件接口(含容器适配器、迭代器适配器如 reverse_iterator、函数适配器如 bind),如 stack 基于 deque 适配。 分配器:默认std::allocator,核心接口含alloc...
模板与STL:模板基础
核心要点速览 意义:将类型作为参数,实现通用逻辑,编译期生成具体类型代码 分类:函数模板(可隐式实例化)、类模板(需显式实例化) 模板参数:类型参数(typename T)、非类型参数(编译期常量) 特化:全特化(所有参数指定类型)、偏特化(仅类模板支持,部分参数指定类型) 区别:模板有类型检查,宏无;模板支持特化 / 重载,宏不支持 一、模板的意义通过 “类型参数化” 让通用逻辑适配多种类型,既避免为不同类型重复编写相似代码(提升复用),又能在编译期进行类型检查(保证安全),且编译器会生成具体类型的代码(无运行时开销)。这也是 STL 容器(如 vector)和算法(如 sort)的实现基础。 二、函数模板定义生成具体函数的 “模板”,编译器根据实参类型自动实例化对应版本。 规则 语法:template<模板参数列表> 返回类型 函数名(参数列表) { ... } 实例化: 隐式实例化:编译器根据实参推导类型(如max(1,2)推导T=int)。 显式实例化:手动指定类型(如max<int>(1.5,2.5)强制T=int)。 重载:...
现代C++特性:结构化绑定
核心要点速览 适用类型:public 成员的结构体 / 类、pair/tuple、固定大小数组 /std::array、自定义适配类型 优势:语法简洁、支持 const / 引用绑定、无需提前声明变量 补充:std::tie对比、生命周期问题、非适用场景、底层依赖 一、语法格式:auto [变量1, 变量2, ...] = 复合类型;支持修饰符:const auto&(只读无拷贝)、auto&(修改原对象)、auto&&(C++20 右值绑定) 示例123456789101112// 1. 结构体/类(public成员)struct Point { int x; int y; };Point p = {1, 2};auto [a, b] = p; // 值拷贝绑定// 2. pair/tuplestd::pair<int, std::string> user = {101, "Alice"};auto [id, n...
现代C++特性:Lambda表达式
核心要点速览 语法:[捕获列表](参数) mutable -> 返回类型 { 函数体 },必填:捕获列表 + 函数体 捕获方式:[=](值)、[&](引用)、[=, &x](混合)、[this](类内)、[x=std::move(y)](C++14 移动捕获) 陷阱:悬垂引用 /this、mutable误用、多 return 未显式指定返回类型、STL 排序谓词非严格弱序 特性:无捕获转函数指针、有捕获需std::function包装、C++14 泛型、C++17constexpr/[*this] 用途:简化 STL 算法参数(sort/find_if),替代短小的临时函数和仿函数 一、捕获列表1. 捕获方式 捕获方式 说明 [=] 捕获时机为 Lambda 创建时,仅拷贝实际使用的外部变量,外部变量后续修改不会影响副本 [&] 默认引用捕获所有用到的外部变量,优点是无拷贝开销,但严禁返回带此捕获的 Lambda(极易产生悬垂引用) [=, &x] 默认值捕获,仅 x 显式按引用捕获,显式捕...
现代C++特性:类型推导
核心要点速览 auto:基础推导忽略顶层 const / 引用,C++14 拓展至函数返回值与 lambda 参数,有明确使用限制。 decltype:精确保留类型(含 const / 引用),支持表达式推导,双层括号是推导左值引用的关键。 模板类型推导:分按值 / 按引用 / 万能引用三类场景,需特殊处理数组与函数名,核心是 “实参到形参的类型映射”。 进阶场景:decltype(auto) 结合两者优势,auto&& 适配多值类别,万能引用需搭配 std::forward 实现完美转发。 区别:auto 侧重 “简化声明”,decltype 侧重 “精确获取”,模板推导侧重 “参数适配”。 一、auto:自动推导变量类型用途是简化长类型声明,C++14 拓展了适用场景,推导逻辑聚焦 “忽略顶层修饰,保留底层约束”。 1. 推导规则 必须初始化:编译器依赖初始化表达式推导,未初始化编译报错(如auto x;报错)。 顶层 const / 引用忽略:变量本身的 const 和引用被舍弃,底层 const(指向常...
现代C++特性:右值引用和移动语义
核心要点速览 左值 vs 右值:左值有持久地址(可 & 取址),右值是临时对象 / 字面量(不可 & 取址) 右值引用(T&&):绑定右值,延长其生命周期,支持修改绑定对象 移动语义:通过移动构造 / 赋值转移资源(而非拷贝),提升性能(避免深拷贝) std::move:将左值转为右值引用(仅转换,不移动资源),原对象不应再使用 完美转发:std::forward 保持参数左值 / 右值属性,用于模板传递参数 一、左值与右值:值的分类1. 左值 定义:可放在赋值左侧,有持久内存地址,生命周期较长(如变量、函数返回的左值引用)。 特征:可被&取址(&a合法),可被赋值(a = 5合法)。 示例:int x = 10;(x 是左值)、int& func()(返回左值引用,是左值)。 2. 右值 定义:只能放在赋值右侧,无持久内存地址(或地址无意义),生命周期短暂。 分类: 纯右值:字面量(5、"hello")、表达式结果(x + y)、临时对象(func()返回非引用时)。...

