内容简介
·展现C++思考方式,以便充分利用该语言中影响深远的功能来开发高效的解决方案。
·阐释鲜为人知的元素,披露避开常见陷阱的技巧,分享提示、技巧和方案,以帮助提高工作效率和软件性能。
·列出富有挑战、贴近实用、具有多种用途的代码段,可根据需要将这些代码段移植到任何项目中。
·浓墨重彩地描述C++17的新功能,如结构化绑定、嵌套的名称空间和constexprif等。
·深入讨论C++17新的标准库功能,比如string_view、optional类、并行算法和文件系统API等。
作者简介
MarcGregoire是一名软件工程师,毕业于比利时鲁文大学,拥有计算机科学工程硕士学位。之后,他在鲁文大学获得人工智能专业的优等硕士学位。完成学业后,他开始为软件咨询公司OrdinaBelgium工作。他曾在Siemens和NokiaSiemensNetworks为大型电信运营商提供有关在Solaris上运行关键2G和3G软件的咨询服务。
这份工作要求与来自南美、美国、欧洲、中东、非洲和亚洲的国际团队合作。Marc目前担任NikonMetrology(www.nikonmetrology.com)的软件架构师;NikonMetrology是Nikon的分公司,是领先的精密光学仪器和3D扫描软件供应商。
Marc的主要技术专长是C/C++,特别是MicrosoftVC++和MFC框架。他还擅长在Windows和Linux平台上开发24×7小时运行的C++程序,例如KNX/EIB家庭自动化监控软件。除了C/C++之外,Marc还喜欢C#,并且会用PHP创建网页。
2007年4月,他凭借VisualC++方面的专业技能,获得了微软年度MVP称号。
Marc还是比利时C++用户组(www.becpp.org)的创始人,是C++StandardLibraryQuickReference(Apress)一书的作者,以及多家出版社出版的多《C++高级编程(第4版)》籍的技术编辑,是CodeGuru论坛上的活跃分子(id为MarcG)。Marc还在www.nuonsoft.com/blog/上维护了一个博客,他热爱旅游和烹饪。
目录
第I部分专业的C++简介
第1章C++和标准库速成2
1.1C++基础知识2
1.1.1小程序“helloworld”3
1.1.2名称空间.5
1.1.3字面量6
1.1.4变量7
1.1.5运算符8
1.1.6类型10
1.1.7条件语句12
1.1.8逻辑比较运算符14
1.1.9函数15
1.1.10C风格的数组16
1.1.11std::array17
1.1.12std::vector17
1.1.13结构化绑定18
1.1.14循环18
1.1.15初始化列表19
1.1.16这些都是基础19
1.2深入研究C++20
1.2.1C++中的字符串20
1.2.2指针和动态内存20
1.2.3const的多种用法24
1.2.4引用24
1.2.5异常25
1.2.6类型推断26
1.3作为面向对象语言的C++27
1.3.1定义类27
1.3.2使用类29
1.4统一初始化29
1.5标准库31
1.6第一个有用的C++程序31
1.6.1雇员记录系统32
1.6.2Employee类32
1.6.3Database类34
1.6.4用户界面36
1.6.5评估程序38
1.7本章小结38
第2章使用string和string_view39
2.1动态字符串39
2.1.1C风格的字符串39
2.1.2字符串字面量41
2.1.3C++std::string类42
2.1.4std::string_view类46
2.1.5非标准字符串47
2.2本章小结47
第3章编码风格48
3.1良好外观的重要性48
3.1.1事先考虑48
3.1.2良好风格的元素49
3.2为代码编写文档49
3.2.1使用注释的原因49
3.2.2注释的风格52
3.3分解55
3.3.1通过重构分解56
3.3.2通过设计来分解56
3.3.3《C++高级编程(第4版)》中的分解56
3.4命名56
3.4.1选择恰当的名称57
3.4.2命名约定57
3.5使用具有风格的语言特性59
3.5.1使用常量59
3.5.2使用引用代替指针59
3.5.3使用自定义异常59
3.6格式60
3.6.1关于大括号对齐的争论60
3.6.2关于空格和圆括号的争论61
3.6.3空格和制表符61
3.7风格的挑战61
3.8本章小结62
第II部分专业的C++软件设计
第4章设计专业的C++程序64
4.1程序设计概述64
4.2程序设计的重要性65
4.3C++设计的特点66
4.4C++设计的两个原则67
4.4.1抽象67
4.4.2重用68
4.5重用代码69
4.5.1关于术语的说明69
4.5.2决定是否重用代码70
4.5.3重用代码的策略71
4.5.4绑定第三方应用程序74
4.5.5开放源代码库75
4.5.6C++标准库76
4.6设计一个国际象棋程序76
4.6.1需求76
4.6.2设计步骤77
4.7本章小结80
第5章面向对象设计82
5.1过程化的思考方式82
5.2面向对象思想83
5.2.1类83
5.2.2组件83
5.2.3属性83
5.2.4行为84
5.2.5综合考虑84
5.3生活在对象世界里85
5.3.1过度使用对象85
5.3.2过于通用的对象85
5.4对象之间的关系86
5.4.1“有一个”关系86
5.4.2“是一个”关系(继承)87
5.4.3“有一个”与“是一个”的区别88
5.4.4not-a关系90
5.4.5层次结构91
5.4.6多重继承91
5.4.7混入类92
5.5抽象93
5.5.1接口与实现93
5.5.2决定公开的接口93
5.5.3设计成功的抽象94
5.6本章小结95
第6章设计可重用代码96
6.1重用哲学96
6.2如何设计可重用代码97
6.2.1使用抽象97
6.2.2构建理想的重用代码98
6.2.3设计有用的接口102
6.2.4SOLID原则106
6.3本章小结106
第III部分专业的C++编码方法
第7章内存管理108
7.1使用动态内存108
7.1.1如何描绘内存109
7.1.2分配和释放110
7.1.3数组111
7.1.4使用指针116
7.2数组-指针的对偶性117
7.2.1数组就是指针117
7.2.2并非所有指针都是数组119
7.3低级内存操作119
7.3.1指针运算119
7.3.2自定义内存管理120
7.3.3垃圾回收120
7.3.4对象池121
7.4智能指针121
7.4.1unique_ptr122
7.4.2shared_ptr124
7.4.3weak_ptr125
7.4.4移动语义126
7.4.5enable_shared_from_this127
7.4.6旧的、过时的/取消的auto_ptr127
7.5常见的内存陷阱127
7.5.1分配不足的字符串127
7.5.2访问内存越界128
7.5.3内存泄漏128
7.5.4双重删除和无效指针131
7.6本章小结131
第8章熟悉类和对象132
8.1电子表格示例介绍132
8.2编写类133
8.2.1类定义133
8.2.2定义方法135
8.2.3使用对象137
8.3对象的生命周期138
8.3.1创建对象138
8.3.2销毁对象149
8.3.3对象赋值149
8.3.4编译器生成的复制构造函数和复制赋值运算符151
8.3.5复制和赋值的区别151
8.4本章小结153
第9章精通类与对象154
9.1友元154
9.2对象的动态内存分配155
9.2.1Spreadsheet类155
9.2.2使用析构函数释放内存157
9.2.3处理复制和赋值158
9.2.4使用移动语义处理移动162
9.2.5零规则167
9.3与方法有关的更多内容167
9.3.1静态方法167
9.3.2const方法168
9.3.3方法重载169
9.3.4内联方法170
9.3.5默认参数171
9.4不同的数据成员类型172
9.4.1静态数据成员172
9.4.2静态常量数据成员173
9.4.3引用数据成员174
9.4.4常量引用数据成员175
9.5嵌套类175
9.6类内的枚举类型176
9.7运算符重载177
9.7.1示例:为SpreadsheetCell实现加法177
9.7.2重载算术运算符179
9.7.3重载比较运算符181
9.7.4创建具有运算符重载的类型181
9.8创建稳定的接口182
9.9本章小结184
第10章揭秘继承技术185
10.1使用继承构建类185
10.1.1扩展类186
10.1.2重写方法188
10.2使用继承重用代码194
10.2.1WeatherPrediction类194
10.2.2在派生类中添加功能195
10.2.3在派生类中替换功能196
10.3利用父类196
10.3.1父类构造函数196
10.3.2父类的析构函数197
10.3.3使用父类方法198
10.3.4向上转型和向下转型200
10.4继承与多态性201
10.4.1回到电子表格201
10.4.2设计多态性的电子表格单元格201
10.4.3SpreadsheetCell基类202
10.4.4独立的派生类203
10.4.5利用多态性204
10.4.6考虑将来205
10.5多重继承206
10.5.1从多个类继承206
10.5.2名称冲突和歧义基类207
10.6有趣而晦涩的继承问题209
10.6.1修改重写方法的特征209
10.6.2继承的构造函数211
10.6.3重写方法时的特殊情况214
10.6.4派生类中的复制构造函数和赋值运算符219
10.6.5运行时类型工具220
10.6.6非public继承221
10.6.7虚基类221
10.7本章小结222
第11章理解灵活而奇特的C++223
11.1引用223
11.1.1引用变量224
11.1.2引用数据成员225
11.1.3引用参数225
11.1.4将引用作为返回值226
11.1.5右值引用226
11.1.6使用引用还是指针227
11.2关键字的疑问229
11.2.1const关键字229
11.2.2static关键字232
11.2.3非局部变量的初始化顺序235
11.2.4非局部变量的销毁顺序235
11.3类型和类型转换235
11.3.1类型别名235
11.3.2函数指针的类型别名236
11.3.3方法和数据成员的指针的类型别名238
11.3.4typedef238
11.3.5类型转换239
11.4作用域解析242
11.5特性243
11.5.1[[noreturn]]特性243
11.5.2[[deprecated]]特性244
11.5.3[[fallthrough]]特性244
11.5.4[[nodiscard]]特性244
11.5.5[[maybe_unused]]特性244
11.5.6供应商专用特性245
11.6用户定义的字面量245
11.7头文件246
11.8C的实用工具247
11.8.1变长参数列表247