C++之美 代码简洁、安全又跑得快的30个要诀
- ISBN:9787121482434
- 装帧:平装-胶订
- 册数:暂无
- 重量:暂无
- 开本:16开
- 页数:320
- 出版时间:2024-07-01
- 条形码:9787121482434 ; 978-7-121-48243-4
本书特色
编写优质的C 代码说难也不难。《C 核心准则》可以帮助每一位C 开发者设计和编写极其可靠、高效且行为正确的C 程序。然而,这份文档中大量极好的建议堆积在一起,让人不知该从何处着手。那么就从这本《C 之美》开始吧。
C 专家J.Guy Davidson和Kate Gregory选出30条特别有价值的核心准则,并提供了改进C 代码风格的详尽的实用知识。为便于参考,本书的结构与《C 核心准则》保持高度一致。
J.Guy Davidson和Kate Gregory在全书中都提供了有用的概念性见解和专家级示例代码,阐明了行之有效的方法,以便更加成功地运用新的和长期存在的语言特性,他们还展示了如何默认写出更健壮、更高效的程序。
O 防止“避重就轻”:不要在细枝末节上浪费宝贵的时间
O不要编写以后会出问题的代码,以至于伤害到自己
O 了解哪些遗留特性需要避开,而改用现代特性
O 正确使用更新的特性,得其裨益而不产生新的问题
O 默认写出静态类型安全、防泄漏且易于演进的更高质量的代码
O 将核心准则用于所有现代C 版本:C 20、C 17、C 14或C 11
内容简介
本书从《C++核心准则》(C++ Core Guidelines)中精心挑选了 30 条准则进行细致、深入的讲解。内容涵盖C++语言*主要的方面,如类型系统、面向对象、模板和元编程、错误处理、程序性能、常量性等,其间又恰如其分地穿插了编码风格、设计模式等主题。书中汇集了作者数十年职业生涯的经验和一些有趣的示例,除了深刻的见解,行文也充满了趣味性。作者试图通过这种突出重点、以点带面的方式帮助读者了解并学习《C++核心准则》,进而更深入地掌握 C++这门编程语言,特别是它的"现代”形态。本书适合各种经验水平的 C++开发者阅读。
目录
1.1 P.2:使用ISO标准C 编写代码 2
什么是ISO标准C 2
封装差异 4
了解以前的用法 8
紧跟标准的发展 9
1.2 F.51:在有选择的情况下,优先使用默认参数而非重载 12
引言 12
改进抽象概念:是增加参数还是重载 13
微妙的重载解决 14
回到示例代码 16
默认参数天然的明确性 18
函数重载的替代方案 19
有时必须重载 19
小结 20
1.3 C.45:不要定义仅初始化数据成员的默认构造函数,而应使用类内成员
?初始化 21
为什么要有默认构造函数 21
你是怎样初始化数据成员的 22
两个人维护一个类时会怎样 25
小结 27
1.4 C.131:避免平凡的get和set函数 28
一种古老的惯用法 28
抽象 29
单纯的封装 31
类不变式 34
名词和动词 36
小结 37
1.5 ES.10:每条语句只声明一个名字 38
我来引入你 38
向后兼容 40
写出更加清晰的声明 42
结构式绑定 43
小结 44
1.6 NR.2:不强求函数只用一条return语句 45
规则会演化 45
确保资源得到清理 47
使用RAII 50
编写好的函数 52
小结 54
第2章 不要伤害自己 55
2.1 P.11:将凌乱的构造封装起来,而不是使其散布于代码中 56
“一口吞”式做法 56
封装一种凌乱的构造意味着什么 58
语言的目的和抽象的本质 60
抽象的层次 63
通过重构和分割实现抽象 64
小结 65
2.2 I.23:尽量减少函数参数 66
他们应该挣多少 66
通过抽象简化问题 68
尽可能少,但不要更少 70
现实例子 72
小结 73
2.3 I.26:使用C风格子集获取跨编译器的ABI 74
创建程序库 74
什么是ABI 75
*小的C风格子集 77
异常的传播 79
小结 80
2.4 C.47:按声明的顺序定义并初始化成员变量 82
小结 90
2.5 CP.3:尽量减少可写数据的显式共享 91
传统执行模型 91
等等,不止这些 93
避免死锁和数据竞争 95
抛开锁和互斥体 97
小结 100
2.6 T.120:只在真正需要时使用模板元编程 101
std::enable_if => requires 108
小结 112
第3章 别再使用 113
3.1 I.11:切勿通过原生指针(T*)或引用(T&)转移所有权 114
使用自由存储区 114
智能指针的性能成本 117
使用未修饰的引用语义 118
gsl::owner 119
小结 121
3.2 I.3:避免使用单例 122
全局对象是不好的 122
单例设计模式 123
静态初始化顺序的尴尬 123
如何隐藏一个单例 125
但它就该只有一份 127
等一下…… 128
小结 130
3.3 C.90:使用构造函数和赋值运算符,而不是memset和memcpy 131
追求*优性能 131
构造函数的巨大开销 132
*简单的类 133
C 标准到底在说什么 135
那么,memcpy呢 137
永远不要低估编译器 139
小结 140
3.4 ES.50:不要用强制转换去除const限定符 141
故事时间 141
处理更大的数据量 142
const防火墙 143
实现双接口 144
缓存和懒惰求值 146
两种类型的const 147
const惊奇篇 149
小结 150
3.5 E.28:避免基于全局状态(如errno)的错误处理 151
错误处理很难 151
C和errno 151
返回错误代码 153
异常 154
<system_error> 154
Boost.Outcome 155
错误处理为何这样难 156
隧道尽头的光 158
小结 159
3.6 SF.7:不要在头文件的全局作用域写using namespace 160
不要这样做 160
消除歧义 161
使用using 162
符号去了哪里 163
一个更加隐蔽的问题 166
解决作用域解析运算符的杂乱问题 168
诱惑与堕落 169
小结 169
第4章 正确使用新特性 171
4.1 F.21:优先选择结构体或元组返回多个“输出”值 172
函数签名的形式 172
文档和注解 173
现在可以返回对象了 174
也可以返回元组 177
使用非const引用传递和返回 179
小结 182
4.2 Enum.3:优先选择class枚举而不是“普通”枚举 183
常量 183
作用域枚举 185
基础类型 187
隐式转换 188
小结 190
后记 190
4.3 ES.5:保持作用域短小 191
作用域的性质 191
块作用域 192
名字空间作用域 193
类作用域 196
函数参数作用域 198
枚举作用域 199
模板参数作用域 200
作用域作为上下文 201
小结 202
4.4 Con.5:使用constexpr表示编译时可以计算的值 203
从const到constexpr 203
默认的C 205
使用constexpr 206
inline 210
constevel 211
constinit 212
小结 213
4.5 T.1:使用模板提高代码的抽象层次 214
故事时间 214
提高抽象的层次 216
函数模板和抽象 218
类模板和抽象 220
命名很难 222
小结 223
4.6 T.10:为所有模板参数指定概念 224
来龙去脉 224
约束你的参数 226
如何抽象你的概念 229
通过概念分解 232
小结 233
第5章 默认写出好代码 234
5.1 P.4:在理想情况下,程序应具有静态类型安全性 235
类型安全是C 的一项安全特性 235
联合体 237
类型转换 238
无符号数 241
缓冲区和大小 244
小结 245
5.2 P.10:优先选择不可变数据而不是可变数据 246
错误的默认设置 246
函数声明中的常量性 248
小结 252
5.3 I.30:封装违反规则的部分 253
隐藏生活中不悦目的东西 253
保全体面 255
小结 260
5.4 ES.22:初始值确定后再声明变量 261
表达式和语句的重要性 261
C风格的声明 262
先声明后初始化 263
尽可能推迟的声明 264
上下文特定功能的局部化 266
消除状态 268
小结 270
5.5 Per.7:为促成优化而设计 271
帧率*大化 271
离硬件更远之后 273
通过抽象进行优化 276
小结 278
5.6 E.6:使用RAII防止泄漏 279
确定性析构 279
文件泄漏 281
为什么要做这些 284
似乎还是有点儿多:未来的可能性 286
从哪里获得这些工具 289
后记 291
跋 293
【C 核心准则精选】
P.2:使用ISO标准C 编写代码(1.1节)[ 可以在GitHub或者GitHub Pages上找到C Core Guidelines,查看详细内容。]
P.4:在理想情况下,程序应具有静态类型安全性(5.1节)
P.10:优先选择不可变数据而不是可变数据(5.2节)
P.11:将凌乱的构造封装起来,而不是使其散布于代码中(2.1节)
I.3:避免使用单例(3.2节)
I.11:切勿通过原生指针(T*)或引用(T&)转移所有权(3.1节)
I.23:尽量减少函数参数(2.2节)
I.26:使用C风格子集获取跨编译器的ABI(2.3节)
I.30:封装违反规则的部分(5.3节)
F.21:优先选择结构体或元组返回多个“输出”值(4.1节)
F.51:在有选择的情况下,优先使用默认参数而非重载(1.2节)
C.45:不要定义仅初始化数据成员的默认构造函数,而应该使用类内成员初始化(1.3节)
C.47:按声明的顺序定义并初始化成员变量(2.4节)
C.90:使用构造函数和赋值运算符,而不是memset和memcpy(3.3节)
C.131:避免平凡的get和set函数(1.4节)
Enum.3:优先选择class枚举而不是“普通”枚举(4.2节)
ES.5:保持作用域短小(4.3节)
ES.10:每条语句只声明一个名字(1.5节)
ES.22:初始值确定后再声明变量(5.4节)
ES.50:不要用强制转换去除const限定符(3.4节)
Per.7:为促成优化而设计(5.5节)
CP.3:尽量减少可写数据的显式共享(2.5节)
E.6:使用RAII防止泄漏(5.6节)
E.28:避免基于全局状态(如errno)的错误处理(3.5节)
Con.5:使用constexpr表示编译时可以计算的值(4.4节)
T.1:使用模板提高代码的抽象层次(4.5节)
T.10:为所有模板参数指定概念(4.6节)
T120:只在真正需要时使用模板元编程(2.6节)
SF.7:不要在头文件的全局作用域写using namespace(3.6节)
NR.2:不强求函数只用一条return语句(1.6节)
作者简介
J. Guy Davidson于1980年通过Acorn Atom首次接触编程。他青少年时代的大部分时间都在各种家用电脑上编写游戏。后来,他从苏塞克斯大学获得了数学学位,开始涉足戏剧,还在一个灵魂乐队中担任键盘手。20世纪90年代初,他决定编写演示程序,并于1997年开始在Codemasters的伦敦办公室工作,从此进入游戏行业。1999年,Davidson加入了Creative Assembly,现在是那里的工程实践主管。他主要负责《全面战争》(Total War)系列游戏的工作,整理早期的游戏目录,以及提升工程团队成员的编程水平。他是IGGI咨询委员会、BSI C 小组和ISO C 委员会的委员,还是ACCU(Association of C/C Users,C/C 用户协会)负责C 标准相关事宜的成员,并在ACCU的编程委员会任职。他是#include c Discord服务器的管理员。他担任多个组织的行为准则负责人,在C 会议和各种聚会上发言,特别是关于在标准库中增加线性代数的议题。Kate Gregory接触编程、与几位*亲密的朋友结识,以及丈夫的相识,都发生在1977年的滑铁卢大学,所有这些她从未后悔过。她的学位是化学工程,这正说明你很难从一个人的学位中看出什么。她在加拿大安大略省乡下的地下室有一个小房间,里面放着一些古老的计算机:PET、C64、手工焊接的6502系统等,她把这些作为那个单纯年代的纪念品。自1986年起,她与丈夫一起经营Gregory咨询公司,帮助世界各地的客户更好地开展业务。Kate曾在五个大洲做过主题演讲,爱发掘一些改变认知的真相,然后与人分享,她还投入大量的时间在各种C 活动中做志愿者。其中“#include c ”是她的*爱,该社区正在改变这个行业,使其更受欢迎也更具包容性。他们的Discord服务器是一处温馨的场所,初学者在那里可以学习C ,也可以为WG21合写文章以改变我们所使用的编程语言,或者做任何介于两者之间的事情。J. Guy Davidson于1980年通过Acorn Atom首次接触编程。他青少年时代的大部分时间都在各种家用电脑上编写游戏。后来,他从苏塞克斯大学获得了数学学位,开始涉足戏剧,还在一个灵魂乐队中担任键盘手。20世纪90年代初,他决定编写演示程序,并于1997年开始在Codemasters的伦敦办公室工作,从此进入游戏行业。1999年,Davidson加入了Creative Assembly,现在是那里的工程实践主管。他主要负责《全面战争》(Total War)系列游戏的工作,整理早期的游戏目录,以及提升工程团队成员的编程水平。他是IGGI咨询委员会、BSI C 小组和ISO C 委员会的委员,还是ACCU(Association of C/C Users,C/C 用户协会)负责C 标准相关事宜的成员,并在ACCU的编程委员会任职。他是#include Discord服务器的管理员。他担任多个组织的行为准则负责人,在C 会议和各种聚会上发言,特别是关于在标准库中增加线性代数的议题。Kate Gregory接触编程、与几位*亲密的朋友结识,以及丈夫的相识,都发生在1977年的滑铁卢大学,所有这些她从未后悔过。她的学位是化学工程,这正说明你很难从一个人的学位中看出什么。她在加拿大安大略省乡下的地下室有一个小房间,里面放着一些古老的计算机:PET、C64、手工焊接的6502系统等,她把这些作为那个单纯年代的纪念品。自1986年起,她与丈夫一起经营Gregory咨询公司,帮助世界各地的客户更好地开展业务。Kate曾在五个大洲做过主题演讲,爱发掘一些改变认知的真相,然后与人分享,她还投入大量的时间在各种C 活动中做志愿者。其中“#include ”是她的*爱,该社区正在改变这个行业,使其更受欢迎也更具包容性。他们的Discord服务器是一处温馨的场所,初学者在那里可以学习C ,也可以为WG21合写文章以改变我们所使用的编程语言,或者做任何介于两者之间的事情。
译者:王江平,Autodesk软件开发工程师,毕业于同济大学/上海交通大学,爱编程,爱读书,爱翻译,爱C 。译有《C#3.0设计模式》、《敏捷开发的艺术》、《软件开发者路线图》、《Java语言精粹》、《Python计算与编程实践》、《Cucumber:行为驱动开发指南》等书籍。(微博@steedhorse,欢迎交流)
-
乡村振兴新技术:新时代农村短视频编辑技术基础入门
¥12.8¥32.0 -
AI绘画+AI摄影+AI短视频从入门到精通
¥45.5¥79.8 -
企业AI之旅
¥43.5¥79.0 -
机器学习
¥59.4¥108.0 -
基于知识蒸馏的图像去雾技术
¥61.6¥88.0 -
软件设计的哲学(第2版)
¥51.0¥69.8 -
智能算法优化及其应用
¥52.4¥68.0 -
Photoshop图像处理
¥25.5¥49.0 -
R语言医学数据分析实践
¥72.3¥99.0 -
大模型推荐系统:算法原理、代码实战与案例分析
¥62.3¥89.0 -
剪映 从入门到精通
¥25.7¥59.8 -
游戏造梦师----游戏场景开发与设计
¥67.6¥98.0 -
SAR图像处理与检测
¥35.4¥49.8 -
人工智能
¥29.4¥42.0 -
中文版PHOTOSHOP 2024+AI修图入门教程
¥59.3¥79.0 -
WPS办公软件应用
¥25.2¥36.0 -
格拉斯曼流行学习及其在图像集分类中的应用
¥13.7¥28.0 -
轻松上手AIGC:如何更好地向CHATGPT提问
¥40.3¥62.0 -
元宇宙的理想与现实:数字科技大成的赋能与治理逻辑
¥61.6¥88.0 -
云原生安全:攻防与运营实战
¥66.8¥89.0