第1章 概述 1
1.1 C++语言发展历史 1
1.2 一个简单的C++程序 2
1.3 C++程序的开发步骤 3
1.4 开发工具简介 4
1.5 C++标准及开发工具 6
1.6 C++11与C++14新特征 7
1.7 本书组织结构 10
1.8 类型大图及导读 10
第2章 基本类型与变量 13
2.1 关键字和标识符 13
2.1.1 关键字 13
2.1.2 标识符 14
2.1.3 标点符号 15
2.1.4 分隔符与标记 15
2.2 基本类型 15
2.2.1 逻辑型 16
2.2.2 字符型 17
2.2.3 整数型 17
2.2.4 浮点型 18
2.2.5 空类型 19
2.3 字面值 19
2.3.1 逻辑值 19
2.3.2 整型值 19
2.3.3 浮点值 20
2.3.4 字符值 20
2.3.5 字符串值 22
2.4 变量 22
2.4.1 变量的说明 22
2.4.2 变量的初始化 23
2.4.3 auto初始化 23
2.4.4 变量的赋值 24
2.4.5 变量的输入输出 24
2.4.6 命名常量 27
小结 27
练习题 27
第3章 运算符与表达式 29
3.1 基本运算符 29
3.1.1 算术运算符 31
3.1.2 关系运算符 32
3.1.3 逻辑运算符 33
3.1.4 位运算符 34
3.1.5 条件运算符 36
3.1.6 赋值运算符 36
3.1.7 逗号运算符 37
3.1.8 自增自减运算符 37
3.1.9 sizeof运算符 39
3.1.10 typeid运算符 39
3.1.11 其他运算符 40
3.2 表达式 41
3.2.1 左值表达式和右值表达式 41
3.2.2 表达式语句 41
3.2.3 表达式类型与decltype 42
3.3 类型转换 42
3.3.1 自动类型转换 42
3.3.2 赋值类型转换 44
3.3.3 强制类型转换 45
小结 46
练习题 46
第4章 基本语句 49
4.1 语句分类 49
4.2 结构化编程基本结构 49
4.2.1 顺序结构 50
4.2.2 选择结构 50
4.2.3 循环结构 51
4.3 选择语句 52
4.3.1 条件语句 52
4.3.2 switch语句 55
4.4 循环语句 56
4.4.1 while语句 57
4.4.2 do-while语句 58
4.4.3 for语句 59
4.4.4 循环语句的比较 60
4.4.5 循环的嵌套 60
4.5 跳转语句 61
4.5.1 break语句 61
4.5.2 continue语句 62
4.5.3 goto语句与标号语句 63
4.6 综合示例 63
小结 66
练习题 67
第5章 函数和编译预处理 69
5.1 函数基本概念 69
5.1.1 库函数和用户定义函数 69
5.1.2 无参函数和有参函数 69
5.1.3 有返回函数和无返回函数 70
5.2 函数的定义 70
5.2.1 传统函数定义 70
5.2.2 函数定义的要点 71
5.3 函数的调用 72
5.3.1 函数调用的形式 72
5.3.2 函数调用的方式 72
5.3.3 函数调用与以值传递 73
5.4 函数重载 74
5.4.1 重载函数的定义 75
5.4.2 重载函数的调用 75
5.5 嵌套调用和递归调用 76
5.5.1 函数的嵌套调用 76
5.5.2 函数的递归调用 77
5.6 函数原型 82
5.7 auto函数与尾随返回类型 83
5.8 特殊参数 84
5.8.1 带缺省值的形参 84
5.8.2 可变参数 85
5.9 inline函数与constexpr 函数 87
5.9.1 inline函数 87
5.9.2 constexpr函数 87
5.10 作用域 88
5.10.1 局部作用域 88
5.10.2 文件作用域与全局作用域运算符 90
5.10.3 函数原型作用域 90
5.10.4 函数作用域 91
5.11 程序运行期存储区域 91
5.12 存储类 91
5.12.1 static变量与多文件项目 92
5.12.2 extern变量 94
5.12.3 thread_ local变量 95
5.12.4 存储类小结 96
5.13 编译预处理 96
5.13.1 包含文件 97
5.13.2 无参宏 98
5.13.3 有参宏 100
5.13.4 条件编译 103
5.13.5 条件编译示例 104
5.13.6 其他预处理指令 105
小结 106
练习题 107
第6章 数组与字符串 111
6.1 一维数组 111
6.1.1 一维数组的定义 111
6.1.2 一维数组的初始化 112
6.1.3 一维数组的访问 113
6.1.4 基于范围for语句 114
6.1.5 一维数组的应用 115
6.1.6 调用标准算法简化数组编程 119
6.2 二维数组 121
6.2.1 二维数组的定义 121
6.2.2 二维数组的初始化 121
6.2.3 二维数组的应用 122
6.3 数组与函数 124
6.4 容器vector与map 127
6.4.1 vector 127
6.4.2 map 129
6.4.3 初始化列表与统一初始化 131
6.5 字符数组与字符串 132
6.5.1 字符数组的定义 132
6.5.2 字符数组的初始化 133
6.5.3 字符数组的输入输出 134
6.5.4 字符数组的操作 136
6.6 字符串处理函数 137
6.6.1 字符数组处理函数 137
6.6.2 string类型 139
6.6.3 字符串应用示例 140
小结 142
练习题 142
第7章 结构、枚举、联合体 146
7.1 结构 146
7.1.1 结构类型的定义 146
7.1.2 说明结构变量 149
7.1.3 结构变量的初始化 149
7.1.4 结构变量的使用 150
7.1.5 结构的数组 152
7.1.6 结构中的静态成员 155
7.1.7 结构的嵌套定义 157
7.1.8 C++结构的构造函数与成员函数 157
7.2 位域 159
7.2.1 位域的定义 159
7.2.2 位域的使用 161
7.3 枚举 162
7.3.1 枚举类型及枚举变量 162
7.3.2 枚举的使用 163
7.3.3 强类型枚举 165
7.4 联合体 166
7.4.1 联合体类型的定义 166
7.4.2 联合体变量的说明及使用 167
7.4.3 非受限联合体 169
7.5 类型别名typedef与using 170
小结 171
练习题 172
第8章 指针和引用 175
8.1 指针及指针变量 175
8.1.1 指针概念与求址运算 175
8.1.2 指针变量的说明与初始化 177
8.1.3 指针的运算 178
8.1.4 用nullptr替代NULL 182
8.2 指针与结构 182
8.2.1 结构的指针 182
8.2.2 指针作为结构成员 184
8.3 指针与数组 186
8.3.1 用指针访问数组 186
8.3.2 指针与字符串 189
8.3.3 指针的数组 191
8.4 指针与函数 198
8.4.1 指针作为形参 198
8.4.2 函数返回指针 199
8.4.3 函数的指针 200
8.5 void指针与const指针 203
8.5.1 void指针 204
8.5.2 const指针 205
8.6 动态使用内存 206
8.6.1 new运算符 206
8.6.2 delete运算符 208
8.6.3 智能指针与垃圾回收GC 211
8.7 引用 213
8.7.1 左值引用 213
8.7.2 左值引用与数组、指针的关系 214
8.7.3 左值引用与函数 216
8.7.4 指针与左值引用的对比 220
8.7.5 右值引用&& 221
8.7.6 引用类型绑定关系 223
8.7.7 auto推导与decltype推导规则 224
8.8 Lambda表达式 226
8.8.1 语法构造 226
8.8.2 简单用法 228
8.8.3 嵌套L式与高阶函数 229
8.8.4 调用5TL算法 230
小结 231
练习题 232
第9章 类和对象 239
9.1 类 239
9.1.1 类的定义 239
9.1.2 类成员的可见性 241
9.1.3 类的数据成员 242
9.1 4类的成员函数 243
9.1.5 类与结构的区别 246
9.2 对象 247
9.2.1 对象的创建 247
9.2.2 访问对象的成员 248
9.2.3 类与对象的关系 249
9.3 this指针 249
9.4 类中的其他内容 250
小结 251
练习题 251
第10章 类的成员 253
10.1 构造函数 253
10.1.1 构造函数的定义 253
10.1.2 缺省构造函数 254
10.1.3 委托构造函数 254
10.2 析构函数 255
10.3 拷贝构造函数与拷贝赋值函数 257
10.3.1 拷贝构造函数 257
10.3.2 拷贝赋值函数 259
10.3.3 浅拷贝与深拷贝 261
10.3.4 用stnng替代char* 263
10.3.5 转换构造函数 263
10.4 移动构造函数与移动赋值函数 265
10.4.1 移动语义 265
10.4.2 移动构造函数 266
10.4.3 移动赋值函数 267
10.4.4 移动实例分析 267
10.5 特殊成员函数及其显式控制 270
10.5.1 特殊成员函数总结 270
10.5.2 特殊成员函数的显式控制 272
10.6 复合对象与成员对象 274
10.6.1 复合类的构造与析构 274
10.6.2 复合对象设计要点 275
10.7 对象数组 276
10.7.1 定义和使用 276
10.7.2 对象数组作为成员 277
10.8 静态成员 277
10.8.1 静态数据成员 277
10.8.2 静态成员函数 279
10.9 限定符 280
10.9.1 限定符const 280
10.9.2 限定符volatile 282
10.9.3 引用限定符 283
10.10 类成员的指针 284
10.10.1 数据成员的指针 284
10.10.2 成员函数的指针 286
10.11 线程对象thread 287
小结 290
练习题 290
第11章 类的继承 295
11.1 继承与派生 295
11.1.1 基类与派生类 295
11.1.2 派生类的定义与构成 296
11.1.3 继承方式与访问控制 297
11.2 派生类的构造和析构 299
11.2.1 派生类的构造函数 299
11.2.2 派生类继承构造函数 301
11.2.3 派生类的析构过程 302
11.3 二义性问题与支配规则 303
11.3.1 多继承造成的二义性 303
11.3.2 支配规则 304
11.3.3 导入基类成员 305
11.4 虚基类 306
11.4.1 共同基类造成的二义性 306
11.4.2 虚基类的说明 307
11.4.3 虚基类的例子 309
11.5 子类型关系 310
11.6 虚函数 313
11.6.1 虚函数定义和使用 313
11.6.2 成员函数中调用虚函数 316
11.6.3 构造函数中调用虚函数 317
11.6.4 虚析构函数 318
11.6.5 纯虚函数与抽象类 319
11.6.6 final函数与类 321
11.7 标量、平凡、标准布局与POD 322
11.8 字面类型与constexpr对象 324
11.9 继承性设计要点 325
小结 327
练习题 327
第12章 运算符重载 332
12.1 一般运算符重载 332
12.1.1 运算符重载函数 332
12.1.2 双目运算符的重载 333
12.1.3 单目运算符的重载 334
12.2 友元函数实现运算符 336
12.2.1 友元friend 336
12.2.2 友元运算符函数 337
12.2.3 用户定义字面值UDL 339
12.3 特殊运算符重载 341
12.3.1 类型转换函数 341
12.3.2 下标运算符 343
12.3.3 函数调用运算符 344
12.3.4 new/delete运算符 344
小结 345
练习题 346
第13章 模板与STL 348
13.1 模板的概念 348
13.2 函数模板 349
13.2.1 函数模板的定义 349
13.2.2 函数模板的使用 350
13.2.3 函数模板的显式特例化 353
13.2.4 函数模板与有参宏的区别 354
13.2.5 函数模板重载与SFINAE规则 354
13.2.6 模板正确实例化与静态断言 356
13.2.7 带缺省实参的函数模板 357
13.2.8 可变参量的函数模板 359
13.2.9 完美转发与引用折叠规则 360
13.2.10 auto函数推导返回类型 362
13.3 类模板与别名模板 364
13.3.1 类模板的定义 364
13.3.2 类模板的使用 365
13.3.3 显式特例化与部分特例化 368
13.3.4 友元模板 371
13.3.5 类模板的继承 374
13.3.6 带缺省实参的类模板 376
13.3.7 可变参量的类模板 376
13.3.8 嵌套类模板 377
13.3.9 别名模板 378
13.4 标准模板库STL 379
13.4.1 容器概念 379
13.4.2 迭代器 381
13.4.3 容器的共同成员类型和操作 382
13.4.4 算法 383
13.4.5 基于C++11简化编程 385
13.4.6 函数对象 386
13.4.7 vector, deque和list 387
13.4.8 set和multiset 390
13.4.9 map和multimap 393
13.5 命名空间 398
13.5.1 命名空间的定义 398
13.5.2 空间中成员的访问 399
13.5.3 inline命名空间 400
小结 401
练习题 401
第14章 输入输出流 404
14.1 概述 404
14.1.1 流 404
14.1.2 文件 405
14.1.3 缓冲 405
14.2 基本流类 405
14.2.1 基本流类体系 405
14.2.2 预定义标准对象 406
14.2.3 流的格式控制 407
14.2.4 流的错误处理 410
14.3 标准输入/输出 411
14.3.1 cin输入要点 411
14.3.2 输入操作的成员函数 412
14.3.3 cout输出要点 414
14.3.4 输出操作的成员函数 415
14.3.5 重载<<和>>运算符 415
14.4 文件流 416
14.4.1 文件概述 416
14.4.2 文件处理的一般过程 416
14.4.3 文件的打开与关闭 417
14.4.4 文本文件的使用 419
14.4.5 二进制文件的使用 422
14.4.6 文件的随机访问 425
小结 427
练习题 427
第15章 异常 429
15.1 异常的概念 429
15.2 异常类型的架构 431
15.3 异常处理语句 432
15.3.1 throw语句 432
15.3.2 try-catch语句 434
15.3.3 异常处理的例子 436
15.3.4 无异常noexcept 439
15.4 终止处理器 440
15.5 通用属性 441
小结 442
练习题 442
附录A ASCII码表 445
表A.1 常用ASCII码表 445
表A.2 ASCII控制字符 446
附录B 常用库函数 447
表B.1 运行库的功能分类 447
表B.2 运行库头文件 448
表B.3 标准C++头文件 449
表B.4 string类型<string> 450
表B.5 数学函数<math.h> 452
表B.6 C标准库<stdlib.h> 453
表B.7 内存函数<memory.h> 454
表B.8 时间函数<time.h>与<sys/timeb.h> 454
参考文献 456