C++ Primer, 第五版
一本全面且权威的C++指南,完全为C++11标准重新编写。本课程涵盖从基本语言元素到复杂的库功能以及高级类设计工具的全部内容。
课程概述
📚 内容概要
一本全面且权威的 C++ 指南,完全重写以适配 C++11 标准。本课程涵盖从基础语言元素到复杂库功能以及高级类设计工具的所有内容。
现代 C++11 编程的行业标准权威指南。
作者: 斯坦利·B·利普曼(Stanley B. Lippman)、约瑟·拉乔伊(Josée Lajoie)、芭芭拉·E·穆(Barbara E. Moo)
致谢: 戴夫·阿布拉哈姆斯(Dave Abrahams)、安迪·科尼格(Andy Koenig)、斯特凡·T·拉瓦杰(Stephan T. Lavavej)、杰森·梅里尔(Jason Merrill)、约翰·斯皮策(John Spicer)、赫布·萨特(Herb Sutter)、比雅尼·斯特劳斯特鲁普(Bjarne Stroustrup)、亚历克斯·斯捷潘诺夫(Alex Stepanov)以及标准化委员会成员。
🎯 学习目标
- 定义并实现
main函数,理解其与操作系统的交互。 - 执行命令行编译,并管理基本输入/输出流(
cin、cout)。 - 应用控制流语句解决迭代逻辑问题,例如统计出现次数。
- 实现逻辑结构以统计和处理连续输入数据的出现情况。
- 在控制语句中区分赋值运算符(
=)与相等运算符(==)。 - 使用类对象(
Sales_item),通过点号操作符访问成员函数,并包含自定义头文件。 - 区分不同原始类型,预测类型转换及无符号整数溢出的结果。
- 实现 C++11 特性,包括列表初始化、
nullptr、constexpr和类型推导说明符。 - 区分变量声明与定义,并应用作用域规则来管理标识符可见性。
- 区分引用与指针,并利用
void*进行通用内存处理。
🔹 第 1 课:C++ 入门与基本输入/输出
概述: 本课介绍 C++ 程序的基础结构,重点讲解 main 函数、基本数据类型和编译过程。涵盖使用 iostream 库进行基本输入/输出(I/O)操作,通过 while 和 for 循环实现逻辑,最后通过 Sales_item 类初步引入面向对象概念。
学习成果:
- 定义并实现
main函数,理解其与操作系统的交互。 - 执行命令行编译,管理基本输入/输出流(
cin、cout)。 - 应用控制流语句解决迭代逻辑问题,如统计出现次数。
🔹 第 2 课:控制流与基本类概念
概述: 本课从基本控制流过渡到 C++ 的核心力量:类。学习者将掌握处理数据流(统计连续出现次数)所需的逻辑,并学习如何使用 Sales_item 类像处理内置类型一样轻松处理复杂数据结构。本单元以实现一个功能完整的书店程序结束,整合了文件重定向和错误报告功能。
学习成果:
- 实现逻辑结构以统计和处理输入数据的连续出现。
- 在控制语句中区分赋值(
=)与相等(==)运算符。 - 使用类对象(
Sales_item),通过点号操作符访问成员函数,并包含自定义头文件。
🔹 第 3 课:原始类型与变量
概述: 本课建立 C++ 编程的基础构建模块,探讨算术类型、变量生命周期和内存模型。学生将掌握类型转换(特别是无符号类型)的细微差别,熟悉 C++11 列表初始化语法,以及指针与引用之间的关键区别。课程以高级类型系统收尾,包括 const 限定符、类型推导(auto、decltype),以及使用预处理器保护的健壮自定义数据结构实现。
学习成果:
- 区分不同原始类型,预测类型转换和无符号整数溢出的结果。
- 实现 C++11 特性,包括列表初始化、
nullptr、constexpr和类型推导说明符。 - 区分变量声明与定义,并应用作用域规则管理标识符可见性。
🔹 第 4 课:复合类型与现代类型限定符
概述: 本课深入探索 C++11 的复杂类型系统,重点关注复合类型(指针与引用)如何与 const 和 constexpr 等类型限定符交互。学生将掌握使用 auto 与 decltype 进行类型推导的细微差别,并学会通过预处理器头文件保护将数据封装在自定义结构中。
学习成果:
- 区分引用与指针,并利用
void*进行通用内存处理。 - 对顶层和底层
const限定符以及constexpr用于编译时常量进行分类与应用。 - 使用 C++11 类型推导(
auto与decltype)编写灵活且可维护的代码。
🔹 第 5 课:库字符串与向量
概述: 本课介绍 C++ 标准库中的基本类型 string 与 vector,它们为内置类型提供了更灵活、更安全的替代方案。学生将学习如何通过 using 声明管理命名空间访问,初始化和操作可变长度字符串与容器,并使用基于范围的 for 循环和迭代器高效处理数据集合。
学习成果:
- 使用
namespace using声明简化代码,同时避免头文件中的常见陷阱。 - 执行稳健的字符串与向量初始化,包括 C++11 列表初始化。
- 使用
push_back、基于范围的for循环和基本迭代器操作实现字符级处理和动态容器增长。
🔹 第 6 课:迭代器与内置数组
概述: 本课涵盖在 C++11 中导航和管理序列的基本机制。从现代高级工具(如 string 与 vector 的迭代器)转向低层的内置数组、指针算术和 C 风格字符串。学生将学习如何将遗留的基于数组的代码与现代标准库容器对接,并管理复杂的多维结构。
学习成果:
- 使用迭代器与迭代器算术导航和操作
string与vector容器。 - 使用指针算术和
begin/end库函数定义、初始化和导航内置数组。 - 实现 C 风格字符串操作,并安全地将内置数组与现代库类型对接。
🔹 第 7 课:表达式、运算符与转换
概述: 本课探讨 C++ 表达式的根本构建块,重点在于语言如何评估操作并管理数据类型。学生将掌握左值与右值的区别、运算符优先级与结合性规则,以及算术、逻辑与位运算的机制。此外,课程深入探讨 C++ 类型管理,包括隐式算术转换和显式命名转换的安全应用。
学习成果:
- 区分左值(对象身份)与右值(对象值),理解它们在表达式中的作用。
- 使用优先级、结合性和短路逻辑预测复杂表达式的求值顺序。
- 使用位运算符进行低层级数据操作,并通过隐式转换和显式命名转换管理类型安全。
🔹 第 8 课:高级语句与异常处理
概述: 本课涵盖重要的 C++ 控制流结构,从基本语句类型和作用域规则到高级条件与迭代逻辑。还介绍了使用 C++ 异常处理机制和标准库异常层次结构的健壮错误处理技术。
学习成果:
- 区分空语句、简单语句与复合语句,并管理这些结构中的变量作用域。
- 使用
if与switch语句实现复杂决策,同时解决“悬垂 else”等逻辑错误。 - 为特定编程任务选择并应用合适的迭代构造(
while、for、范围for、do while)。
🔹 第 9 课:函数设计与参数传递
概述: 本课探讨 C++ 函数的架构,重点关注数据如何传入和从模块化代码块返回。探讨局部对象的生命周期、参数传递机制(值传递与引用传递),以及处理可变参数的 C++11 标准。掌握这些概念使程序员能够编写高效、可重用且内存安全的代码。
学习成果:
- 区分参数初始化方法及其对性能和数据完整性的影响。
- 使用
const限定符、initializer_list和数组传递技术实现健壮的函数接口。 - 有效管理对象生命周期,使用自动存储与静态存储持续时间。
🔹 第 10 课:高级功能与重载
概述: 本课深入探讨 C++ 函数的复杂机制,聚焦参数传递、对象生命周期以及函数重载的复杂性。学生将掌握 C++11 特性,如 initializer_list 处理可变参数、constexpr 函数,以及函数指针的声明与使用,以创建灵活、模块化的代码。
学习成果:
- 区分按值传递与按引用传递,并识别何时使用
const参数。 - 应用重载解析规则,确定候选函数与可行函数中的“最佳匹配”。
- 实现并管理函数指针,包括在向量等容器中使用以及作为返回类型。
🔹 第 11 课:类封装与构造函数
概述: 本课探讨从简单数据结构向抽象数据类型(ADT)的转变。重点讲解类设计的机制,包括成员函数、隐式 this 指针,以及构造函数在对象初始化中的关键作用。此外,还探讨通过访问控制(public/private)实现封装,以及使用“友元”在隐藏实现细节的同时保持清晰接口。
学习成果:
- 设计并实现一个分离接口与实现的 C++ 类(如
Sales_data)。 - 掌握使用默认、重载和显式构造函数进行对象初始化的规则。
- 应用访问说明符与友元关系以实现封装并管理类作用域。
🔹 第 12 课:类作用域与转换管理
概述: 本课深入探讨 C++ 类设计的高级机制,聚焦从简单数据结构向健壮抽象数据类型(ADT)的过渡。重点包括通过不同类型的构造函数管理对象初始化,使用 explicit 关键字控制隐式类型转换,以及理解类级别实体如 static 成员和字面量类。
学习成果:
- 使用访问说明符与友元声明设计并实现封装类(ADT)。
- 管理隐式类类型转换,并使用
explicit关键字抑制转换。 - 实现并初始化
static类成员,用于类级别的数据管理。
🔹 第 13 课:流输入输出与顺序容器基础
概述: 本课涵盖 C++ 标准库输入输出系统和顺序容器的基本机制。学生将学习如何管理流状态和输出缓冲区,执行文件与字符串输入/输出,并导航库中的顺序容器。课程强调迭代器范围、容器初始化以及容器内存管理的性能影响等关键概念。
学习成果:
- 查询并重置流状态,控制输出缓冲区刷新以管理流完整性。
- 使用
fstream与sstream通过多种文件模式处理持久化与内存中数据。 - 根据访问模式和内存开销选择适当的顺序容器以优化选择。
🔹 第 14 课:容器操作与泛型算法
概述: 本课涵盖对 C++ 顺序容器的管理,以及应用泛型算法独立于容器类型处理数据。探讨容器如何处理内存增长与元素生命周期,以及使用 lambda 表达式和函数绑定器自定义库算法。学生将掌握库的架构,包括迭代器类别和专用算法。
学习成果:
- 使用
forward_list的专用操作、调整大小技术以及vector的容量管理来管理容器生命周期。 - 使用扩展的
string库和容器适配器执行复杂的字符串操作与数值转换。 - 实现泛型算法以读取、写入和重新排序数据,通过谓词、lambda 表达式和
std::bind自定义行为。
🔹 第 15 课:关联容器与智能指针
概述: 本课涵盖 C++11 标准中的关联容器与动态内存管理。详细说明使用有序与无序容器实现高效的基于键的检索,以及使用智能指针实现健壮、异常安全的代码。课程以设计一个真实世界的文本查询应用结束,整合这些复杂数据结构。
学习成果:
- 使用高效的查找、插入与下标访问技术实现和操作关联容器。
- 通过从手动
new/delete转向基于 RAII 的智能指针和allocator类,掌握动态内存管理。 - 设计复杂的系统,使用引用计数和智能指针所有权在类之间安全共享数据。
🔹 第 16 课:资源管理与移动语义
概述: 本课探讨 C++ 类如何通过“五大特殊成员函数”控制其资源的生命周期。学生将学习如何使用值语义和指针语义策略管理动态内存,实现异常安全的复制交换惯用法,并通过 C++11 移动语义和右值引用优化性能。
学习成果:
- 实现并解释三法则/五法则,确保正确的资源管理并防止内存泄漏。
- 区分值语义与指针语义的类行为,并实现引用计数。
- 使用右值引用和
std::move应用移动语义,消除大型对象不必要的深层拷贝。
🔹 第 17 课:运算符重载与继承(面向对象编程)
概述: 本课探讨通过运算符重载扩展语言语法,以及通过面向对象编程(OOP)构建可扩展系统。学生将学习设计能与内置操作集成的类,并掌握继承、动态绑定和多态类层次结构的机制。
学习成果:
- 设计并实现遵循 C++ 标准库惯例的重载运算符。
- 创建并使用函数对象与
function类型包装器统一可调用实体。 - 使用虚函数、抽象基类和 C++11 访问说明符构建健壮的继承层次结构。
🔹 第 18 课:模板与泛型编程
概述: 本课涵盖 C++ 模板的基本与高级机制,为泛型编程奠定基础。学生将从定义基本函数与类模板开始,逐步掌握 C++11 特有特性,如可变参数模板、完美转发和模板特化。
学习成果:
- 使用类型与非类型参数定义和实例化函数与类模板。
- 管理模板编译模型,并通过
extern template控制多个文件中的实例化。 - 实现高级推导技术,包括尾随返回类型与使用
std::forward的完美转发。
🔹 第 19 课:专用库工具与大型系统
概述: 本课涵盖 C++11 标准库的高级组件与专为复杂系统开发设计的语言特性。内容涵盖专用数据结构、通过 regex 库实现健壮的模式匹配,以及大规模编程的架构工具。此外,还探讨高级异常处理、命名空间管理以及多重继承的复杂性。
学习成果:
- 使用
tuple实现多返回值,使用bitset高效管理位级标志。 - 使用
regex库实现复杂的字符串模式匹配、验证与转换。 - 使用引擎与分布生成高质量随机数,同时保持正确的状态与种子。