C++Primer5 练习题
- 书中的示例程序,对应的源文件放在每一章节文件夹下的
examples
子文件夹中 - 书中的练习题,对应的源文件放在每一章节文件夹下的
exercises
子文件夹中 - 收集的一些好玩的 c++ 程序,对应的源文件放在
interesting_cpps
文件夹中
x86_64-w64-mingw32
gcc version 8.1.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project)
如果使用的是 windows 中文系统并且源文件编码格式是 utf-8,则程序在控制台打印中文的时候可能会乱码。这里有两种方法:
- 将源文件编码改为和系统一样的 gbk 编码。
- 在使用 g++ 编译的时候添加一个编译参数
-fexec-charset
来指定代码中字符串的编码,例如
g++ -fexec-charset=gbk -o main .\main.cpp
如果不指定这个参数并且源文件是 utf-8 编码的话,由于控制台使用的是 gbk 编码,所以就导致打印的中文字符乱码。
- 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.1.1 算数类型
- 2.1.2 类型转换
- 2.1.3 字面值常量
- 2.2.1 变量定义
- 2.2.2 变量声明和定义的关系
- 2.2.3 标识符
- 2.2.4 名字的作用域
- 2.3.1 引用
- 2.3.2 指针
- 2.2.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.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.1 定义和初始化内置数组
- 3.5.2 访问数组元素
- 3.5.3 指针和数组
- 3.5.4 C 风格 字符串
- 3.5.5 与旧代码的接口
- 4.1.1 基本概念
- 4.1.2 优先级与结合律
- 4.1.3 求值顺序
-
4.11.1 算数转换
-
4.11.2 其它隐式类型转换
-
4.11.3 显式转换
-
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.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.4.1 重载与作用域
-
6.5.1 默认实参
-
6.5.2 内联函数和 constexpr 函数
-
6.5.3 调试帮助
- 6.6.1 实参类型转换
-
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.1.1 IO 对象无拷贝或赋值
-
8.1.2 条件状态
-
8.1.3 管理输出缓冲
-
8.2.1 使用文件流对象
-
8.2.2 文件模式
-
8.3.1 使用 istringstream
-
8.3.2 使用 ostringsstream
-
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 构造 stirng 的其它方法
-
9.5.2 改变 stirng 的其它方法
-
9.5.3 string 搜索操作
-
9.5.4 compare 函数
-
9.5.5 数值转换
-
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.5.1 5 类迭代器
-
10.5.2 算法形参模式
-
10.5.3 算法命名规范
-
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.1.1 shared_ptr 类
-
12.1.2 直接管理内存
-
12.1.3 shared_ptr 和 new 结合使用
-
12.1.4 智能指针和异常
-
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.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.2.1 重载输出运算符 <<
-
14.2.2 重载输入运算符 >>
-
14.3.1 相等运算符
-
14.3.2 关系运算符
-
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.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.1.1 定义和初始化 tuple
-
17.1.2 使用 tuple 返回多个值
-
17.2.1 定义和初始化 bitset
-
17.2.2 bitset 操作
-
17.3.1 使用正则表达式
-
17.3.2 匹配与 Regexp 迭代器类型
-
17.3.3 使用子表达式
-
17.3.4 使用 regex_replace
-
17.4.1 随机数引擎和分布
-
17.4.2 其它随机数分布
-
17.5.1 格式化输入与输出
-
17.5.2 未格式化的输入输出操作
-
17.5.3 流随机访问
-
18.1.1 抛出异常
-
18.1.2 捕获异常
-
18.1.3 函数 try 语句块与构造函数
-
18.1.4 noexpect 异常说明
-
18.1.5 异常类层次
-
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.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 volatile 限定符
-
19.8.3 链接指示:extern "C"