商品详情
书名:C++程序设计语言:第4版:上、下册
定价:249.8
ISBN:9787115666147
作者:[丹]比亚内·斯特劳斯特鲁普(Bjarne Stroustrup)
版次:第1版
出版时间:2026-01
内容提要:
C++是一种通用程序设计语言。本书*介绍C++11标准,涵盖了C++的发展历程、设计理念、学习方法及新特性等内容。第1篇(第1~5章)包括C++的背景知识、C++语言及其标准库的简要介绍;第2篇(第6~15章)介绍C++的内置类型、基本特性及如何用它们构造程序;第3篇(第16~29章)介绍C++的抽象机制及如何用这些机制编写面向对象程序和泛型程序;第4篇(第30~44章)概述标准库并讨论一些兼容性问题。本书从基本原理、规范等方面充分讲解C++的语言特性和标准库组件,并给出丰富的例子,为专业程序员提供*的C++知识体系。 本书可作为高等院校编程语言和C++相关课程的教材,也适合C++程序设计人员阅读。
作者简介:
比亚内?斯特劳斯特鲁普(Bjarne Stroustrup),C++ 语言的设计者和*初实现者,《C++ 程序设计语言》及《C++ 程序设计原理与实践》等多部图书作者。曾任职于贝尔实验室、美国电话电报公司 (AT&T) 研究实验室、得克萨斯农工大学及摩根士丹利纽约总部,于 2022 年退休。 Stroustrup 曾荣获多项荣誉,包括 2018 年美国国家工程院查尔斯?斯塔克?德雷珀奖,以表彰他 “对 C++ 语言的构思与开发”。此外,Stroustrup 还是美国国家工程院院士、AT&T 会士、AT&T 贝尔实验室会士、电气电子工程师学会 (IEEE) 会士以及美国计算机协会 (ACM) 会士,并于 2013 年入选《电子设计》杂志的工程名人堂。 Stroustrup 的研究领域包括分布式系统、仿真、设计、编程技术、软件开发工具和编程语言等,同时积极参与 C++ 的 ANSI/ISO 标准化工作。 Stroustrup 拥有丹麦奥胡斯大学的硕士学位,以及英国剑桥大学的计算机科学博士学位。
目录:
上册
第 1篇 引言
第 1章 致读者 2
1.1 本书结构 2
1.1.1 导言 2
1.1.2 基本特性 3
1.1.3 抽象机制 3
1.1.4 标准库 4
1.1.5 示例和参考文献 4
1.2 C++的设计 5
1.2.1 编程风格 6
1.2.2 类型检查 8
1.2.3 C语言兼容性 9
1.2.4 语言、库和系统 9
1.3 学习C++ 10
1.3.1 用C++编程 11
1.3.2 对C++程序员的建议 12
1.3.3 对C程序员的建议 12
1.3.4 对Java程序员的建议 13
1.4 C++的发展历程 14
1.4.1 大事年表 14
1.4.2 早期的C++ 15
1.4.3 1998标准 16
1.4.4 2011标准 17
1.4.5 C++的用途 19
1.5 建议 20
1.6 参考资料 21
第 2章 C++之旅:基础知识 24
2.1 导言 24
2.2 基础知识 24
2.2.1 Hello, World! 25
2.2.2 类型、变量和算术运算 26
2.2.3 常量 28
2.2.4 测试和循环 28
2.2.5 指针、数组和循环 29
2.3 用户自定义类型 31
2.3.1 结构体 31
2.3.2 类 32
2.3.3 枚举 33
2.4 模块化 34
2.4.1 单独编译 35
2.4.2 命名空间 36
2.4.3 错误处理 37
2.5 后记 39
2.6 建议 39
第3章 C++之旅:抽象机制 40
3.1 导言 40
3.2 类 40
3.2.1 具体类型 41
3.2.2 抽象类型 44
3.2.3 虚函数 46
3.2.4 类层次结构 46
3.3 复制和移动 50
3.3.1 复制容器 50
3.3.2 移动容器 51
3.3.3 资源管理 53
3.3.4 禁用操作 53
3.4 模板 54
3.4.1 参数化类型 54
3.4.2 函数模板 55
3.4.3 函数对象 56
3.4.4 可变参数模板 58
3.4.5 别名 58
3.5 建议 59
第4章 C++之旅:容器和算法 60
4.1 库 60
4.1.1 标准库概述 60
4.1.2 标准库头文件和命名空间 61
4.2 字符串 62
4.3 I/O流 63
4.3.1 输出 63
4.3.2 输入 64
4.3.3 用户自定义类型I/O 65
4.4 容器 66
4.4.1 vector 66
4.4.2 list 68
4.4.3 map 69
4.4.4 unordered_map 70
4.4.5 容器概述 70
4.5 算法 71
4.5.1 使用迭代器 72
4.5.2 迭代器类型 73
4.5.3 流迭代器 74
4.5.4 谓词 75
4.5.5 算法概述 76
4.5.6 容器算法 76
4.6 建议 77
第5章 C++之旅:并发与实用工具 78
5.1 导言 78
5.2 资源管理 78
5.2.1 unique_ptr和shared_ptr 79
5.3 并发处理 80
5.3.1 任务和线程 80
5.3.2 传递参数 81
5.3.3 返回结果 82
5.3.4 共享数据 82
5.3.5 任务间通信 84
5.4 小型实用组件 86
5.4.1 时间处理 87
5.4.2 类型函数 87
5.4.3 对组和元组 89
5.5 正则表达式 90
5.6 数值计算 90
5.6.1 数学函数和算法 90
5.6.2 复数 91
5.6.3 随机数 91
5.6.4 向量运算 92
5.6.5 数值限制 93
5.7 建议 93
第 2篇 基本特征
第6章 类型和声明 96
6.1 ISO C++标准 96
6.1.1 实现 97
6.1.2 基本源代码字符集 97
6.2 类型 97
6.2.1 基本类型 98
6.2.2 布尔类型 98
6.2.3 字符类型 99
6.2.4 整数类型 102
6.2.5 浮点类型 104
6.2.6 前缀和后缀 104
6.2.7 void 105
6.2.8 大小 105
6.2.9 对齐 107
6.3 声明 107
6.3.1 声明的结构 109
6.3.2 声明多个名称 110
6.3.3 名称 110
6.3.4 作用域 111
6.3.5 初始化 113
6.3.6 类型推断:auto和decltype() 116
6.4 对象与值 118
6.4.1 左值与右值 118
6.4.2 对象的生命周期 118
6.5 类型别名 119
6.6 建议 120
第7章 指针、数组与引用 121
7.1 导言 121
7.2 指针 121
7.2.1 void* 122
7.2.2 nullptr 122
7.3 数组 123
7.3.1 数组初始化器 124
7.3.2 字符串字面量 124
7.4 指针与数组 127
7.4.1 访问数组 127
7.4.2 多维数组 129
7.4.3 传递数组 130
7.5 指针与const 131
7.6 指针与所有权 133
7.7 引用 133
7.7.1 左值引用 134
7.7.2 右值引用 137
7.7.3 引用的引用 139
7.7.4 指针与引用 139
7.8 建议 141
第8章 结构体、联合体与枚举 142
8.1 导言 142
8.2 结构体 142
8.2.1 struct的布局 143
8.2.2 struct的名称 144
8.2.3 结构体与类 145
8.2.4 结构体与数组 146
8.2.5 类型等价 148
8.2.6 普通旧数据 149
8.2.7 域 150
8.3 联合体 151
8.3.1 联合体与类 152
8.3.2 匿名union 153
8.4 枚举 155
8.4.1 enum class 155
8.4.2 普通enum 158
8.4.3 未命名enum 159
8.5 建议 159
第9章 语句 160
9.1 导言 160
9.2 语句概述 160
9.3 声明作为语句 161
9.4 选择语句 162
9.4.1 if语句 162
9.4.2 switch语句 163
9.4.3 条件中的声明 165
9.5 循环语句 166
9.5.1 范围for语句 166
9.5.2 for语句 167
9.5.3 while语句 168
9.5.4 do语句 168
9.5.5 循环退出 168
9.6 goto语句 169
9.7 注释与缩进 169
9.8 建议 171
第 10章 表达式 172
10.1 导言 172
10.2 桌面计算器示例 172
10.2.1 语法分析器 172
10.2.2 输入 176
10.2.3 底层输入 179
10.2.4 错误处理 179
10.2.5 驱动程序 180
10.2.6 头文件 180
10.2.7 命令行参数 181
10.2.8 编程风格 182
10.3 运算符概述 182
10.3.1 结果 185
10.3.2 求值顺序 186
10.3.3 运算符优先级 186
10.3.4 临时对象 187
10.4 常量表达式 188
10.4.1 符号常量 189
10.4.2 常量表达式中的const 189
10.4.3 字面量类型 190
10.4.4 引用参数 190
10.4.5 地址常量表达式 191
10.5 隐式类型转换 191
10.5.1 提升 191
10.5.2 类型转换 192
10.5.3 常规算术类型转换 194
10.6 建议 194
第 11章 选择操作 195
11.1 其他运算符 195
11.1.1 逻辑运算符 195
11.1.2 位逻辑运算符 195
11.1.3 条件表达式 196
11.1.4 递增与递减 197
11.2 自由存储区 198
11.2.1 内存管理 199
11.2.2 数组 201
11.2.3 获取内存空间 202
11.2.4 重载new 203
11.3 列表 204
11.3.1 实现模型 205
11.3.2 限定列表 206
11.3.3 未限定列表 206
11.4 lambda表达式 208
11.4.1 实现模型 208
11.4.2 lambda的替代 209
11.4.3 捕获 210
11.4.4 调用与返回 212
11.4.5 lambda的类型 213
11.5 显式类型转换 213
11.5.1 构造 214
11.5.2 命名转换 216
11.5.3 C风格转换 217
11.5.4 函数风格转换 217
11.6 建议 217
第 12章 函数 218
12.1 函数声明 218
12.1.1 为什么使用函数 218
12.1.2 函数声明的组成 219
12.1.3 函数定义 219
12.1.4 返回值 220
12.1.5 inline函数 222
12.1.6 constexpr函数 222
12.1.7 带有[[noreturn]]的函数 224
12.1.8 局部变量 224
12.2 参数传递 225
12.2.1 引用参数 226
12.2.2 数组参数 227
12.2.3 列表参数 228
12.2.4 未定数量的参数 230
12.2.5 默认参数 232
12.3 重载函数 233
12.3.1 自动重载解析 234
12.3.2 重载与返回类型 235
12.3.3 重载与作用域 235
12.3.4 多实参解析 236
12.3.5 手动重载解析 236
12.4 前置与后置条件 237
12.5 函数指针 238
12.6 宏 241
12.6.1 条件编译 244
12.6.2 预定义宏 244
12.6.3 编译指令 245
12.7 建议 245
第 13章 异常处理 246
13.1 错误处理 246
13.1.1 异常 246
13.1.2 传统的错误处理 247
13.1.3 应付过去 248
13.1.4 异常的替代观点 249
13.1.5 何时不能使用异常 249
13.1.6 层次化错误处理 250
13.1.7 异常与效率 251
13.2 异常保证 252
13.3 资源管理 253
13.3.1 finally 256
13.4 强制不变式 257
13.5 抛出和捕获异常 260
13.5.1 抛出异常 260
13.5.2 捕获异常 263
13.5.3 异常与线程 268
13.6 vector的实现 268
13.6.1 一个简单的vector 268
13.6.2 显式表示内存 271
13.6.3 赋值 273
13.6.4 改变大小 275
13.7 建议 277
第 14章 命名空间 278
14.1 组合问题 278
14.2 命名空间 279
14.2.1 显式限定 280
14.2.2 using声明 281
14.2.3 using指令 282
14.2.4 参数依赖查找 283
14.2.5 命名空间是开放的 284
14.3 模块化与接口 285
14.3.1 命名空间作为模块 286
14.3.2 实现 287
14.3.3 接口和实现 289
14.4 使用命名空间组合代码 290
14.4.1 便利性与*性 290
14.4.2 命名空间别名 291
14.4.3 组合命名空间 291
14.4.4 组合与选择 292
14.4.5 命名空间与重载 293
14.4.6 版本控制 295
14.4.7 嵌套命名空间 297
14.4.8 未命名命名空间 297
14.4.9 C头文件 298
14.5 建议 299
第 15章 源文件与程序 300
15.1 单独编译 300
15.2 链接 301
15.2.1 文件局部名称 303
15.2.2 头文件 303
15.2.3 单一定义规则 304
15.2.4 标准库头文件 306
15.2.5 链接非C++代码 307
15.2.6 链接与函数指针 308
15.3 使用头文件 309
15.3.1 单头文件组织 309
15.3.2 多头文件组织 312
15.3.3 包含保护 315
15.4 程序 316
15.4.1 非局部变量初始化 316
15.4.2 初始化与并发 317
15.4.3 程序终止 317
15.5 建议 318
第3篇 抽象机制
第 16章 类 320
16.1 导言 320
16.2 类的基本概念 321
16.2.1 成员函数 321
16.2.2 默认复制 322
16.2.3 访问控制 322
16.2.4 类和结构体 323
16.2.5 构造函数 324
16.2.6 显式构造函数 326
16.2.7 类内初始化器 328
16.2.8 类内函数定义 328
16.2.9 可变性 329
16.2.10 自引用 331
16.2.11 成员访问 333
16.2.12 静态成员 334
16.2.13 成员类型 335
16.3 具体类 336
16.3.1 成员函数 338
16.3.2 辅助函数 340
16.3.3 重载运算符 341
16.3.4 具体类的意义 342
16.4 建议 343
第 17章 构造、清理、复制和移动 344
17.1 导言 344
17.2 构造函数和析构函数 345
17.2.1 构造函数和不变式 346
17.2.2 析构函数和资源 347
17.2.3 基类和成员析构函数 348
17.2.4 调用构造函数和析构函数 348
17.2.5 虚析构函数 349
17.3 类对象初始化 350
17.3.1 不使用构造函数进行初始化 350
17.3.2 使用构造函数进行初始化 351
17.3.3 默认构造函数 353
17.3.4 初始化器列表构造函数 355
17.4 成员初始化和基类初始化 358
17.4.1 成员初始化 359
17.4.2 基类初始化器 360
17.4.3 委托构造函数 360
17.4.4 类内初始化器 361
17.4.5 static成员初始化 363
17.5 复制和移动 364
17.5.1 复制 364
17.5.2 移动 369
17.6 生成默认操作 372
17.6.1 显式声明默认操作 372
17.6.2 默认操作 373
17.6.3 使用默认操作 373
17.6.4 使用delete删除的函数 376
17.7 建议 378
第 18章 运算符重载 379
18.1 导言 379
18.2 运算符函数 380
18.2.1 二元和一元运算符 381
18.2.2 运算符的预置含义 382
18.2.3 运算符和用户自定义类型 382
18.2.4 传递对象 383
18.2.5 命名空间中的运算符 383
18.3 复数类型 385
18.3.1 成员和非成员运算符 385
18.3.2 混合模式运算 386
18.3.3 类型转换 387
18.3.4 字面量 389
18.3.5 访问函数 390
18.3.6 辅助函数 390
18.4 类型转换 391
18.4.1 类型转换运算符 391
18.4.2 显式类型转换运算符 393
18.4.3 歧义 393
18.5 建议 394
第 19章 特殊运算符 396
19.1 导言 396
19.2 特殊运算符 396
19.2.1 取下标 396
19.2.2 函数调用 397
19.2.3 解引用 398
19.2.4 自增和自减 400
19.2.5 分配和释放 401
19.2.6 用户自定义字面量 402
19.3 字符串类 405
19.3.1 基本操作 405
19.3.2 访问字符 406
19.3.3 类的表示 407
19.3.4 成员函数 409
19.3.5 辅助函数 410
19.3.6 应用String 412
19.4 友元 413
19.4.1 发现友元 414
19.4.2 友元与成员 415
19.5 建议 416
第 20章 派生类 417
20.1 导言 417
20.2 派生类 418
20.2.1 成员函数 419
20.2.2 构造函数和析构函数 420
20.3 类层次结构 421
20.3.1 类型域 421
20.3.2 虚函数 423
20.3.3 显式限定 425
20.3.4 覆盖控制 425
20.3.5 using基类成员 428
20.3.6 返回类型放宽 431
20.4 抽象类 432
20.5 访问控制 434
20.5.1 受保护成员 436
20.5.2 访问基类 437
20.5.3 using声明和访问控制 438
20.6 成员指针 439
20.6.1 函数成员指针 439
20.6.2 数据成员指针 441
20.6.3 基类和派生类成员 441
20.7 建议 442
第 21章 类层次结构 443
21.1 导言 443
21.2 类层次结构的设计 443
21.2.1 实现继承 443
21.2.2 接口继承 446
21.2.3 替代实现 447
21.2.4 定位对象创建 450
21.3 多重继承 451
21.3.1 多重接口 451
21.3.2 多重实现类 451
21.3.3 *歧义 453
21.3.4 重复使用基类 455
21.3.5 虚基类 456
21.3.6 重复基类与虚基类 460
21.4 建议 462
下册
第 22章 运行时类型信息 463
22.1 导言 463
22.2 类层次结构导航 463
22.2.1 dynamic_cast 464
22.2.2 多重继承 466
22.2.3 static_cast和dynamic_cast 467
22.2.4 恢复接口 468
22.3 双重分发和访问者 471
22.3.1 双重分发 472
22.3.2 访问者 473
22.4 构造和析构 475
22.5 类型识别 475
22.5.1 扩展类型信息 477
22.6 RTII的使用和误用 478
22.7 建议 479
第 23章 模板 480
23.1 介绍与概述 480
23.2 一个简单字符串模板 481
23.2.1 定义模板 483
23.2.2 模板实例化 484
23.3 类型检查 484
23.3.1 类型等价性 485
23.3.2 错误检测 486
23.4 类模板成员 487
23.4.1 数据成员 487
23.4.2 成员函数 487
23.4.3 成员类型别名 487
23.4.4 静态成员 488
23.4.5 成员类型 488
23.4.6 成员模板 489
23.4.7 友元 492
23.5 函数模板 493
23.5.1 函数模板实参 495
23.5.2 函数模板实参推断 496
23.5.3 函数模板重载 498
23.6 模板别名 501
23.7 源代码组织 502
23.7.1 链接 503
23.8 建议 504
第 24章 泛型编程 505
24.1 导言 505
24.2 算法和提升 506
24.3 概念 508
24.3.1 探索概念 509
24.3.2 概念和约束 511
24.4 具体化概念 512
24.4.1 公理 514
24.4.2 多实参概念 515
24.4.3 值概念 516
24.4.4 约束检查 517
24.4.5 模板定义检查 517
24.5 建议 519
第 25章 特化 520
25.1 导言 520
25.2 模板形参和实参 520
25.2.1 类型作为实参 521
25.2.2 值作为实参 522
25.2.3 操作作为实参 523
25.2.4 模板作为实参 525
25.2.5 默认模板实参 525
25.3 特化 527
25.3.1 接口特化 528
25.3.2 主模板 530
25.3.3 特化顺序 531
25.3.4 函数模板特化 531
25.4 建议 533
第 26章 实例化 534
26.1 导言 534
26.2 模板实例化 534
26.2.1 何时需要实例化 535
26.2.2 手动控制实例化 536
26.3 名称绑定 537
26.3.1 依赖名称 538
26.3.2 定义点绑定 539
26.3.3 实例化点绑定 540
26.3.4 多实例化点 542
26.3.5 模板和命名空间 543
26.3.6 过于激进的ADL 543
26.3.7 来自基类的名称 545
26.4 建议 547
第 27章 模板和层次结构 548
27.1 导言 548
27.2 参数化和层次结构 548
27.2.1 生成类型 550
27.2.2 模板类型转换 551
27.3 类模板层次结构 552
27.3.1 模板作为接口 553
27.4 模板参数作为基类 553
27.4.1 组合数据结构 554
27.4.2 线性化类层次结构 557
27.5 建议 561
第 28章 元编程 562
28.1 导言 562
28.2 类型函数 563
28.2.1 类型别名 565
28.2.2 类型谓词 566
28.2.3 选择函数 567
28.2.4 萃取 568
28.3 控制结构 569
28.3.1 选择 569
28.3.2 迭代和递归 572
28.3.3 何时使用元编程 573
28.4 条件定义:Enable_if 573
28.4.1 使用Enable_if 575
28.4.2 实现Enable_if 576
28.4.3 Enable_if和概念 576
28.4.4 更多Enable_if示例 577
28.5 编译时列表: Tuple 579
28.5.1 一个简单的输出函数 580
28.5.2 元素访问 581
28.5.3 make_tuple 584
28.6 可变参数模板 584
28.6.1 一个类型*的printf() 584
28.6.2 技术细节 586
28.6.3 转发 587
28.6.4 标准库tuple 588
28.7 国际标准单位示例 591
28.7.1 Unit 591
28.7.2 Quantity 592
28.7.3 Unit字面量 594
28.7.4 实用函数 594
28.8 建议 596
第 29章 矩阵设计 597
29.1 导言 597
29.1.1 基本矩阵用途 597
29.1.2 矩阵要求 599
29.2 矩阵模板 599
29.2.1 构造和赋值 600
29.2.2 下标和切片 602
29.3 矩阵算术运算 604
29.3.1 标量运算 604
29.3.2 加法 605
29.3.3 乘法 606
29.4 矩阵实现 607
29.4.1 slice() 607
29.4.2 矩阵切片 608
29.4.3 Matrix_ref 609
29.4.4 矩阵列表初始化 610
29.4.5 矩阵访问 612
29.4.6 *维矩阵 614
29.5 解线性方程 614
29.5.1 *高斯消元法 615
29.5.2 主元选取 616
29.5.3 测试 616
29.5.4 熔合运算 617
29.6 建议 619
第4篇 标准库
第30章 标准库概览 622
30.1 导言 622
30.1.1 标准库设施 622
30.1.2 设计约束 623
30.1.3 描述风格 624
30.2 头文件 624
30.3 语言支持 628
30.3.1 initializer_list支持 628
30.3.2 范围for支持 629
30.4 错误处理 629
30.4.1 异常 629
30.4.2 断言 632
30.4.3 system_error 633
30.5 建议 640
第31章 STL容器 642
31.1 导言 642
31.2 容器概览 642
31.2.1 容器表示 644
31.2.2 元素要求 645
31.3 操作概览 647
31.3.1 成员类型 649
31.3.2 构造函数、析构函数和赋值操作 650
31.3.3 大小和容量 651
31.3.4 迭代器 651
31.3.5 元素访问 652
31.3.6 栈操作 653
31.3.7 列表操作 653
31.3.8 其他操作 654
31.4 容器 654
31.4.1 vector 654
31.4.2 链表 657
31.4.3 关联容器 659
31.5 容器适配器 667
31.5.1 stack 668
31.5.2 queue 669
31.5.3 priority_queue 669
31.6 建议 670
第32章 STL算法 672
32.1 导言 672
32.2 算法 672
32.2.1 序列 672
32.3 策略实参 674
32.3.1 复杂度 675
32.4 不修改序列的算法 675
32.4.1 for_each() 675
32.4.2 序列谓词 676
32.4.3 count() 676
32.4.4 find() 676
32.4.5 equal()和mismatch() 677
32.4.6 search() 678
32.5 修改序列的算法 678
32.5.1 copy() 679
32.5.2 unique() 679
32.5.3 remove()和replace() 680
32.5.4 rotate()、random_shuffle()和partition() 681
32.5.5 排列 682
32.5.6 fill() 682
32.5.7 swap() 683
32.6 排序和搜索 683
32.6.1 二分搜索 685
32.6.2 merge() 686
32.6.3 集合算法 687
32.6.4 堆 688
32.6.5 lexicographical_compare() 688
32.7 *小值和*值 689
32.8 建议 690
第33章 STL迭代器 691
33.1 导言 691
33.1.1 迭代器模型 691
33.1.2 迭代器类别 692
33.1.3 迭代器萃取 693
33.1.4 迭代器操作 695
33.2 迭代器适配器 696
33.2.1 反向迭代器 696
33.2.2 插入迭代器 698
33.2.3 移动迭代器 699
33.3 范围访问函数 699
33.4 函数对象 700
33.5 函数适配器 701
33.5.1 bind() 701
33.5.2 mem_fn() 703
33.5.3 function 703
33.6 建议 705
第34章 内存和资源 706
34.1 导言 706
34.2 “拟容器” 706
34.2.1 array 707
34.2.2 bitset 709
34.2.3 vector
712
34.2.4 元组 713
34.3 资源管理指针 716
34.3.1 unique_ptr 716
34.3.2 shared_ptr 719
34.3.3 weak_ptr 721
34.4 分配器 723
34.4.1 默认分配器 724
34.4.2 分配器萃取 725
34.4.3 指针萃取 726
34.4.4 限域的分配器 726
34.5 垃圾收集接口 728
34.6 未初始化内存 730
34.6.1 临时缓冲区 730
34.6.2 raw_storage_iterator 730
34.7 建议 731
第35章 工具 732
35.1 导言 732
35.2 时间 732
35.2.1 duration 733
35.2.2 time_point 735
35.2.3 时钟 736
35.2.4 时间萃取 737
35.3 编译时有理数运算 738
35.4 类型函数 739
35.4.1 类型萃取 739
35.4.2 类型生成器 742
35.5 更多工具 746
35.5.1 move()和forward() 747
35.5.2 swap() 747
35.5.3 关系运算符 748
35.5.4 比较和哈希type_info 749
35.6 建议 749
第36章 字符串 750
36.1 导言 750
36.2 字符分类 750
36.2.1 分类函数 750
36.2.2 字符萃取 751
36.3 字符串 752
36.3.1 string与C风格字符串 753
36.3.2 构造函数 754
36.3.3 基本操作 755
36.3.4 字符串I/O 756
36.3.5 数值转换 757
36.3.6 类STL操作 758
36.3.7 find系列函数 760
36.3.8 子串 761
36.4 建议 762
第37章 正则表达式 763
37.1 正则表达式 763
37.1.1 正则表达式表示法 764
37.2 regex 767
37.2.1 匹配结果 768
37.2.2 格式化 771
37.3 正则表达式函数 771
37.3.1 regex_match() 772
37.3.2 regex_search() 773
37.3.3 regex_replace() 774
37.4 正则表达式迭代器 775
37.4.1 regex_iterator 775
37.4.2 regex_token_iterator 776
37.5 regex_traits 778
37.6 建议 778
第38章 I/O流 779
38.1 导言 779
38.2 I/O流层次结构 781
38.2.1 文件流 781
38.2.2 字符串流 782
38.3 错误处理 784
38.4 I/O操作 785
38.4.1 输入操作 785
38.4.2 输出操作 788
38.4.3 操纵符 789
38.4.4 流状态 790
38.4.5 格式化 794
38.5 流迭代器 799
38.6 缓冲 800
38.6.1 输出流和缓冲区 802
38.6.2 输入流和缓冲区 803
38.6.3 缓冲区迭代器 804
38.7 建议 805
第39章 区域设置 807
39.1 处理文化差异 807
39.2 locale类 809
39.2.1 命名的locale 810
39.2.2 string的比较 813
39.3 facet类 813
39.3.1 访问locale中的facet 814
39.3.2 一个简单的用户自定义facet 815
39.3.3 locale和facet的使用 817
39.4 标准facet 817
39.4.1 string的比较 819
39.4.2 数值格式化 821
39.4.3 货币格式化 825
39.4.4 日期和时间格式化 829
39.4.5 字符分类 831
39.4.6 字符编码转换 834
39.4.7 消息 837
39.5 便利接口 840
39.5.1 字符分类 840
39.5.2 字符转换 841
39.5.3 字符串转换 841
39.5.4 缓冲区转换 842
39.6 建议 843
第40章 数值 844
40.1 导言 844
40.2 数值极限 844
40.2.1 数值极限宏 846
40.3 标准数学函数 847
40.4 complex复数 848
40.5 数值数组:valarray 849
40.5.1 构造函数和赋值 849
40.5.2 下标 851
40.5.3 运算 852
40.5.4 切片 854
40.5.5 slice_array 856
40.5.6 通用切片 856
40.6 通用数值算法 857
40.6.1 accumulate() 858
40.6.2 inner_product() 859
40.6.3 partial_sum()与adjacent_difference() 859
40.6.4 iota() 860
40.7 随机数 860
40.7.1 引擎 862
40.7.2 随机设备 864
40.7.3 分布 864
40.7.4 C风格随机数 867
40.8 建议 868
第41章 并发 869
41.1 导言 869
41.2 内存模型 870
41.2.1 内存位置 870
41.2.2 指令重排 871
41.2.3 内存序 872
41.2.4 数据竞争 873
41.3 原子性 874
41.3.1 原子类型 875
41.3.2 原子标志和栅栏 879
41.4 volatile 880
41.5 建议 880
第42章 线程和任务 881
42.1 导言 881
42.2 线程 881
42.2.1 身份 882
42.2.2 构造 883
42.2.3 析构 884
42.2.4 join() 884
42.2.5 detach() 885
42.2.6 命名空间this_thread 886
42.2.7 杀死thread 887
42.2.8 thread_local数据 887
42.3 避免数据竞争 888
42.3.1 互斥量 889
42.3.2 多重锁 895
42.3.3 call_once() 896
42.3.4 条件变量 897
42.4 基于任务的并发 900
42.4.1 future和promise 901
42.4.2 promise 901
42.4.3 packaged_task 902
42.4.4 future 905
42.4.5 shared_future 907
42.4.6 async() 907
42.4.7 一个并行find()示例 909
42.5 建议 911
第43章 C标准库 913
43.1 导言 913
43.2 文件 913
43.3 printf()系列函数 914
43.4 C风格字符串 916
43.5 内存 917
43.6 日期和时间 918
43.7 其他 921
43.8 建议 922
第44章 兼容性 923
44.1 导言 923
44.2 C++11扩展 923
44.2.1 语言特性 923
44.2.2 标准库组件 924
44.2.3 弃用特性 925
44.2.4 应对早期C++实现 926
44.3 C/C++兼容性 926
44.3.1 C和C++是兄弟 926
44.3.2 “静默”差异 927
44.3.3 不兼容C++的C代码 928
44.3.4 不兼容C的C++代码 930
44.4 建议 931
定价:249.8
ISBN:9787115666147
作者:[丹]比亚内·斯特劳斯特鲁普(Bjarne Stroustrup)
版次:第1版
出版时间:2026-01
内容提要:
C++是一种通用程序设计语言。本书*介绍C++11标准,涵盖了C++的发展历程、设计理念、学习方法及新特性等内容。第1篇(第1~5章)包括C++的背景知识、C++语言及其标准库的简要介绍;第2篇(第6~15章)介绍C++的内置类型、基本特性及如何用它们构造程序;第3篇(第16~29章)介绍C++的抽象机制及如何用这些机制编写面向对象程序和泛型程序;第4篇(第30~44章)概述标准库并讨论一些兼容性问题。本书从基本原理、规范等方面充分讲解C++的语言特性和标准库组件,并给出丰富的例子,为专业程序员提供*的C++知识体系。 本书可作为高等院校编程语言和C++相关课程的教材,也适合C++程序设计人员阅读。
作者简介:
比亚内?斯特劳斯特鲁普(Bjarne Stroustrup),C++ 语言的设计者和*初实现者,《C++ 程序设计语言》及《C++ 程序设计原理与实践》等多部图书作者。曾任职于贝尔实验室、美国电话电报公司 (AT&T) 研究实验室、得克萨斯农工大学及摩根士丹利纽约总部,于 2022 年退休。 Stroustrup 曾荣获多项荣誉,包括 2018 年美国国家工程院查尔斯?斯塔克?德雷珀奖,以表彰他 “对 C++ 语言的构思与开发”。此外,Stroustrup 还是美国国家工程院院士、AT&T 会士、AT&T 贝尔实验室会士、电气电子工程师学会 (IEEE) 会士以及美国计算机协会 (ACM) 会士,并于 2013 年入选《电子设计》杂志的工程名人堂。 Stroustrup 的研究领域包括分布式系统、仿真、设计、编程技术、软件开发工具和编程语言等,同时积极参与 C++ 的 ANSI/ISO 标准化工作。 Stroustrup 拥有丹麦奥胡斯大学的硕士学位,以及英国剑桥大学的计算机科学博士学位。
目录:
上册
第 1篇 引言
第 1章 致读者 2
1.1 本书结构 2
1.1.1 导言 2
1.1.2 基本特性 3
1.1.3 抽象机制 3
1.1.4 标准库 4
1.1.5 示例和参考文献 4
1.2 C++的设计 5
1.2.1 编程风格 6
1.2.2 类型检查 8
1.2.3 C语言兼容性 9
1.2.4 语言、库和系统 9
1.3 学习C++ 10
1.3.1 用C++编程 11
1.3.2 对C++程序员的建议 12
1.3.3 对C程序员的建议 12
1.3.4 对Java程序员的建议 13
1.4 C++的发展历程 14
1.4.1 大事年表 14
1.4.2 早期的C++ 15
1.4.3 1998标准 16
1.4.4 2011标准 17
1.4.5 C++的用途 19
1.5 建议 20
1.6 参考资料 21
第 2章 C++之旅:基础知识 24
2.1 导言 24
2.2 基础知识 24
2.2.1 Hello, World! 25
2.2.2 类型、变量和算术运算 26
2.2.3 常量 28
2.2.4 测试和循环 28
2.2.5 指针、数组和循环 29
2.3 用户自定义类型 31
2.3.1 结构体 31
2.3.2 类 32
2.3.3 枚举 33
2.4 模块化 34
2.4.1 单独编译 35
2.4.2 命名空间 36
2.4.3 错误处理 37
2.5 后记 39
2.6 建议 39
第3章 C++之旅:抽象机制 40
3.1 导言 40
3.2 类 40
3.2.1 具体类型 41
3.2.2 抽象类型 44
3.2.3 虚函数 46
3.2.4 类层次结构 46
3.3 复制和移动 50
3.3.1 复制容器 50
3.3.2 移动容器 51
3.3.3 资源管理 53
3.3.4 禁用操作 53
3.4 模板 54
3.4.1 参数化类型 54
3.4.2 函数模板 55
3.4.3 函数对象 56
3.4.4 可变参数模板 58
3.4.5 别名 58
3.5 建议 59
第4章 C++之旅:容器和算法 60
4.1 库 60
4.1.1 标准库概述 60
4.1.2 标准库头文件和命名空间 61
4.2 字符串 62
4.3 I/O流 63
4.3.1 输出 63
4.3.2 输入 64
4.3.3 用户自定义类型I/O 65
4.4 容器 66
4.4.1 vector 66
4.4.2 list 68
4.4.3 map 69
4.4.4 unordered_map 70
4.4.5 容器概述 70
4.5 算法 71
4.5.1 使用迭代器 72
4.5.2 迭代器类型 73
4.5.3 流迭代器 74
4.5.4 谓词 75
4.5.5 算法概述 76
4.5.6 容器算法 76
4.6 建议 77
第5章 C++之旅:并发与实用工具 78
5.1 导言 78
5.2 资源管理 78
5.2.1 unique_ptr和shared_ptr 79
5.3 并发处理 80
5.3.1 任务和线程 80
5.3.2 传递参数 81
5.3.3 返回结果 82
5.3.4 共享数据 82
5.3.5 任务间通信 84
5.4 小型实用组件 86
5.4.1 时间处理 87
5.4.2 类型函数 87
5.4.3 对组和元组 89
5.5 正则表达式 90
5.6 数值计算 90
5.6.1 数学函数和算法 90
5.6.2 复数 91
5.6.3 随机数 91
5.6.4 向量运算 92
5.6.5 数值限制 93
5.7 建议 93
第 2篇 基本特征
第6章 类型和声明 96
6.1 ISO C++标准 96
6.1.1 实现 97
6.1.2 基本源代码字符集 97
6.2 类型 97
6.2.1 基本类型 98
6.2.2 布尔类型 98
6.2.3 字符类型 99
6.2.4 整数类型 102
6.2.5 浮点类型 104
6.2.6 前缀和后缀 104
6.2.7 void 105
6.2.8 大小 105
6.2.9 对齐 107
6.3 声明 107
6.3.1 声明的结构 109
6.3.2 声明多个名称 110
6.3.3 名称 110
6.3.4 作用域 111
6.3.5 初始化 113
6.3.6 类型推断:auto和decltype() 116
6.4 对象与值 118
6.4.1 左值与右值 118
6.4.2 对象的生命周期 118
6.5 类型别名 119
6.6 建议 120
第7章 指针、数组与引用 121
7.1 导言 121
7.2 指针 121
7.2.1 void* 122
7.2.2 nullptr 122
7.3 数组 123
7.3.1 数组初始化器 124
7.3.2 字符串字面量 124
7.4 指针与数组 127
7.4.1 访问数组 127
7.4.2 多维数组 129
7.4.3 传递数组 130
7.5 指针与const 131
7.6 指针与所有权 133
7.7 引用 133
7.7.1 左值引用 134
7.7.2 右值引用 137
7.7.3 引用的引用 139
7.7.4 指针与引用 139
7.8 建议 141
第8章 结构体、联合体与枚举 142
8.1 导言 142
8.2 结构体 142
8.2.1 struct的布局 143
8.2.2 struct的名称 144
8.2.3 结构体与类 145
8.2.4 结构体与数组 146
8.2.5 类型等价 148
8.2.6 普通旧数据 149
8.2.7 域 150
8.3 联合体 151
8.3.1 联合体与类 152
8.3.2 匿名union 153
8.4 枚举 155
8.4.1 enum class 155
8.4.2 普通enum 158
8.4.3 未命名enum 159
8.5 建议 159
第9章 语句 160
9.1 导言 160
9.2 语句概述 160
9.3 声明作为语句 161
9.4 选择语句 162
9.4.1 if语句 162
9.4.2 switch语句 163
9.4.3 条件中的声明 165
9.5 循环语句 166
9.5.1 范围for语句 166
9.5.2 for语句 167
9.5.3 while语句 168
9.5.4 do语句 168
9.5.5 循环退出 168
9.6 goto语句 169
9.7 注释与缩进 169
9.8 建议 171
第 10章 表达式 172
10.1 导言 172
10.2 桌面计算器示例 172
10.2.1 语法分析器 172
10.2.2 输入 176
10.2.3 底层输入 179
10.2.4 错误处理 179
10.2.5 驱动程序 180
10.2.6 头文件 180
10.2.7 命令行参数 181
10.2.8 编程风格 182
10.3 运算符概述 182
10.3.1 结果 185
10.3.2 求值顺序 186
10.3.3 运算符优先级 186
10.3.4 临时对象 187
10.4 常量表达式 188
10.4.1 符号常量 189
10.4.2 常量表达式中的const 189
10.4.3 字面量类型 190
10.4.4 引用参数 190
10.4.5 地址常量表达式 191
10.5 隐式类型转换 191
10.5.1 提升 191
10.5.2 类型转换 192
10.5.3 常规算术类型转换 194
10.6 建议 194
第 11章 选择操作 195
11.1 其他运算符 195
11.1.1 逻辑运算符 195
11.1.2 位逻辑运算符 195
11.1.3 条件表达式 196
11.1.4 递增与递减 197
11.2 自由存储区 198
11.2.1 内存管理 199
11.2.2 数组 201
11.2.3 获取内存空间 202
11.2.4 重载new 203
11.3 列表 204
11.3.1 实现模型 205
11.3.2 限定列表 206
11.3.3 未限定列表 206
11.4 lambda表达式 208
11.4.1 实现模型 208
11.4.2 lambda的替代 209
11.4.3 捕获 210
11.4.4 调用与返回 212
11.4.5 lambda的类型 213
11.5 显式类型转换 213
11.5.1 构造 214
11.5.2 命名转换 216
11.5.3 C风格转换 217
11.5.4 函数风格转换 217
11.6 建议 217
第 12章 函数 218
12.1 函数声明 218
12.1.1 为什么使用函数 218
12.1.2 函数声明的组成 219
12.1.3 函数定义 219
12.1.4 返回值 220
12.1.5 inline函数 222
12.1.6 constexpr函数 222
12.1.7 带有[[noreturn]]的函数 224
12.1.8 局部变量 224
12.2 参数传递 225
12.2.1 引用参数 226
12.2.2 数组参数 227
12.2.3 列表参数 228
12.2.4 未定数量的参数 230
12.2.5 默认参数 232
12.3 重载函数 233
12.3.1 自动重载解析 234
12.3.2 重载与返回类型 235
12.3.3 重载与作用域 235
12.3.4 多实参解析 236
12.3.5 手动重载解析 236
12.4 前置与后置条件 237
12.5 函数指针 238
12.6 宏 241
12.6.1 条件编译 244
12.6.2 预定义宏 244
12.6.3 编译指令 245
12.7 建议 245
第 13章 异常处理 246
13.1 错误处理 246
13.1.1 异常 246
13.1.2 传统的错误处理 247
13.1.3 应付过去 248
13.1.4 异常的替代观点 249
13.1.5 何时不能使用异常 249
13.1.6 层次化错误处理 250
13.1.7 异常与效率 251
13.2 异常保证 252
13.3 资源管理 253
13.3.1 finally 256
13.4 强制不变式 257
13.5 抛出和捕获异常 260
13.5.1 抛出异常 260
13.5.2 捕获异常 263
13.5.3 异常与线程 268
13.6 vector的实现 268
13.6.1 一个简单的vector 268
13.6.2 显式表示内存 271
13.6.3 赋值 273
13.6.4 改变大小 275
13.7 建议 277
第 14章 命名空间 278
14.1 组合问题 278
14.2 命名空间 279
14.2.1 显式限定 280
14.2.2 using声明 281
14.2.3 using指令 282
14.2.4 参数依赖查找 283
14.2.5 命名空间是开放的 284
14.3 模块化与接口 285
14.3.1 命名空间作为模块 286
14.3.2 实现 287
14.3.3 接口和实现 289
14.4 使用命名空间组合代码 290
14.4.1 便利性与*性 290
14.4.2 命名空间别名 291
14.4.3 组合命名空间 291
14.4.4 组合与选择 292
14.4.5 命名空间与重载 293
14.4.6 版本控制 295
14.4.7 嵌套命名空间 297
14.4.8 未命名命名空间 297
14.4.9 C头文件 298
14.5 建议 299
第 15章 源文件与程序 300
15.1 单独编译 300
15.2 链接 301
15.2.1 文件局部名称 303
15.2.2 头文件 303
15.2.3 单一定义规则 304
15.2.4 标准库头文件 306
15.2.5 链接非C++代码 307
15.2.6 链接与函数指针 308
15.3 使用头文件 309
15.3.1 单头文件组织 309
15.3.2 多头文件组织 312
15.3.3 包含保护 315
15.4 程序 316
15.4.1 非局部变量初始化 316
15.4.2 初始化与并发 317
15.4.3 程序终止 317
15.5 建议 318
第3篇 抽象机制
第 16章 类 320
16.1 导言 320
16.2 类的基本概念 321
16.2.1 成员函数 321
16.2.2 默认复制 322
16.2.3 访问控制 322
16.2.4 类和结构体 323
16.2.5 构造函数 324
16.2.6 显式构造函数 326
16.2.7 类内初始化器 328
16.2.8 类内函数定义 328
16.2.9 可变性 329
16.2.10 自引用 331
16.2.11 成员访问 333
16.2.12 静态成员 334
16.2.13 成员类型 335
16.3 具体类 336
16.3.1 成员函数 338
16.3.2 辅助函数 340
16.3.3 重载运算符 341
16.3.4 具体类的意义 342
16.4 建议 343
第 17章 构造、清理、复制和移动 344
17.1 导言 344
17.2 构造函数和析构函数 345
17.2.1 构造函数和不变式 346
17.2.2 析构函数和资源 347
17.2.3 基类和成员析构函数 348
17.2.4 调用构造函数和析构函数 348
17.2.5 虚析构函数 349
17.3 类对象初始化 350
17.3.1 不使用构造函数进行初始化 350
17.3.2 使用构造函数进行初始化 351
17.3.3 默认构造函数 353
17.3.4 初始化器列表构造函数 355
17.4 成员初始化和基类初始化 358
17.4.1 成员初始化 359
17.4.2 基类初始化器 360
17.4.3 委托构造函数 360
17.4.4 类内初始化器 361
17.4.5 static成员初始化 363
17.5 复制和移动 364
17.5.1 复制 364
17.5.2 移动 369
17.6 生成默认操作 372
17.6.1 显式声明默认操作 372
17.6.2 默认操作 373
17.6.3 使用默认操作 373
17.6.4 使用delete删除的函数 376
17.7 建议 378
第 18章 运算符重载 379
18.1 导言 379
18.2 运算符函数 380
18.2.1 二元和一元运算符 381
18.2.2 运算符的预置含义 382
18.2.3 运算符和用户自定义类型 382
18.2.4 传递对象 383
18.2.5 命名空间中的运算符 383
18.3 复数类型 385
18.3.1 成员和非成员运算符 385
18.3.2 混合模式运算 386
18.3.3 类型转换 387
18.3.4 字面量 389
18.3.5 访问函数 390
18.3.6 辅助函数 390
18.4 类型转换 391
18.4.1 类型转换运算符 391
18.4.2 显式类型转换运算符 393
18.4.3 歧义 393
18.5 建议 394
第 19章 特殊运算符 396
19.1 导言 396
19.2 特殊运算符 396
19.2.1 取下标 396
19.2.2 函数调用 397
19.2.3 解引用 398
19.2.4 自增和自减 400
19.2.5 分配和释放 401
19.2.6 用户自定义字面量 402
19.3 字符串类 405
19.3.1 基本操作 405
19.3.2 访问字符 406
19.3.3 类的表示 407
19.3.4 成员函数 409
19.3.5 辅助函数 410
19.3.6 应用String 412
19.4 友元 413
19.4.1 发现友元 414
19.4.2 友元与成员 415
19.5 建议 416
第 20章 派生类 417
20.1 导言 417
20.2 派生类 418
20.2.1 成员函数 419
20.2.2 构造函数和析构函数 420
20.3 类层次结构 421
20.3.1 类型域 421
20.3.2 虚函数 423
20.3.3 显式限定 425
20.3.4 覆盖控制 425
20.3.5 using基类成员 428
20.3.6 返回类型放宽 431
20.4 抽象类 432
20.5 访问控制 434
20.5.1 受保护成员 436
20.5.2 访问基类 437
20.5.3 using声明和访问控制 438
20.6 成员指针 439
20.6.1 函数成员指针 439
20.6.2 数据成员指针 441
20.6.3 基类和派生类成员 441
20.7 建议 442
第 21章 类层次结构 443
21.1 导言 443
21.2 类层次结构的设计 443
21.2.1 实现继承 443
21.2.2 接口继承 446
21.2.3 替代实现 447
21.2.4 定位对象创建 450
21.3 多重继承 451
21.3.1 多重接口 451
21.3.2 多重实现类 451
21.3.3 *歧义 453
21.3.4 重复使用基类 455
21.3.5 虚基类 456
21.3.6 重复基类与虚基类 460
21.4 建议 462
下册
第 22章 运行时类型信息 463
22.1 导言 463
22.2 类层次结构导航 463
22.2.1 dynamic_cast 464
22.2.2 多重继承 466
22.2.3 static_cast和dynamic_cast 467
22.2.4 恢复接口 468
22.3 双重分发和访问者 471
22.3.1 双重分发 472
22.3.2 访问者 473
22.4 构造和析构 475
22.5 类型识别 475
22.5.1 扩展类型信息 477
22.6 RTII的使用和误用 478
22.7 建议 479
第 23章 模板 480
23.1 介绍与概述 480
23.2 一个简单字符串模板 481
23.2.1 定义模板 483
23.2.2 模板实例化 484
23.3 类型检查 484
23.3.1 类型等价性 485
23.3.2 错误检测 486
23.4 类模板成员 487
23.4.1 数据成员 487
23.4.2 成员函数 487
23.4.3 成员类型别名 487
23.4.4 静态成员 488
23.4.5 成员类型 488
23.4.6 成员模板 489
23.4.7 友元 492
23.5 函数模板 493
23.5.1 函数模板实参 495
23.5.2 函数模板实参推断 496
23.5.3 函数模板重载 498
23.6 模板别名 501
23.7 源代码组织 502
23.7.1 链接 503
23.8 建议 504
第 24章 泛型编程 505
24.1 导言 505
24.2 算法和提升 506
24.3 概念 508
24.3.1 探索概念 509
24.3.2 概念和约束 511
24.4 具体化概念 512
24.4.1 公理 514
24.4.2 多实参概念 515
24.4.3 值概念 516
24.4.4 约束检查 517
24.4.5 模板定义检查 517
24.5 建议 519
第 25章 特化 520
25.1 导言 520
25.2 模板形参和实参 520
25.2.1 类型作为实参 521
25.2.2 值作为实参 522
25.2.3 操作作为实参 523
25.2.4 模板作为实参 525
25.2.5 默认模板实参 525
25.3 特化 527
25.3.1 接口特化 528
25.3.2 主模板 530
25.3.3 特化顺序 531
25.3.4 函数模板特化 531
25.4 建议 533
第 26章 实例化 534
26.1 导言 534
26.2 模板实例化 534
26.2.1 何时需要实例化 535
26.2.2 手动控制实例化 536
26.3 名称绑定 537
26.3.1 依赖名称 538
26.3.2 定义点绑定 539
26.3.3 实例化点绑定 540
26.3.4 多实例化点 542
26.3.5 模板和命名空间 543
26.3.6 过于激进的ADL 543
26.3.7 来自基类的名称 545
26.4 建议 547
第 27章 模板和层次结构 548
27.1 导言 548
27.2 参数化和层次结构 548
27.2.1 生成类型 550
27.2.2 模板类型转换 551
27.3 类模板层次结构 552
27.3.1 模板作为接口 553
27.4 模板参数作为基类 553
27.4.1 组合数据结构 554
27.4.2 线性化类层次结构 557
27.5 建议 561
第 28章 元编程 562
28.1 导言 562
28.2 类型函数 563
28.2.1 类型别名 565
28.2.2 类型谓词 566
28.2.3 选择函数 567
28.2.4 萃取 568
28.3 控制结构 569
28.3.1 选择 569
28.3.2 迭代和递归 572
28.3.3 何时使用元编程 573
28.4 条件定义:Enable_if 573
28.4.1 使用Enable_if 575
28.4.2 实现Enable_if 576
28.4.3 Enable_if和概念 576
28.4.4 更多Enable_if示例 577
28.5 编译时列表: Tuple 579
28.5.1 一个简单的输出函数 580
28.5.2 元素访问 581
28.5.3 make_tuple 584
28.6 可变参数模板 584
28.6.1 一个类型*的printf() 584
28.6.2 技术细节 586
28.6.3 转发 587
28.6.4 标准库tuple 588
28.7 国际标准单位示例 591
28.7.1 Unit 591
28.7.2 Quantity 592
28.7.3 Unit字面量 594
28.7.4 实用函数 594
28.8 建议 596
第 29章 矩阵设计 597
29.1 导言 597
29.1.1 基本矩阵用途 597
29.1.2 矩阵要求 599
29.2 矩阵模板 599
29.2.1 构造和赋值 600
29.2.2 下标和切片 602
29.3 矩阵算术运算 604
29.3.1 标量运算 604
29.3.2 加法 605
29.3.3 乘法 606
29.4 矩阵实现 607
29.4.1 slice() 607
29.4.2 矩阵切片 608
29.4.3 Matrix_ref 609
29.4.4 矩阵列表初始化 610
29.4.5 矩阵访问 612
29.4.6 *维矩阵 614
29.5 解线性方程 614
29.5.1 *高斯消元法 615
29.5.2 主元选取 616
29.5.3 测试 616
29.5.4 熔合运算 617
29.6 建议 619
第4篇 标准库
第30章 标准库概览 622
30.1 导言 622
30.1.1 标准库设施 622
30.1.2 设计约束 623
30.1.3 描述风格 624
30.2 头文件 624
30.3 语言支持 628
30.3.1 initializer_list支持 628
30.3.2 范围for支持 629
30.4 错误处理 629
30.4.1 异常 629
30.4.2 断言 632
30.4.3 system_error 633
30.5 建议 640
第31章 STL容器 642
31.1 导言 642
31.2 容器概览 642
31.2.1 容器表示 644
31.2.2 元素要求 645
31.3 操作概览 647
31.3.1 成员类型 649
31.3.2 构造函数、析构函数和赋值操作 650
31.3.3 大小和容量 651
31.3.4 迭代器 651
31.3.5 元素访问 652
31.3.6 栈操作 653
31.3.7 列表操作 653
31.3.8 其他操作 654
31.4 容器 654
31.4.1 vector 654
31.4.2 链表 657
31.4.3 关联容器 659
31.5 容器适配器 667
31.5.1 stack 668
31.5.2 queue 669
31.5.3 priority_queue 669
31.6 建议 670
第32章 STL算法 672
32.1 导言 672
32.2 算法 672
32.2.1 序列 672
32.3 策略实参 674
32.3.1 复杂度 675
32.4 不修改序列的算法 675
32.4.1 for_each() 675
32.4.2 序列谓词 676
32.4.3 count() 676
32.4.4 find() 676
32.4.5 equal()和mismatch() 677
32.4.6 search() 678
32.5 修改序列的算法 678
32.5.1 copy() 679
32.5.2 unique() 679
32.5.3 remove()和replace() 680
32.5.4 rotate()、random_shuffle()和partition() 681
32.5.5 排列 682
32.5.6 fill() 682
32.5.7 swap() 683
32.6 排序和搜索 683
32.6.1 二分搜索 685
32.6.2 merge() 686
32.6.3 集合算法 687
32.6.4 堆 688
32.6.5 lexicographical_compare() 688
32.7 *小值和*值 689
32.8 建议 690
第33章 STL迭代器 691
33.1 导言 691
33.1.1 迭代器模型 691
33.1.2 迭代器类别 692
33.1.3 迭代器萃取 693
33.1.4 迭代器操作 695
33.2 迭代器适配器 696
33.2.1 反向迭代器 696
33.2.2 插入迭代器 698
33.2.3 移动迭代器 699
33.3 范围访问函数 699
33.4 函数对象 700
33.5 函数适配器 701
33.5.1 bind() 701
33.5.2 mem_fn() 703
33.5.3 function 703
33.6 建议 705
第34章 内存和资源 706
34.1 导言 706
34.2 “拟容器” 706
34.2.1 array 707
34.2.2 bitset 709
34.2.3 vector
34.2.4 元组 713
34.3 资源管理指针 716
34.3.1 unique_ptr 716
34.3.2 shared_ptr 719
34.3.3 weak_ptr 721
34.4 分配器 723
34.4.1 默认分配器 724
34.4.2 分配器萃取 725
34.4.3 指针萃取 726
34.4.4 限域的分配器 726
34.5 垃圾收集接口 728
34.6 未初始化内存 730
34.6.1 临时缓冲区 730
34.6.2 raw_storage_iterator 730
34.7 建议 731
第35章 工具 732
35.1 导言 732
35.2 时间 732
35.2.1 duration 733
35.2.2 time_point 735
35.2.3 时钟 736
35.2.4 时间萃取 737
35.3 编译时有理数运算 738
35.4 类型函数 739
35.4.1 类型萃取 739
35.4.2 类型生成器 742
35.5 更多工具 746
35.5.1 move()和forward() 747
35.5.2 swap() 747
35.5.3 关系运算符 748
35.5.4 比较和哈希type_info 749
35.6 建议 749
第36章 字符串 750
36.1 导言 750
36.2 字符分类 750
36.2.1 分类函数 750
36.2.2 字符萃取 751
36.3 字符串 752
36.3.1 string与C风格字符串 753
36.3.2 构造函数 754
36.3.3 基本操作 755
36.3.4 字符串I/O 756
36.3.5 数值转换 757
36.3.6 类STL操作 758
36.3.7 find系列函数 760
36.3.8 子串 761
36.4 建议 762
第37章 正则表达式 763
37.1 正则表达式 763
37.1.1 正则表达式表示法 764
37.2 regex 767
37.2.1 匹配结果 768
37.2.2 格式化 771
37.3 正则表达式函数 771
37.3.1 regex_match() 772
37.3.2 regex_search() 773
37.3.3 regex_replace() 774
37.4 正则表达式迭代器 775
37.4.1 regex_iterator 775
37.4.2 regex_token_iterator 776
37.5 regex_traits 778
37.6 建议 778
第38章 I/O流 779
38.1 导言 779
38.2 I/O流层次结构 781
38.2.1 文件流 781
38.2.2 字符串流 782
38.3 错误处理 784
38.4 I/O操作 785
38.4.1 输入操作 785
38.4.2 输出操作 788
38.4.3 操纵符 789
38.4.4 流状态 790
38.4.5 格式化 794
38.5 流迭代器 799
38.6 缓冲 800
38.6.1 输出流和缓冲区 802
38.6.2 输入流和缓冲区 803
38.6.3 缓冲区迭代器 804
38.7 建议 805
第39章 区域设置 807
39.1 处理文化差异 807
39.2 locale类 809
39.2.1 命名的locale 810
39.2.2 string的比较 813
39.3 facet类 813
39.3.1 访问locale中的facet 814
39.3.2 一个简单的用户自定义facet 815
39.3.3 locale和facet的使用 817
39.4 标准facet 817
39.4.1 string的比较 819
39.4.2 数值格式化 821
39.4.3 货币格式化 825
39.4.4 日期和时间格式化 829
39.4.5 字符分类 831
39.4.6 字符编码转换 834
39.4.7 消息 837
39.5 便利接口 840
39.5.1 字符分类 840
39.5.2 字符转换 841
39.5.3 字符串转换 841
39.5.4 缓冲区转换 842
39.6 建议 843
第40章 数值 844
40.1 导言 844
40.2 数值极限 844
40.2.1 数值极限宏 846
40.3 标准数学函数 847
40.4 complex复数 848
40.5 数值数组:valarray 849
40.5.1 构造函数和赋值 849
40.5.2 下标 851
40.5.3 运算 852
40.5.4 切片 854
40.5.5 slice_array 856
40.5.6 通用切片 856
40.6 通用数值算法 857
40.6.1 accumulate() 858
40.6.2 inner_product() 859
40.6.3 partial_sum()与adjacent_difference() 859
40.6.4 iota() 860
40.7 随机数 860
40.7.1 引擎 862
40.7.2 随机设备 864
40.7.3 分布 864
40.7.4 C风格随机数 867
40.8 建议 868
第41章 并发 869
41.1 导言 869
41.2 内存模型 870
41.2.1 内存位置 870
41.2.2 指令重排 871
41.2.3 内存序 872
41.2.4 数据竞争 873
41.3 原子性 874
41.3.1 原子类型 875
41.3.2 原子标志和栅栏 879
41.4 volatile 880
41.5 建议 880
第42章 线程和任务 881
42.1 导言 881
42.2 线程 881
42.2.1 身份 882
42.2.2 构造 883
42.2.3 析构 884
42.2.4 join() 884
42.2.5 detach() 885
42.2.6 命名空间this_thread 886
42.2.7 杀死thread 887
42.2.8 thread_local数据 887
42.3 避免数据竞争 888
42.3.1 互斥量 889
42.3.2 多重锁 895
42.3.3 call_once() 896
42.3.4 条件变量 897
42.4 基于任务的并发 900
42.4.1 future和promise 901
42.4.2 promise 901
42.4.3 packaged_task 902
42.4.4 future 905
42.4.5 shared_future 907
42.4.6 async() 907
42.4.7 一个并行find()示例 909
42.5 建议 911
第43章 C标准库 913
43.1 导言 913
43.2 文件 913
43.3 printf()系列函数 914
43.4 C风格字符串 916
43.5 内存 917
43.6 日期和时间 918
43.7 其他 921
43.8 建议 922
第44章 兼容性 923
44.1 导言 923
44.2 C++11扩展 923
44.2.1 语言特性 923
44.2.2 标准库组件 924
44.2.3 弃用特性 925
44.2.4 应对早期C++实现 926
44.3 C/C++兼容性 926
44.3.1 C和C++是兄弟 926
44.3.2 “静默”差异 927
44.3.3 不兼容C++的C代码 928
44.3.4 不兼容C的C++代码 930
44.4 建议 931
- 人民邮电出版社有限公司 (微信公众号认证)
- 人民邮电出版社微店,为您提供最全面,最专业的一站式购书服务
- 扫描二维码,访问我们的微信店铺
- 随时随地的购物、客服咨询、查询订单和物流...