《现代C++编程:从入门到实践》[美] 乔什・洛斯皮诺索(Josh Lo | PDF下载|ePub下载
现代C++编程:从入门到实践 版权信息
- 出版社:机械工业出版社
- 出版时间:2023-09-01
- ISBN:9787111734352
- 条形码:9787111734352 ; 978-7-111-73435-2
现代C++编程:从入门到实践 本书特色
C 是软件开发中使用非常广泛的语言之一。在经验丰富的程序员眼中,C 可以写出任何程序员都会引以为傲的可读性较高、短小精悍且高效的代码。你将通过本书学习现代C 的所有主要特性,包括: ?基本类型、引用类型和用户自定义类型; ?使用模板的编译时多态和使用虚拟类的运行时多态; ?对象生命周期,包括存储期、调用栈、内存管理、异常和RAII范式; ?高级表达式、语句和函数; ?智能指针、数据结构、日期和时间、数值工具和概率/统计工具; ?容器、迭代器、字符串和算法; ?流、文件、并发性、网络和应用程序开发。本书包含500多个代码样本和近100个练习,可以让你打下坚实的C 基础。
现代C++编程:从入门到实践 内容简介
本书是为中高级程序员设计的,它深入介绍了现代C++的核心。本书分为两大部分:**部分介绍C++语言的核心,深入讲解从类型和函数到对象生命周期和表达式的所有内容;第二部分介绍C++标准库和Boost库,深入讲解所有可用的高质量、全功能的工具,涵盖了特殊的工具类、数据结构和算法,并介绍了如何操作文件系统和构建通过网络进行通信的高性能程序。本书包含500多个代码样本和近100个练习,可以让你打下坚实的C++基础,助你写出让自己引以为傲的可读性较高、短小精悍且高效的代码。
现代C++编程:从入门到实践 目录
序
前言
致C语言程序员
**部分 C 语言核心
第1章 启动和运行2
1.1 C 程序的基本结构2
1.1.1 创建**个C 源文件3
1.1.2 main函数:C 程序的入口点3
1.1.3 程序库:引入外部代码3
1.2 编译器工具链4
1.2.1 设置开发环境4
1.2.2 Windows 10以及后续版本:
Visual Studio5
1.2.3 macOS: Xcode6
1.2.4 Linux和GCC7
1.2.5 文本编辑器10
1.3 开始认识C 11
1.3.1 C 类型系统11
1.3.2 声明变量11
1.3.3 初始化变量的状态11
1.3.4 条件语句12
1.3.5 函数14
1.3.6 printf格式指定符15
1.3.7 重新审视step_function16
1.3.8 注释 17
1.4 调试18
1.4.1 Visual Studio18
1.4.2 Xcode19
1.4.3 用GDB和LLDB对GCC和
Clang进行调试20
1.5 总结23
练习23
拓展阅读24
第2章 类型25
2.1 基本类型25
2.1.1 整数类型25
2.1.2 浮点类型28
2.1.3 字符类型30
2.1.4 布尔类型31
2.1.5 std::byte类型33
2.1.6 size_t类型34
2.1.7 void35
2.2 数组35
2.2.1 数组初始化35
2.2.2 访问数组元素35
2.2.3 for循环简介36
2.2.4 C风格字符串38
2.3 用户自定义类型41
2.3.1 枚举类型41
2.3.2 普通数据类44
2.3.3 联合体45
2.4 全功能的C 类46
2.4.1 方法47
2.4.2 访问控制47
2.4.3 构造函数49
2.4.4 初始化51
2.4.5 析构函数55
2.5 总结56
练习56
拓展阅读56
第3章 引用类型57
3.1 指针57
3.1.1 寻址变量58
3.1.2 指针解引用59
3.1.3 成员指针运算符60
3.1.4 指针和数组61
3.1.5 指针很危险63
3.1.6 void指针和std::byte指针65
3.1.7 nullptr和布尔表达式65
3.2 引用65
3.3 指针和引用的使用66
3.3.1 前向链表:经典的基于指针的
数据结构66
3.3.2 使用引用68
3.3.3 this指针69
3.3.4 const正确性69
3.3.5 const成员变量71
3.3.6 成员初始化列表71
3.4 auto类型推断72
3.4.1 用auto进行初始化73
3.4.2 auto和引用类型73
3.4.3 auto和代码重构73
3.5 总结74
练习74
拓展阅读75
第4章 对象生命周期76
4.1 对象的存储期76
4.1.1 分配、释放和生命周期76
4.1.2 内存管理77
4.1.3 自动存储期77
4.1.4 静态存储期77
4.1.5 线程局部存储期80
4.1.6 动态存储期81
4.2 追踪对象的生命周期83
4.3 异常84
4.3.1 throw关键字84
4.3.2 使用try-catch代码块85
4.3.3 stdlib异常类86
4.3.4 异常处理88
4.3.5 用户定义的异常89
4.3.6 noexcept关键字90
4.3.7 调用栈和异常90
4.4 SimpleString类92
4.4.1 追加和打印93
4.4.2 使用SimpleString94
4.4.3 组合SimpleString95
4.4.4 调用栈展开96
4.4.5 异常和性能98
4.4.6 异常的替代方法98
4.5 复制语义99
4.5.1 复制构造函数101
4.5.2 复制赋值103
4.5.3 默认复制105
4.5.4 复制指南106
4.6 移动语义106
4.6.1 复制行为可能浪费资源106
4.6.2 值类别108
4.6.3 左值引用和右值引用108
4.6.4 std::move函数109
4.6.5 移动构造110
4.6.6 移动赋值110
4.6.7 终成果111
4.6.8 编译器生成的方法113
4.7 总结114
练习114
拓展阅读115
第5章 运行时多态116
5.1 多态116
5.2 一个有启发性的例子116
5.2.1 添加新的日志记录器119
5.2.2 接口119
5.2.3 对象组合和实现继承119
5.3 定义接口120
5.3.1 基类继承120
5.3.2 成员继承121
5.3.3 虚方法122
5.3.4 纯虚类和虚析构函数124
5.3.5 实现接口125
5.3.6 使用接口126
5.4 更新银行日志记录器126
5.4.1 构造函数注入127
5.4.2 属性注入127
5.4.3 构造函数注入和属性注入的
选择128
5.5 总结129
练习129
拓展阅读129
第6章 编译时多态130
6.1 模板130
6.2 声明模板130
6.2.1 模板类定义131
6.2.2 模板函数定义131
6.2.3 实例化模板131
6.3 类型转换函数132
6.3.1 const_cast132
6.3.2 static_cast133
6.3.3 reinterpret_cast134
6.3.4 narrow_cast134
6.4 mean:模板函数示例136
6.4.1 通用mean136
6.4.2 模板类型推断138
6.5 SimpleUniquePointer:模板类
示例139
6.6 模板中的类型检查142
6.7 concept143
6.7.1 定义concept143
6.7.2 类型特征144
6.7.3 约束要求146
6.7.4 从requires表达式构建
concept147
6.7.5 使用concept147
6.7.6 临时requires表达式151
6.8 static_assert:concept之前的权宜
之计153
6.9 非类型模板参数154
6.10 可变参数模板156
6.11 高级模板主题156
6.11.1 模板特化156
6.11.2 名字绑定157
6.11.3 类型函数157
6.11.4 模板元编程157
6.12 模板源代码组织157
6.13 运行时多态与编译时多态对比158
6.14 总结158
练习158
拓展阅读159
第7章 表达式160
7.1 运算符160
7.1.1 逻辑运算符160
7.1.2 算术运算符161
7.1.3 赋值运算符162
7.1.4 自增和自减运算符163
7.1.5 比较运算符163
7.1.6 成员访问运算符164
7.1.7 三元条件运算符164
7.1.8 逗号运算符165
7.1.9 重载运算符165
7.1.10 重载运算符new167
7.1.11 运算符优先级和结合性172
7.1.12 求值顺序174
7.2 自定义字面量175
7.3 类型转换175
7.3.1 隐式类型转换176
7.3.2 显式类型转换178
7.3.3 C风格的类型转换179
7.3.4 用户自定义类型的转换180
7.4 常量表达式181
7.4.1 有关色彩的示例182
7.4.2 关于constexpr的说明184
7.5 volatile表达式184
7.6 总结185
练习186
拓展阅读186
第8章 语句187
8.1 表达式语句187
8.2 复合语句188
8.3 声明语句189
8.3.1 函数189
8.3.2 命名空间192
8.3.3 类型别名195
8.3.4 结构化绑定197
8.3.5 属性198
8.4 选择语句199
8.4.1 if语句199
8.4.2 switch语句203
8.5 迭代语句204
8.5.1 while循环204
8.5.2 do-while循环205
8.5.3 for循环206
8.5.4 基于范围的for循环208
8.6 跳转语句211
8.6.1 break语句212
8.6.2 continue语句212
8.6.3 goto语句213
8.7 总结214
练习215
拓展阅读215
第9章 函数216
9.1 函数声明216
9.1.1 前缀修饰符216
9.1.2 后缀修饰符217
9.2 auto返回类型220
9.3 auto和函数模板220
9.4 重载解析221
9.5 可变参数函数222
9.6 可变参数模板223
9.6.1 用参数包编程223
9.6.2 再谈sum函数224
9.6.3 折叠表达式225
9.7 函数指针225
9.7.1 声明函数指针225
9.7.2 类型别名和函数指针226
9.8 函数调用运算符227
9.9 计数例子227
9.10 lambda表达式229
9.10.1 用法229
9.10.2 参数和表达式体230
9.10.3 默认参数231
9.10.4 泛型232
9.10.5 返回类型233
9.10.6 捕获列表233
9.10.7 constexpr lambda表达式239
9.11 std :: function 239
9.11.1 声明函数239
9.11.2 扩展示例240
9.12 main函数和命令行242
9.12.1 main的三个重载变体242
9.12.2 程序参数243
9.12.3 更深入的例子244
9.12.4 退出状态246
9.13 总结246
练习246
拓展阅读247
第二部分 C 库和框架
第10章 测试250
10.1 单元测试250
10.1.1 集成测试250
10.1.2 验收测试251
10.1.3 性能测试251
10.2 扩展示例:汽车制动服务251
10.2.1 实现AutoBrake253
10.2.2 测试驱动开发254
10.2.3 添加服务总线接口264
10.3 单元测试框架和模拟框架270
10.3.1 Catch单元测试框架270
10.3.2 Google Test276
10.3.3 Boost Test282
10.3.4 总结:测试框架287
10.4 模拟框架287
10.4.1 Google Mock289
10.4.2 HippoMocks296
10.4.3 其他模拟框架:FakeIt和
Trompeloeil300
10.5 总结300
练习301
拓展阅读302
第11章 智能指针303
11.1 智能指针概述303
11.2 智能指针所有权304
11.3 作用域指针304
11.3.1 构造304
11.3.2 引入Oath Breaker304
11.3.3 基于所有权的隐式布尔转换305
11.3.4 RAII包装器306
11.3.5 指针语义306
11.3.6 与nullptr比较307
11.3.7 交换307
11.3.8 重置和替换scoped_ptr308
11.3.9 不可转移性309
11.3.10 boost::scoped_array309
11.3.11 支持的部分操作310
11.4 独占指针310
11.4.1 构造311
11.4.2 支持的操作311
11.4.3 可转移的专属所有权311
11.4.4 独占数组312
11.4.5 删除器313
11.4.6 自定义删除器和系统编程313
11.4.7 支持的部分操作315
11.5 共享指针31
现代C++编程:从入门到实践 作者简介
Josh Lospinoso,一位企业家,曾在美国陆军服役15年。作为一名网络官员,他编写了几十个infosec工具,并向初级开发人员教授C++。他在各种会议上进行演讲,发表了20多篇期刊论文,并拥有一项专利。2012年,他参与创立了一家成功被收购的安全公司。他拥有自己的博客,也是开源软件的积极贡献者。他在牛津大学获统计学博士学位,是罗兹奖学金获得者。Kyle Willmon,一名拥有12年C++开发经验的系统开发人员。他在信息安全社区工作了7年,利用C++、Python和Go语言完成了各种项目。Kyle目前是索尼全球威胁模拟团队的一名开发人员。李好,本科、硕士均毕业于华中科技大学,目前在Thoughtworks任高级咨询师,曾担任过软件工程师,拥有多年的企业级应用和架构开发经验、系统软件开发经验,以及DevOps实践经验。同时,他也有丰富的敏捷项目管理经验,熟悉各种敏捷工程实践,比如TDD、重构、极限编程等。目前专注于安全领域,涉及应用安全、基础设施安全以及操作系统安全等。王绿菊,本科、硕士均毕业于西北大学,目前是Thoughtworks的资深咨询师,服务于安全与系统研发事业部。拥有丰富的全栈开发实战经验,精通应用安全架构与安全编码落地,同时致力于敏捷实践的布道与实践。C++编程爱好者,熟悉C++编码规范与最佳实践。王张军,本科毕业于安徽工程大学,硕士毕业于西安邮电大学,目前是Thoughtworks安全与系统研发事业部技术负责人。曾担任某大型嵌入式设备软件研发负责人,深度参与某大型企业内部终端安全产品的设计与落地。长期从事C/C++相关的软件研发。对系统安全、系统软件研发效能有浓厚的兴趣和独到见解。目前致力于C/C++相关的遗留系统的重构和架构改善工作。