图书目录

目录

第1章C++概述/1

1.1计算机与程序的关系/1

1.2C++语言全景/2

1.3二进制编码/3

1.3.1比特与整数的表示(原码、反码、补码)/3

1.3.2小数(浮点数)的二进制表达/4

1.3.3八进制与十六进制/5

习题1/5

第2章第一个C++程序/7

2.1C++程序的基本组成/7

2.1.1注释/8

2.1.2文件包含预处理指令#include/8

2.1.3模块导入import/8

2.1.4main()函数/9

2.1.5输入输出流/9

2.2C++程序的编译和执行/10

2.2.1程序编译/10

2.2.2链接/10

习题2/11

第3章C++语言基础/12

3.1字符集和词法标记/12

3.1.1字符集/12

3.1.2词法标记/133.1.3文本(字面量)/15

3.1.4语句/18

3.2基本数据类型、变量/18

3.2.1基本数据类型/18

3.2.2固定宽度数据类型/20

3.2.3数据类型别名/21

3.2.4字符串类std::string和std::string_view/21

3.2.5变量的定义和使用/24

3.3运算符与表达式/26

3.3.1算术运算符和算术表达式/26

3.3.2赋值运算符/28

3.3.3关系(比较)运算符/29

3.3.4逻辑运算符/31

3.3.5位运算符/32

3.3.6条件运算符、逗号运算符和sizeof运算符/33

3.3.7运算符的优先级和结合性/35

3.3.8隐式类型转换/36

3.3.9显式(强制)类型转换/38

3.4选择结构/39

3.4.1if语句/39

3.4.2ifelse语句/39

3.4.3带初始化语句的if语句(C++23标准)/40

3.4.4constexpr if语句(C++17标准)/41

3.4.5switch语句/41

3.5循环结构/43

3.5.1for循环/43

3.5.2rangefor循环/44

3.5.3while循环/45

3.5.4dowhile循环/46

3.5.5跳转语句/46

3.5.6循环结构的使用/48

3.5.7循环使用例子——计算π的值/48

3.6基本输入输出/49

3.6.1标准输出/49

3.6.2标准输入/49

3.7常量的定义和使用/50

3.7.1宏定义/50

3.7.2const关键字/50

3.7.3constexpr关键字/51

习题3/51

第4章指针和数组/53

4.1C++程序的内存模型/53

4.1.1变量和变量地址/53

4.1.2操作内存地址/55

4.2指针的定义和使用/56

4.2.1指针变量的定义/56

4.2.2指针变量的使用/56

4.2.3指针的类型转换/60

4.3引用的定义和使用/61

4.4数组的定义和使用/62

4.4.1一维数组的定义和使用/62

4.4.2二维数组的定义和使用/64

4.4.3一维数组和二维数组的使用案例/65

4.4.4std::array/65

4.5指针和数组的对偶性/67

4.5.1数组就是指针/67

4.5.2指针的算术运算/68

4.5.3指针和二维数组/69

4.6指针与动态存储分配/70

4.6.1动态存储分配/70

4.6.2动态存储分配存在的问题/72

4.6.3std::vector/73

4.7智能指针/74

4.7.1对象所有权/74

4.7.2unique_ptr——独占所有权的智能指针/74

4.7.3shared_ptr——共享所有权的智能指针/76

4.7.4weak_ptr——弱引用的智能指针/78

4.8字符指针和字符数组/79

4.8.1字符指针/79

4.8.2字符数组/80

习题4/80

第5章函数/82

5.1函数的定义、声明和调用/82

5.1.1函数的定义/825.1.2函数的声明/83

5.1.3函数的调用/85

5.2参数传递/88

5.2.1值传递/88

5.2.2引用传递/89

5.2.3指针传递/89

5.2.4数组作为函数的形参/90

5.3返回值/91

5.3.1返回单个值/91

5.3.2使用std::tuple返回多个值/92

5.3.3返回值类型自动推导/93

5.4函数重载/94

5.5函数递归/95

5.5.1典型的递归应用——汉诺塔问题/96

5.5.2函数递归的优化/97

5.6函数指针/98

5.6.1函数指针的定义/98

5.6.2函数指针的赋值/98

5.6.3通过函数指针调用函数/99

5.6.4函数指针作为函数参数和返回值/99

5.6.5使用std::function代替函数指针/99

5.7Lambda表达式/100

习题5/102

第6章结构体及应用/104

6.1概述/104

6.2结构体类型/105

6.2.1结构体类型的定义/105

6.2.2使用结构体类型/106

6.2.3访问结构体变量的成员/107

6.2.4位域和位向量/109

6.2.5C++对struct关键字的扩展/109

6.3结构体的典型应用——链表/109

6.3.1插入数据创建链表/110

6.3.2链表和数组的区别/111

6.4枚举/112

6.4.1无作用域枚举/112

6.4.2有作用域枚举/113

6.5联合体/113

习题6/114

第7章程序的组织、异常和预处理/116

7.1命名空间/116

7.2变量的作用域和存储期/118

7.2.1变量的作用域/118

7.2.2全局变量和局部变量/119

7.2.3变量的存储期/119

7.3异常处理/121

7.3.1trycatch语句/121

7.3.2throw——抛出异常/122

7.3.3未定义行为/123

7.4预处理指令/124

7.4.1文件包含指令/124

7.4.2宏定义和替换/124

7.4.3条件编译指令/126

7.4.4编译控制指令/126

习题7/127

第8章类与对象/129

8.1面向对象程序设计的基本特点/129

8.2定义和使用类/132

8.2.1类的定义/132

8.2.2使用类——对象/133

8.2.3前置声明/134

8.2.4非静态数据成员/134

8.2.5非静态成员函数/137

8.2.6嵌套类/142

8.2.7类的定义和实现分离/143

8.3类的特殊成员函数/144

8.3.1构造函数/145

8.3.2析构函数/152

8.3.3赋值运算符函数/153

8.3.4类型转换函数/154

8.3.5临时对象/156

8.4类的静态成员/1568.4.1静态数据成员/156

8.4.2静态成员函数/158

8.5友元/158

8.6对象成员/160

8.7类的设计实例/161

8.7.1简单类(学生类)的设计/161

8.7.2复杂类(读取Excel表格)的设计/164

习题8/165

第9章运算符重载/167

9.1运算符重载的定义/167

9.1.1运算符重载的意义和使用场景/167

9.1.2运算符重载的语法/168

9.2单目运算符重载/170

9.3双目运算符重载/172

9.4特殊运算符重载/173

9.4.1operator new和operator delete/173

9.4.2operator++和operator--/173

9.4.3operator[]/175

9.4.4默认比较运算符(C++20标准之后)/175

9.4.5operator=/177

9.4.6operator()/177

9.4.7operator<<和operator>>/177

9.5案例——大整数类/178

9.5.1类的目标和设计/178

9.5.2示例代码(仅类定义,实现不完整)/179

习题9/181

第10章继承和多态/183

10.1类之间的关系/183

10.2派生类的定义和使用/186

10.2.1派生类的定义/186

10.2.2继承方式/189

10.2.3使用派生类/190

10.3派生类的构造函数和析构函数/195

10.3.1构造函数的调用方法/195

10.3.2基类构造函数的链式调用/19610.3.3using声明和继承构造函数/197

10.3.4复制构造函数/198

10.3.5析构函数/199

10.3.6delete基类构造函数和析构函数/199

10.4重复继承和虚基类/200

10.4.1重复(菱形、钻石)继承/200

10.4.2虚基类/200

10.4.3虚基类和虚基类共存规则/201

10.4.4虚基类构造函数的调用/201

10.5虚函数和多态/203

10.5.1编译时多态/203

10.5.2运行时多态/204

10.5.3多态的实现机制(扩展)/207

10.6纯虚函数和抽象类/208

10.6.1纯虚函数/208

10.6.2抽象类/208

10.7案例/209

10.7.1高斯消元法求解线性方程/209

10.7.2图形类及其派生类/212

习题10/213

第11章泛型编程和模板/215

11.1泛型编程和模板 /215

11.1.1泛型编程/215

11.1.2模板/216

11.2函数模板 /217

11.2.1函数模板的定义/218

11.2.2函数模板的显式实例化/219

11.2.3函数模板的隐式实例化/221

11.3类模板/222

11.3.1类模板的定义/222

11.3.2类模板的实例化/224

11.3.3CTAD——类模板参数的自动推导(C++17标准

之后)/225

11.3.4类模板的特化/227

11.3.5类模板的继承/229

11.3.6成员模板/231

11.3.7CRTP——奇异递归模式/236

11.4概念和概念库(C++20标准之后)/238

11.4.1概念中的约束/239

11.4.2概念/240

11.4.3标准库中的类型工具/244

11.4.4概念库中的预定义概念/246

11.5类模板案例/248

习题11/251

第12章输入与输出/253

12.1输入输出流的概念和结构/253

12.1.1流的概念/253

12.1.2流和缓冲区/254

12.1.3预定义的标准输入输出流对象/255

12.2流输入与输出/255

12.2.1格式化输入输出/255

12.2.2无格式输入输出/260

12.2.3cin和cout的重定向/262

12.2.4缓冲区操作/262

12.3文件流/264

12.3.1常用的文件类成员/264

12.3.2文本文件读写/266

12.3.3二进制文件读写/267

12.4其他类型的输入输出/268

12.4.1字符串流/268

12.4.2文件系统(C++17标准之后)/268

12.4.3同步输出流(C++20标准之后)/271

12.4.4打印函数(C++23标准之后)/272

习题12/273

第13章标准模板库和范围/275

13.1STL介绍 /275

13.2STL容器类/276

13.2.1顺序容器/277

13.2.2有序关联容器/281

13.2.3无序关联容器/286

13.2.4容器适配器/287

13.2.5容器视图/287

13.3STL迭代器/290

13.3.1标准迭代器/291

13.3.2流迭代器/293

13.4STL算法/295

13.4.1算法示例——copy和copy_if/295

13.4.2不修改序列的算法(批量操作、查找)/298

13.4.3修改序列的算法/299

13.4.4排序、查找和集合算法/300

13.4.5算法使用案例——学生成绩管理系统/301

13.5范围库/301

13.5.1范围的概念和定义/302

13.5.2视图和可视图化范围/304

13.5.3范围适配器/305

13.5.4受约束算法/309

习题13/311

第14章多线程和协程/314

14.1相关基本概念/314

14.1.1并发/314

14.1.2进程/315

14.1.3线程/315

14.1.4协程/317

14.1.5概念总结/318

14.2线程管理/318

14.2.1创建并启动线程/318

14.2.2线程的加入和分离/320

14.2.3自动加入(join)的线程(jthread) ——C++20标准/321

14.3协程(C++20标准)/322

习题14/324

参考文献/325