/cpp-primer-answer

C++ Primer 第5版 读书笔记和练习题答案

Primary LanguageC++OtherNOASSERTION

C++ Primer 中文版:第 5 版 读书笔记/课后练习

注意:

  • 每节练习位于笔记末尾。
  • 编译时注意依赖。如果出现了链接错误,绝大多数情况是因为没有将自己编写的头文件对应的 .cpp 文件添加到编译命令中。参考练习 13.42
  • lib 中的类模板代码是在非模板代码基础上修改而来的,未经测试,且定义应该在头文件而非源文件中。

测试用例来自该网站

部分答案参考 Mooophy/Cpp-Primer

第 1 章 开始

1.1.1 编译、运行程序

1.4.1 while 语句

1.4.2 for 语句

1.4.3 读取数量不定的输入数据

1.4.4 if 语句

1.5.1 Sales_item 类

1.5.2 初识成员函数

第 2 章 变量和基本类型

2.1.1 算术类型

2.1.2 类型转换

2.1.3 字面值常量

2.2 变量

2.2.1 变量定义

2.2.2 变量声明与定义的关系

2.2.3 标识符

2.2.4 名字的作用域

2.3.1 引用

2.3.2 指针

2.3.3 理解复合类型的声明

2.4.1 const 的引用

2.4.2 指针和 const

2.4.3 顶层 const

2.4.4 constexpr 和常量表达式

2.5.1 类型别名

2.5.2 auto 类型说明符

2.5.3 decltype 类型指示符

2.6.1 定义 Sales_data 类型

2.6.2 使用 Sales_data 类

2.6.3 编写自己的头文件

第 3 章 字符串、向量和数组

3.2.1 定义和初始化 string 对象

3.2.2 string 对象上的操作

3.2.3 处理 string 对象中的字符

3.3.1 定义和初始化 vector 对象

3.3.2 向 vector 对象中添加元素

3.3.3 其他 vector 操作

3.4.1 使用迭代器

3.4.2 迭代器运算

3.5 数组

3.5.1 定义和初始化内置数组

3.5.2 访问数组元素

3.5.3 指针和数组

3.5.4 C 风格字符串

3.5.5 与旧代码的接口

第 4 章 表达式

4.1 基础

4.1.1 基础概念

4.1.2 优先级与结合律

4.1.3 求值顺序

4.11.1 算术转换

4.11.2 其他隐式类型转换

4.11.3 显式转换

第 5 章 语句

5.3.1 if 语句

5.3.2 switch 语句

5.4.1 while 语句

5.4.2 传统的 for 语句

5.4.3 范围 for 语句

5.4.4 do while 语句

5.5.1 break 语句

5.5.2 continue 语句

5.5.3 goto 语句

5.6.1 throw 表达式

5.6.2 try 语句块

5.6.3 标准异常

第 6 章 函数

6.1.1 局部对象

6.1.2 函数声明

6.1.3 分离式编译

6.2.1 传值参数

6.2.2 传引用参数

6.2.3 const 形参和实参

6.2.4 数组形参

6.2.5 main:处理命令行选项

6.2.6 含有可变形参的函数

6.3.1 无返回值函数

6.3.2 有返回值函数

6.3.3 返回数组指针

6.4.1 重载与作用域

6.5.1 默认实参

6.5.2 内联函数和 constexpr 函数

6.5.3 调试帮助

6.6.1 实参类型转换

第 7 章 类

7.1.1 设计 Sales_data 类

7.1.2 定义改进的 Sales_data 类

7.1.3 定义类相关的非成员函数

7.1.4 构造函数

7.1.5 拷贝、赋值和析构

7.2.1 友元

7.3.1 类成员再探

7.3.2 返回 *this 的成员函数

7.3.3 类类型

7.3.4 友元再探

7.4.1 名字查找与类的作用域

7.5.1 构造函数初始值列表

7.5.2 委托构造函数

7.5.3 默认构造函数的作用

7.5.4 隐式的类类型转换

7.5.5 聚合类

7.5.6 字面值常量类

第 8 章 IO库

8.1 IO 类

8.1.1 IO 类型无拷贝或赋值

8.1.2 条件状态

8.1.3 管理输出缓冲

8.2.1 使用文件流对象

8.2.2 文件模式

8.3.1 使用 istringstream

8.3.2 使用 ostringstream

第 9 章 顺序容器

9.2.1 迭代器

9.2.2 容器类型成员

9.2.3 begin 和 end 成员

9.2.4 容器定义和初始化

9.2.5 赋值和 swap

9.2.6 容器大小操作

9.2.7 关系运算符

9.3.1 向顺序容器添加元素

9.3.2 访问元素

9.3.3 删除元素

9.3.4 特殊的 forward_list 操作

9.3.5 改变容器大小

9.3.6 容器操作可能使迭代器失效

9.5.1 构造 string 的其他方法

9.5.2 改变 string 的其他方法

9.5.3 string 搜索操作

9.5.4 compare 函数

9.5.5 数值转换

第 10 章 泛型算法

10.1 概述

10.2.1 只读算法

10.2.2 写容器元素的算法

10.2.3 重排容器元素的算法

10.3.1 向算法传递函数

10.3.2 lambda 表达式

10.3.3 lambda 捕获和返回

10.3.4 参数绑定

10.4.1 插入迭代器

10.4.2 iostream 迭代器

10.4.3 反向迭代器

10.5.1 5 种迭代器

10.5.2 算法形参模式

10.5.3 算法命名规范

第 11 章 关联容器

11.2.1 定义关联容器

11.2.2 关键字类型的要求

11.2.3 pair 类型

11.3.1 关联容器迭代器

11.3.2 添加元素

11.3.3 删除元素

11.3.4 map 的下标操作

11.3.5 访问元素

11.3.6 一个单词转换的 map

第 12 章 动态内存

12.1.1 shared_ptr 类

12.1.2 直接管理内存

12.1.3 shared_ptr 和 new 结合使用

12.1.4 智能指针和异常

12.1.5 unique_ptr

12.1.6 weak_ptr

12.2.1 new 和数组

12.2.2 allocator 类

12.3.1 文本查询程序设计

12.3.2 文本查询程序类的定义

第 13 章 拷贝控制

13.1.1 拷贝构造函数

13.1.2 拷贝赋值运算符

13.1.3 析构函数

13.1.4 三/五法则

13.1.5 使用=default

13.1.6 阻止拷贝

13.2.1 行为像值的类

13.2.2 定义行为像指针的类

13.6.1 右值引用

13.6.2 移动构造函数和移动赋值运算符

13.6.3 右值引用和成员函数

第 14 章 重载运算与类型转换

14.2.1 重载输出运算符 <<

14.2.2 重载输入运算符 >>

14.3.1 相等运算符

14.3.2 关系运算符

14.8.1 lambda 是函数对象

14.8.2 标准库定义的函数对象

14.8.3 可调用对象与 function

14.9.1 类型转换运算符

14.9.2 避免有二义性的类型转换

14.9.3 函数匹配与重载运算符

第 15 章 面向对象程序设计

15.2.1 定义基类

15.2.2 定义派生类

15.2.3 类型转换与继承

15.7.1 虚析构函数

15.7.2 合成拷贝控制与继承

15.7.3 派生类的拷贝控制成员

15.7.4 继承的构造函数

15.8.1 编写 Basket 类

15.9.1 面向对象的解决方案

15.9.2 Query_base 类和 Query 类

15.9.3 派生类

15.9.4 eval 函数

第 16 章 模板与泛型编程

16.1.1 函数模板

16.1.2 类模板

16.1.3 模板参数

16.1.4 成员模板

16.1.5 控制实例化

16.1.6 效率与灵活性

16.2.1 类型转换与模板类型参数

16.2.2 函数模板显式实参

16.2.3 尾置返回类型和类型转换

16.2.4 函数指针和实参推断

16.2.5 模板实参推断和引用

16.2.6 理解 std::move

16.2.7 转发

16.4.1 编写可变参数函数模板

16.4.2 包扩展

16.4.3 转发参数包

第 17 章 标准库特殊设施

17.1.1 定义和初始化 tuple

17.1.2 使用 tuple 返回多个值

17.2.1 定义和初始化 bitset

17.2.2 bitset 操作

17.3.1 使用正则表达式库

17.3.2 匹配与 Regex 迭代器类型

17.3.3 使用子表达式

17.3.4 使用 regex_replace

17.4.1 随机数引擎和分布

17.4.2 其他随机数分布

17.5.1 格式化输入与输出

17.5.2 未格式化的输入/输出操作

17.5.3 流随机访问

第 18 章 用于大型程序的工具

18.1.1 抛出异常

18.1.2 捕获异常

18.1.3 函数 try 语句块与构造函数

18.1.4 异常类层次

18.2.1 命名空间定义

18.2.2 使用命名空间成员

18.2.3 类、命名空间与作用域

18.2.4 重载与命名空间

18.3.1 多重继承

18.3.2 类型转换与多个基类

18.3.3 多重继承下的类作用域

18.3.4 虚继承

18.3.5 构造函数与虚继承

第 19 章 特殊工具与技术

19.1.1 重载 new 和 delete

19.1.2 定位 new 表达式

19.2.1 dynamic_cast 运算符

19.2.2 typeid 运算符

19.2.3 使用 RTTI

19.2.4 type_info 类

19.4.1 数据成员指针

19.4.2 成员函数指针

19.4.3 将成员函数用作可调用对象

19.8.1 位域

19.8.2 violate 限定符

19.8.3 链接指示:extern "C"

附录 A 标准库

待办事项

  • 为附录 A.2A.3 增加内容

License

Shield: CC BY-NC-SA 4.0

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

CC BY-NC-SA 4.0