出版者的话
译者序
前言
第3版前言
第2版前言
第1版前言
第一部分 引言
第1章 致读者 2
1.1 本书结构 2
1.1.1 引言 2
1.1.2 基本特性 3
1.1.3 抽象机制 4
1.1.4 标准库 5
1.1.5 例子和参考文献 5
1.2 C++的设计 7
1.2.1 程序设计风格 8
1.2.2 类型检查 11
1.2.3 C兼容性 12
1.2.4 语言、库和系统 12
1.3 学习C++ 14
1.3.1 用C++编程 15
1.3.2 对C++程序员的建议 16
1.3.3 对C程序员的建议 16
1.3.4 对Java程序员的建议 17
1.4 C++的历史 18
1.4.1 大事年表 19
1.4.2 早期的C++ 19
1.4.3 1998标准 21
1.4.4 2011标准 23
1.4.5 C++的用途 26
1.5 建议 27
1.6 参考文献 28
第2章 C++概览:基础知识 32
2.1 引言 32
2.2 基本概念 33
2.2.1 Hello,World! 33
2.2.2 类型、变量和算术运算 34
2.2.3 常量 36
2.2.4 检验和循环 37
2.2.5 指针、数组和循环 38
2.3 用户自定义类型 40
2.3.1 结构 41
2.3.2 类 42
2.3.3 枚举 43
2.4 模块化 44
2.4.1 分离编译 45
2.4.2 名字空间 46
2.4.3 错误处理 47
2.5 附记 50
2.6 建议 50
第3章 C++概览:抽象机制 51
3.1 引言 51
3.2 类 51
3.2.1 具体类型 52
3.2.2 抽象类型 56
3.2.3 虚函数 58
3.2.4 类层次 59
3.3 拷贝和移动 62
3.3.1 拷贝容器 63
3.3.2 移动容器 64
3.3.3 资源管理 66
3.3.4 抑制操作 66
3.4 模板 67
3.4.1 参数化类型 67
3.4.2 函数模板 69
3.4.3 函数对象 69
3.4.4 可变参数模板 71
3.4.5 别名 72
3.5 建议 73
第4章 C++概览:容器与算法 74
4.1 标准库 74
4.1.1 标准库概述 75
4.1.2 标准库头文件与名字空间 75
4.2 字符串 77
4.3 I/O流 78
4.3.1 输出 78
4.3.2 输入 79
4.3.3 用户自定义类型的I/O 80
4.4 容器 81
4.4.1 vector 81
4.4.2 list 84
4.4.3 map 85
4.4.4 unordered_map 86
4.4.5 容器概述 86
4.5 算法 87
4.5.1 使用迭代器 88
4.5.2 迭代器类型 90
4.5.3 流迭代器 91
4.5.4 谓词 93
4.5.5 算法概述 93
4.5.6 容器算法 94
4.6 建议 94
第5章 C++概览:并发与实用功能 96
5.1 引言 96
5.2 资源管理 96
5.2.1 unique_ptr与shared_ptr 97
5.3 并发 99
5.3.1 任务和thread 99
5.3.2 传递参数 100
5.3.3 返回结果 100
5.3.4 共享数据 101
5.3.5 任务通信 103
5.4 小工具组件 106
5.4.1 时间 106
5.4.2 类型函数 107
5.4.3 pair和tuple 109
5.5 正则表达式 110
5.6 数学计算 111
5.6.1 数学函数和算法 111
5.6.2 复数 111
5.6.3 随机数 112
5.6.4 向量算术 113
5.6.5 数值限制 113
5.7 建议 114
第二部分 基本功能
第6章 类型与声明 116
6.1 ISO C++标准 116
6.1.1 实现 117
6.1.2 基本源程序字符集 118
6.2 类型 118
6.2.1 基本类型 119
6.2.2 布尔值 119
6.2.3 字符类型 121
6.2.4 整数类型 124
6.2.5 浮点数类型 126
6.2.6 前缀和后缀 127
6.2.7 void 128
6.2.8 类型尺寸 128
6.2.9 对齐 130
6.3 声明 131
6.3.1 声明的结构 133
6.3.2 声明多个名字 134
6.3.3 名字 134
6.3.4 作用域 136
6.3.5 初始化 138
6.3.6 推断类型:auto和decltype() 141
6.4 对象和值 144
6.4.1 左值和右值 144
6.4.2 对象的生命周期 145
6.5 类型别名 146
6.6 建议 147
第7章 指针、数组与引用 148
7.1 引言 148
7.2 指针 148
7.2.1 void* 149
7.2.2 nullptr 150
7.3 数组 150
7.3.1 数组的初始化器 152
7.3.2 字符串字面值常量 152
7.4 数组中的指针 155
7.4.1 数组漫游 156
7.4.2 多维数组 158
7.4.3 传递数组 159
7.5 指针与const 161
7.6 指针与所有权 163
7.7 引用 163
7.7.1 左值引用 164
7.7.2 右值引用 167
7.7.3 引用的引用 169
7.7.4 指针与引用 170
7.8 建议 172
第8章 结构、联合与枚举 173
8.1 引言 173
8.2 结构 173
8.2.1 struct的布局 175
8.2.2 struct的名字 176
8.2.3 结构与类 177
8.2.4 结构与数组 178
8.2.5 类型等价 180
8.2.6 普通旧数据 180
8.2.7 域 182
8.3 联合 183
8.3.1 联合与类 185
8.3.2 匿名 186
8.4 枚举 188
8.4.1 enum class 188
8.4.2 普通的enum 191
8.4.3 未命名的enum 192
8.5 建议 193
第9章 语句 194
9.1 引言 194
9.2 语句概述 194
9.3 声明作为语句 195
9.4 选择语句 196
9.4.1 if语句 196
9.4.2 switch语句 198
9.4.3 条件中的声明 200
9.5 循环语句 201
9.5.1 范围for语句 201
9.5.2 for语句 202
9.5.3 while语句 203
9.5.4 do语句 203
9.5.5 退出循环 204
9.6 goto语句 204
9.7 注释与缩进 205
9.8 建议 207
第10章 表达式 208
10.1 引言 208
10.2 一个桌面计算器示例 208
10.2.1 分析器 209
10.2.2 输入 213
10.2.3 底层输入 216
10.2.4 错误处理 217
10.2.5 驱动程序 217
10.2.6 头文件 218
10.2.7 命令行参数 218
10.2.8 关于风格 220
10.3 运算符概述 220
10.3.1 结果 224
10.3.2 求值顺序 224
10.3.3 运算符优先级 225
10.3.4 临时对象 226
10.4 常量表达式 227
10.4.1 符号化常量 229
10.4.2 常量表达式中的const 229
10.4.3 字面值常量类型 229
10.4.4 引用参数 230
10.4.5 地址常量表达式 231
10.5 隐式类型转换 231
10.5.1 提升 231
10.5.2 类型转换 232
10.5.3 常用的算术类型转换 234
10.6 建议 235
第11章 选择适当的操作 236
11.1 其他运算符 236
11.1.1 逻辑运算符 236
11.1.2 位逻辑运算符 236
11.1.3 条件表达式 238
11.1.4 递增与递减 238
11.2 自由存储 240
11.2.1 内存管理 241
11.2.2 数组 243
11.2.3 获取内存空间 244
11.2.4 重载new 245
11.3 列表 247
11.3.1 实现模型 248
11.3.2 限定列表 249
11.3.3 未限定列表 249
11.4 lambda表达式 251
11.4.1 实现模型 251
11.4.2 lambda的替代品 252
11.4.3 捕获 254
11.4.4 调用与返回 257
11.4.5 lambda的类型 257
11.5 显式类型转换 258
11.5.1 构造 259
11.5.2 命名转换 261
11.5.3 C风格的转换 262
11.5.4 函数形式的转换 262
11.6 建议 263
第12章 函数 264
12.1 函数声明 264
12.1.1 为什么使用函数 265
12.1.2 函数声明的组成要件 265
12.1.3 函数定义 266
12.1.4 返回值 267
12.1.5 inline函数 269
12.1.6 constexpr函数 269
12.1.7 [[noreturn]]函数 271
12.1.8 局部变量 272
12.2 参数传递 273
12.2.1 引用参数 273
12.2.2 数组参数 275
12.2.3 列表参数 277
12.2.4 数量未定的参数 278
12.2.5 默认参数 281
12.3 重载函数 282
12.3.1 自动重载解析 283
12.3.2 重载与返回类型 284
12.3.3 重载与作用域 285
12.3.4 多实参解析 285
12.3.5 手动重载解析 286
12.4 前置与后置条件 286
12.5 函数指针 288
12.6 宏 292
12.6.1 条件编译 294
12.6.2 预定义宏 295
12.6.3 编译指令 296
12.7 建议 296
第13章 异常处理 297
13.1 错误处理 297
13.1.1 异常 298
13.1.2 传统的错误处理 299
13.1.3 渐进决策 300
13.1.4 另一种视角看异常 301
13.1.5 何时不应使用异常 302
13.1.6 层次化错误处理 303
13.1.7 异常与效率 304
13.2 异常保障 305
13.3 资源管理 307
13.3.1 finally 310
13.4 强制不变式 311
13.5 抛出与捕获异常 315
13.5.1 抛出异常 315
13.5.2 捕获异常 318
13.5.3 异常与线程 324
13.6 vector的实现 324
13.6.1 一个简单的vector 325
13.6.2 显式地表示内存 328
13.6.3 赋值 331
13.6.4 改变尺寸 332
13.7 建议 335
第14章 名字空间 337
14.1 组合问题 337
14.2 名字空间 338
14.2.1 显式限定 339
14.2.2 using声明 340
14.2.3 using指示 341
14.2.4 参数依赖查找 342
14.2.5 名字空间是开放的 344
14.3 模块化和接口 345
14.3.1 名字空间作为模块 346
14.3.2 实现 348
14.3.3 接口和名字 349
14.4 组合使用名字空间 351
14.4.1 便利性与安全性 351
14.4.2 名字空间别名 352
14.4.3 组合名字空间 352
14.4.4 组合与选择 353
14.4.5 名字空间和重载 354
14.4.6 版本控制 356
14.4.7 名字空间嵌套 358
14.4.8 无名名字空间 359
14.4.9 C头文件 359
14.5 建议 360
第15章 源文件与程序 362
15.1 分离编译 362
15.2 链接 363
15.2.1 文件内名字 365
15.2.2 头文件 366
15.2.3 单一定义规则 368
15.2.4 标准库头文件 369
15.2.5 链接非C++代码 370
15.2.6 链接和函数指针 372
15.3 使用头文件 373
15.3.1 单头文件组织 373
15.3.2 多头文件组织 376
15.3.3 包含保护 380
15.4 程序 381
15.4.1 非局部变量初始化 381
15.4.2 初始化和并发 382
15.4.3 程序终止 383
15.5 建议 384
第三部分 抽象机制
第16章 类 386
16.1 引言 386
16.2 类基础 387
16.2.1 成员函数 388
16.2.2 默认拷贝 389
16.2.3 访问控制 389
16.2.4 class和struct 390
16.2.5 构造函数 391
16.2.6 explicit构造函数 393
16.2.7 类内初始化器 395
16.2.8 类内函数定义 395
16.2.9 可变性 396
16.2.10 自引用 399
16.2.11 成员访问 400
16.2.12 static成员 401
16.2.13 成员类型 403
16.3 具体类 403
16.3.1 成员函数 406
16.3.2 辅助函数 408
16.3.3 重载运算符 410
16.3.4 具体类的重要性 410
16.4 建议 411
第17章 构造、清理、拷贝和移动 413
17.1 引言 413
17.2 构造函数和析构函数 415
17.2.1 构造函数和不变式 415
17.2.2 析构函数和资源 416
17.2.3 基类和成员析构函数 417
17.2.4 调用构造函数和析构函数 418
17.2.5 virtual析构函数 419
17.3 类对象初始化 420
17.3.1 不使用构造函数进行初始化 420
17.3.2 使用构造函数进行初始化 421
17.3.3 默认构造函数 424
17.3.4 初始化器列表构造函数 425
17.4 成员和基类初始化 429
17.4.1 成员初始化 429
17.4.2 基类初始化器 431
17.4.3 委托构造函数 431
17.4.4 类内初始化器 432
17.4.5 static成员初始化 434
17.5 拷贝和移动 435
17.5.1 拷贝 435
17.5.2 移动 441
17.6 生成默认操作 444
17.6.1 显式声明默认操作 444
17.6.2 默认操作 445
17.6.3 使用默认操作 446
17.6.4 使用delete删除的函数 449
17.7 建议 451
第18章 运算符重载 452
18.1 引言 452
18.2 运算符函数 453
18.2.1 二元和一元运算符 454
18.2.2 运算符的预置含义 455
18.2.3 运算符与用户自定义类型 456
18.2.4 传递对象 456
18.2.5 名字空间中的运算符 457
18.3 复数类型 459
18.3.1 成员和非成员运算符 459
18.3.2 混合模式运算 460
18.3.3 类型转换 461
18.3.4 字面值常量 463
18.3.5 访问函数 464
18.3.6 辅助函数 465
18.4 类型转换 466
18.4.1 类型转换运算符 466
18.4.2 explicit类型转换运算符 467
18.4.3 二义性 468
18.5 建议 469
第19章 特殊运算符 471
19.1 引言 471
19.2 特殊运算符 471
19.2.1 取下标 471
19.2.2 函数调用 472
19.2.3 解引用 473
19.2.4 递增和递减 475
19.2.5 分配和释放 477
19.2.6 用户自定义字面值常量 478
19.3 字符串类 481
19.3.1 必备操作 481
19.3.2 访问字符 482
19.3.3 类的表示 483
19.3.4 成员函数 485
19.3.5 辅助函数 487
19.3.6 应用String 489
19.4 友元 490
19.4.1 发现友元 491
19.4.2 友元与成员 492
19.5 建议 493
第20章 派生类 495
20.1 引言 495
20.2 派生类 496
20.2.1 成员函数 498
20.2.2 构造函数和析构函数 499
20.3 类层次 500
20.3.1 类型域 500
20.3.2 虚函数 502
20.3.3 显式限定 504
20.3.4 覆盖控制 505
20.3.5 using基类成员 508
20.3.6 返回类型放松 511
20.4 抽象类 512
20.5 访问控制 514
20.5.1 protected成员 517
20.5.2 访问基类 518
20.5.3 using声明与访问控制 519
20.6 成员指针 520
20.6.1 函数成员指针 520
20.6.2 数据成员指针 522
20.6.3 基类和派生类成员 523
20.7 建议 523
第21章 类层次 524
21.1 引言 524
21.2 设计类层次 524
21.2.1 实现继承 525
21.2.2 接口继承 527
21.2.3 替代实现方式 529
21.2.4 定位对象创建 532
21.3 多重继承 533
21.3.1 多重接口 533
21.3.2 多重实现类 533
21.3.3 二义性解析 535
21.3.4 重复使用基类 538
21.3.5 虚基类 539
21.3.6 重复基类与虚基类 544
21.4 建议 546
第22章 运行时类型信息 547
22.1 引言 547
22.2 类层次导航 547
22.2.1 dynamic_cast 548
22.2.2 多重继承 551
22.2.3 static_cast和dynamic_cast 552
22.2.4 恢复接口 553
22.3 双重分发和访客 557
22.3.1 双重分发 557
22.3.2 访客 559
22.4 构造和析构 561
22.5 类型识别 561
22.5.1 扩展类型信息 563
22.6 RTTI的使用和误用 564
22.7 建议 565
第23章 模板 566
23.1 引言和概述 566
23.2 一个简单的字符串模板 568
23.2.1 定义模板 569
23.2.2 模板实例化 571
23.3 类型检查 571
23.3.1 类型等价 572
23.3.2 错误检测 573
23.4 类模板成员 574
23.4.1 数据成员 574
23.4.2 成员函数 575
23.4.3 成员类型别名 575
23.4.4 static成员 575
23.4.5 成员类型 576
23.4.6 成员模板 577
23.4.7 友元 580
23.5 函数模板 582
23.5.1 函数模板实参 583
23.5.2 函数模板实参推断 584
23.5.3 函数模板重载 586
23.6 模板别名 590
23.7 源码组织 591
23.7.1 链接 593
23.8 建议 594
第24章 泛型程序设计 595
24.1 引言 595
24.2 算法和提升 596
24.3 概念 599
24.3.1 发现概念 599
24.3.2 概念和约束 602
24.4 具体化概念 604
24.4.1 公理 607
24.4.2 多实参概念 607
24.4.3 值概念 608
24.4.4 约束检查 609
24.4.5 模板定义检查 610
24.5 建议 612
第25章 特例化 613
25.1 引言 613
25.2 模板参数和实参 614
25.2.1 类型作为实参 614
25.2.2 值作为实参 615
25.2.3 操作作为实参 616
25.2.4 模板作为实参 618
25.2.5 默认模板实参 619
25.3 特例化 621
25.3.1 接口特例化 623
25.3.2 主模板 624
25.3.3 特例化顺序 625
25.3.4 函数模板特例化 626
25.4 建议 628
第26章 实例化 629
26.1 引言 629
26.2 模板实例化 630
26.2.1 何时需要实例化 630
26.2.2 手工控制实例化 631
26.3 名字绑定 632
26.3.1 依赖性名字 633
26.3.2 定义点绑定 635
26.3.3 实例化点绑定 636
26.3.4 多实例化点 638
26.3.5 模板和名字空间 639
26.3.6 过于激进的ADL 639
26.3.7 来自基类的名字 641
26.4 建议 643
第27章 模板和类层次 645
27.1 引言 645
27.2 参数化和类层次 646
27.2.1 生成类型 647
27.2.2 模板类型转换 649
27.3 类模板层次 650
27.3.1 模板作为接口 651
27.4 模板参数作为基类 652
27.4.1 组合数据结构 652
27.4.2 线性化类层次 655
27.5 建议 660
第28章 元编程 661
28.1 引言 661
28.2 类型函数 663
28.2.1 类型别名 665
28.2.2 类型谓词 666
28.2.3 选择函数 668
28.2.4 萃取 668
28.3 控制结构 670
28.3.1 选择 670
28.3.2 迭代和递归 673
28.3.3 何时使用元编程 674
28.4 条件定义:Enable_if 675
28.4.1 使用Enable_if 676
28.4.2 实现Enable_if 678
28.4.3 Enable_if与概念 678
28.4.4 更多Enable_if例子 679
28.5 一个编译时列表:Tuple 681
28.5.1 一个简单的输出函数 683
28.5.2 元素访问 684
28.5.3 make_tuple 686
28.6 可变参数模板 686
28.6.1 一个类型安全的printf() 687
28.6.2 技术细节 689
28.6.3 转发 691
28.6.4 标准库tuple 692
28.7 国际标准单位例子 694
28.7.1 Unit 695
28.7.2 Quantity 696
28.7.3 Unit字面值常量 697
28.7.4 工具函数 698
28.8 建议 700
第29章 一个矩阵设计 701
29.1 引言 701
29.1.1 Matrix的基本使用 701
29.1.2 对Matrix的要求 703
29.2 Matrix模板 704
29.2.1 构造和赋值 705
29.2.2 下标和切片 706
29.3 Matrix算术运算 708
29.3.1 标量运算 709
29.3.2 加法 710
29.3.3 乘法 711
29.4 Matrix实现 712
29.4.1 slice() 713
29.4.2 Matrix切片 713
29.4.3 Matrix_ref 714
29.4.4 Matrix列表初始化 715
29.4.5 Matrix访问 717
29.4.6 零维Matrix 719
29.5 求解线性方程组 720
29.5.1 经典高斯消去法 721
29.5.2 旋转 722
29.5.3 测试 723
29.5.4 熔合运算 723
29.6 建议 725
· · · · · · (
收起)