Effective C++ 第三版学习地图

对齐第三版九章与 55 个 Items:从语言联邦和对象语义,经 RAII、接口、实现、继承与模板,走到 new/delete、warnings、标准库和 Boost。

学习目标

  • 能说出第三版九章、55 个 Items 的范围、核心问题和前后依赖,不再使用旧四板块压缩目录
  • 能设计对象语义、ownership、接口、实现、多态、generic 与 allocation 递进的个人学习路径
  • 能使用预测、最小复现、正反测试和真实代码迁移证据验收每个 Item
Effective C++ · 全书地图55 条条款 · 四大板块 · 从习惯语言到驾驭模板习惯 C++ 与构造析构条款 1-12视 C++ 为联邦const / inline 替代 #define对象初始化构造/析构/赋值资源管理条款 13-17以对象管理资源RAII 拷贝行为访问原始资源智能指针设计与继承条款 18-40接口设计原则成员变量封装is-a 公有继承多态与复合模板与杂项条款 41-55模板隐式接口TMP 与 type traits定制 new/deleteBoost 与 TR1习惯奠基,资源管控,设计封装,模板延伸——55 条准则一条主线
全书四大板块:习惯 C++ 与构造析构(条款 1-12)奠基,资源管理(条款 13-17)管控,设计与继承(条款 18-40)封装,模板与杂项(条款 41-55)延伸。
资源管理生命周期手动管理(易出错)new分配 + 构造使用资源业务逻辑delete析构 + 释放泄漏风险异常 / 提前 returnRAII 自动管理(对象生命周期 = 资源生命周期)shared_ptr共享所有权引用计数 → 0 时释放可拷贝、可共享线程安全计数循环引用风险unique_ptr独占所有权同一时刻唯一持有不可拷贝,可 move零开销抽象替代 auto_ptrweak_ptr观察者(不拥有)不增加引用计数lock() 提升为 shared打破循环引用临时观察资源RAII 核心原则:资源获取即初始化构造函数获取资源 · 析构函数释放资源 · 利用栈展开保证释放手动管理靠人记忆释放时机,RAII 靠对象生命周期自动释放——把确定性交给类型系统条款 13-17:以对象管理资源,小心拷贝行为,成对使用 new/delete
资源管理生命周期:上方裸 new/delete 手动管理(易泄漏),下方 RAII 三种智能指针(shared_ptr 共享、unique_ptr 独占、weak_ptr 观察)自动管理。
Effective C++ · 总复习RAII智能指针拷贝行为new/delete 配对封装const 正确性is-a 继承NVI 模式隐式接口typenameTMPtype traitsinline转型控制异常安全Boost资源管理类与继承模板与泛型杂项约定EffectiveC++55 Items四大分支一图收束:资源为基,类与继承为骨,模板为翼,约定为绳
总复习思维导图:中心「Effective C++」辐射四分支——资源管理(RAII、智能指针、拷贝行为、new/delete 配对)、类与继承(封装、const 正确性、is-a、NVI 模式)、模板与泛型(隐式接口、typename、TMP、type traits)、杂项约定(inline、转型控制、异常安全、Boost)。

路线验收实验

从 55 Items 选择下一步

先预测问题属于对象、接口还是泛型边界,再切换阶段并查看应留下的证据。

当前路线边界

对象语义、初始化、特殊成员与 RAII

先判断对象是否有稳定的不变量,再判断谁拥有资源。

当前阶段 · Items 1-17 · 对象与资源

先判断对象是否有稳定的不变量,再判断谁拥有资源。

从“55 条不是零散技巧”开始

Effective C++ 第三版把 55 个具体建议组织为九章。它们共同回答一个问题:怎样让 C++ 程序的正确性由对象生命周期、类型系统和明确 contract 承担,而不是依赖开发者每次都足够谨慎。

旧学习地图把全书压成四块,会让实现细节、new/delete 与杂项失去准确位置。当前路线逐 Item 保留原书边界。

第一章 Items 1-4:适应 C++

先理解 C++ 是 C、Object-Oriented C++、Template C++ 与 STL 组成的

Items 2-4 用 const、enum、inline 和完整初始化替代脆弱预处理/未初始化状态。

class Session {
public:
    explicit Session(Id id) : id_(id), active_(false) {}
private:
    const Id id_;
    bool active_;
};

验收点:宏是否泄漏作用域;const 是否贯穿接口;成员、base、static objects 是否在首次使用前确定初始化。

第二章 Items 5-12:构造、析构与赋值

compiler 会生成 default/copy/destructor/assignment,但生成不等于语义正确。需要明确禁止 copy、让 polymorphic base destructor virtual、避免 destructor 抛异常、理解 constructor/destructor 期间 virtual dispatch,并让 assignment 返回 *this、处理 self-assignment、复制所有 members/bases。

class UniqueHandle {
public:
    UniqueHandle(const UniqueHandle&) = delete;
    UniqueHandle& operator=(const UniqueHandle&) = delete;
};

第三章 Items 13-17:资源管理

资源取得后立即交给对象,destructor 覆盖 normal return、early return 和 exception。unique/shared/weak ownership 必须与业务生命周期一致;new/delete family 配对;独立语句建立 smart pointer,避免求值顺序中的泄漏窗口。

auto file = std::unique_ptr<FILE, FileCloser>(
    std::fopen(path.c_str(), "rb"));
if (!file) throw FileError{};

第四章 Items 18-25:设计与声明

接口应让正确使用自然、错误使用困难;class 设计就是 type 设计;默认 pass-by-reference-to-const;不返回 local/temporary handle;data private;能用 non-member non-friend 就减小访问面;对称转换放 non-member;为 user type 提供 non-throwing swap。

第五章 Items 26-31:实现

延迟变量定义到真正需要且能初始化的位置;减少 casts;不要泄漏 internal handles;异常安全用 RAII、copy-and-swap 或 transaction;审慎 inline;通过 Pimpl、interface 和依赖反转降低 compilation dependency。

第六章 Items 32-40:继承与面向对象设计

public inheritance 必须满足 is-a 与 substitutability。区分 interface inheritance 和 implementation inheritance;virtual alternatives 包括 NVI、strategy 与 function wrapper;不要重定义 inherited nonvirtual 或 default parameter;composition 表达 has-a/implemented-in-terms-of;private/multiple inheritance 只有语义和成本证据充分才用。

第七章 Items 41-48:模板与泛型编程

templates 的 implicit interface 由 valid expressions 构成,compile-time polymorphism 在实例化/重载阶段发生。掌握 typename、dependent base lookup、parameter-independent factoring、member templates、hidden friends、traits/tag dispatch 与 TMP。

先预测 template error 位于 deduction、lookup、substitution 还是 conversion,再读诊断,不把“模板报错很长”当成无法定位。

第八章 Items 49-52:定制 new 和 delete

理解 new-handler 失败循环;只在 usage errors、statistics、performance、clustering 或 alignment 有证据时替换;自定义函数遵守 zero request、handler、alignment、derived size 和 null delete;placement new 必须有 matching placement delete 处理 constructor failure。

第九章 Items 53-55:杂项

warnings 是潜在语义/portability 信号;标准库提供 ownership、containers、algorithms 和 vocabulary;TR1/Boost 展示库设施从 peer review 到 standardization 的演进。

两条推荐路线

系统学习路线:1-12 对象语义 → 13-17 ownership → 18-31 接口/实现 → 32-40 多态 → 41-48 generic → 49-55 底层与工程。

问题驱动路线:泄漏先读 13-17/29;继承 bug 读 32-40;模板诊断读 41-48;allocator bug 读 49-52。问题解决后回到系统路线补前置。

每个 Item 的验收方法

至少保留三类 evidence:错误代码确实复现;语言机制修复后行为改变;负例被 compiler/test 拒绝。仅能复述条款不算掌握。

先预测问题落在哪个 Items 边界,再运行最小复现;若预测与结果不一致,记录是对象语义、ownership、接口、模板还是工具链假设失效。

小结

  • 第三版按九章组织 55 Items,不能压缩成丢失边界的四块目录
  • 学习依赖从对象语义、ownership、接口、实现、多态走向 generic 与 allocation
  • 每条 Item 用预测、最小复现、语言机制修复、正反测试和真实迁移验收
  • 系统路线建立完整模型,问题路线解决故障后必须回补前置

资料与写作方式声明

本章以Effective C++, Third Edition, Items 1-55权威目录界定学习范围,并结合正文列出的技术资料独立重写;不宣称复现原书正文,也不沿用原作表述。

原作版权归作者与出版社所有;本站原创教学结构与表述仅供学习交流。

名词解释

本章出现的专业名词,用大白话再讲一遍。

第三版九章路线

九章 55 Items 的官方学习结构。

Item 学习单元
单一核心问题及可验证准则。
语言联邦
C++ 多子语言及不同准则模型。
完整初始化

constructor body 前建立成员有效值。

编译器生成函数
隐式声明/定义的特殊成员。
完整复制语义

复制所有 base/member 并保持 contract。

RAII
资源获取绑定 owner 初始化。
ownership contract

拥有、释放和观察的生命周期协议。

易正确接口
让非法状态和调用难以表达。
封装访问面

能访问 representation 的最小代码集合。

异常安全保证
失败后资源和状态的层级承诺。
编译依赖
header 变化造成的重编译和耦合。
is-a substitutability

derived 保持 base 合约的替换性。

NVI
nonvirtual wrapper 加 virtual hook。
隐式接口
template 所需有效表达式集合。
traits 分派
类型信息抽取与静态实现选择。
new-handler 循环
分配失败处理与重试流程。
placement 配对

额外参数匹配的失败释放路径。

可移植性矩阵
多工具链和库的构建组合。
库标准化路径
评审实践到标准设施的演进。
系统学习路线
按依赖顺序建立完整模型。
问题驱动路线
故障切入后回补前置的方式。
条款证据链
复现、修复、测试和迁移证据。

练习

  1. 问题 1:为有裸资源和继承 bug 的旧模块选路线(RAII、ownership contract、public inheritance)。 说明先后 Items 和 evidence。
  1. 问题 2:判断是否掌握 Item 37(default parameters、virtual function、static type)。 学习者能背“不要重定义默认参数”。
  1. 问题 3:制定四周学习计划(template、new-handler、compiler warnings)。 每周必须有跨章节产出。

讨论

评论区加载中…