推 荐 序 一
给《C++20高级编程(第5版)》写了推荐序后,时隔3年,我很高兴看到更新版的《C++23高级编程》问世了。
本书延续之前版本备受赞誉的优点,是一本真正从程序员视角出发、专为程序员量身打造的实用教材,能帮助初、中级C++程序员全面提升其C++专业技能。作者以深厚的专业功底和丰富的一线编程经验,精心打造了这本佳作,提供了完整的到C++23为止的C++语言介绍,从入门语法、高级技巧到软件工程,做了全方位、无死角的介绍,每个知识点都讲解得细致入微。无论你想系统学习C++,还是要找其中某些语法点的参考资料,都将收获实实在在的帮助。
与某些C++教材不同,本书不是简单地在以前的版本上打个小补丁出来卖钱,而是根据当前C++标准(C++23)进行了全面更新。从最基本的Hello World程序,读者就能看到与传统的C++程序的不同:代码使用了import std和std::println这两个新特性,而非使用#include和std::cout。而后面讨论较新特性的时候,也莫不如此,比如,几乎处处可以看到模块和println。类似地,另外一些“较新”的C++特性(如C++17的string_view和结构化绑定,C++20的三向比较运算符,等等),也较早得到介绍,并在书中多次出现。如果你新学C++的话,可不带历史包袱地看到一门现代的高性能编程语言。如果你之前学过一点C++,也可细细品味现代C++带来的不同,特别是模块引入后对代码组织产生的巨大影响。
既然是个新版本,中文书名里又有“C++23”,本书当然要重点描述C++23的特性。除了标准库模块和print/println,C++23的主要新特性——如显式对象参数、mdspan和Unicode表示改进——书里也都进行了介绍。在描述C++23特性时,书的侧边通常会出现特殊的带圈“C++23”标记,非常清晰。
本书的英文主书名与上一版相同,都是Professional C++,自然,它希望你能专业地对待C++编程。本书的内容编排也十分合理。
第I部分包括三章,以较短篇幅介绍了C++的主要语法和功能,让你快速上手C++。
第II部分的三章不讲语言了,转而讲软件设计。毕竟,我们使用C++的目的是设计出好的软件。写程序不是工作目的。
第III部分是本书的重点,介绍C++编码方法。该部分占了全书的大部分章节和篇幅,具体讲解C++中的各个重要特性和库。日常用到的绝大部分功能,都会在这一部分讲到,如内存管理、基本模板、泛型、错误处理、容器、时间工具等。
第IV部分较为简短,有三章,描述了一些高级技巧,仍然是C++的技术内容。
第V部分又超越了C++语言本身,用了整整7章的篇幅讨论C++项目的软件工程问题,从软件生命周期、测试、调试、设计模式等各个角度进行探讨。这一部分的广度大于深度,对于项目经验不多的程序员来说,尤其有用。
要说我对这本书有什么意见的话,最主要就是作者对广度的追求了。对于某些不推荐(如bind)或不常用的特性,作者仍有所着墨;而对另一些内容(如协程),作者只是一带而过。因为某些特性不常用,描述中也容易发生问题,如14.8.3节的function-try-blocks例子中包含错误行为,29.3.2节的launder例子也有更简单的写法。不过,这也是作者自己的定位选择吧。此外,作者给出的建议里,至少有一项我持保留意见:作者建议把非final类的构造函数以外的方法全部设为virtual——这个建议,从我对C++的理解看,也许能适用于某些领域,但绝非放之四海皆准。事实上,标准库的类没有一个标成final,只有少数类中用到了virtual。
无论如何,作为一本中级教材,本书的表现堪称出色。作者的绝大部分建议都极具实用性和可靠性。相信随着学习程度的加深,读者自会有能力去辨别和领悟其中的精妙之处。
好书要有好的翻译。本书的译者有两位我打过交道,都是热心于C++知识传播的年轻才俊。初览译稿,便感受到内容相当清晰晓畅,对于这么厚重的一本大块头教材,也是殊为不易了。在此衷心盼望广大C++学习者都能从此书中受益,成长为更优秀的C++程序员。
吴咏炜
Boolan首席技术咨询师
《C++实战:核心技术与最佳实践》作者
推 荐 序 二
《C++高级编程》第1版是Nicholas A. Solter和Scott J. Kleper这两位颇具编程实战开发经验,曾在斯坦福大学任教编程课程,并具有多年C++应用开发经验的专家撰写的。该书的特点是总结了面向工程开发,特别是OOP技术的全套经验,用足了C++ STL标准库、设计模式,展示了优秀的代码效率、策略和风格。
《C++高级编程》第2版改版正值推出C++11标准的大变革前夜,由Marc Gregoire接手续写。Marc Gregoire更是一位C++大咖,长期跟踪C++发展前沿,从事C++应用研究与开发多年,与前两位作者的开发经历十分相似,并因其C++开发技能而荣获2007年度微软MVP称号。
《C++高级编程》第3版和第4版,是Marc Gregoire在综合应用开发技能的基础上,分别总结了C++14标准和C++17标准的特征而写就的。
到了《C++高级编程》第5版,中文书名直接改为《C++20高级编程(第5版)》,如此更为贴切,总结了C++20标准的特征,又视为C++应用开发方法上的新里程碑。最新的第6版《C++高级编程》,中文书名为《C++23高级编程(第6版)》,总结了很多C++23标准的特性,紧跟C++发展潮流。
王志强(“程序喵大人”主理人)本就是C++大咖,他辟有专门的编程公众号,常年发表C++博文,产出文章颇丰,他与我在C++开发者俱乐部@IncrediClub群相识,志趣相投,互相仰慕。
《C++23高级编程(第6版)》和《C++20高级编程(第5版)》都由王志强领衔翻译。我激情盈胸,这般心境,无以言表。看了几个样章,就觉得翻译语词确切而通畅,对于C++编程爱好者极易产生喜感。
学C++难,难在学了一些C++的点点滴滴,却不知如何上手编程应用,不知融会贯通,此书便可起到点拨的作用。看王志强之译作,入其所在C++开发者群,得其群助而诚可谓众人拾柴火焰高,必将事半而功倍。
钱能
浙江工业大学教授
推 荐 序 三
对于C++社区而言,2011年是个分水岭。那一年发布的C++11标准打破了此前长达十余年的版本沉寂。那一年Bjarne Stroustrup访华时,我在北京采访了他,并从他那里确认C++的版本发布将进入以三年为周期的“火车发车模式”;即从2011年起,每三年必发布新版本,而所有赶不上某一版本的语言特性将延迟至下一版本或更后面的版本发布。换言之,以Bjarne为首的C++标准委员会对于长期以来“版本等特性”造成的版本发布一再延误及由此带来的语言市场份额丢失痛定思痛,宁愿以“特性等版本”的做法矫枉过正。也是从那个时候起,C++的发展驶入快车道,也确实每三年发布一个新版本,目前最新的版本是C++23,而C++26也早已开始了关于哪些新特性会进入的热烈讨论,并对这些新特性展开了范围广泛的测试和反馈。而从C++11开始的版本,被统称为“现代C++”,以彰显与旧时代的分道扬镳。
的确,现代C++带来了太多强大的新特性,这些新特性从核心语法层次深深地改变了这个有着近40年历史的语言。通过auto和decltype,C++甚至在撰写第一行代码时也将触及泛型,而lambda表达式更是将函数式编程范式引入了语言。接受和适应此前不熟悉的编程范式对于任何程序员来说,都是一项巨大的挑战。更不用说诸如右值引用带来的观念冲击,以及constexpr对于变量生存期和生命周期的重新认识等等。即使是像静态成员变量默认值这样看起来人畜无害者,也能悄悄地引发关于源码文件组织上不小的策略变动。C++从来就以复杂厚重为特点,而现代C++的学习更是急切地需要一本全面、系统、及时更新的教材,才能满足广大C++社区成员的普遍需要。靠直接阅读标准文档,对于大多数人来说是不现实的,正如你不可能通过阅读辞典来写出好文章。而目前比较流行的权威教材,如Bjarne本人的《C++程序设计语言》和Stanley Lippman的C++ Primer,都已经久未更新,或未译成简体中文版。所以,在此时此刻,甚至数年之内,Marc Gregoire的这本《C++23高级编程(第6版)》都会是一本内容全、材料新、技术权威的C++理想教材。
我与Marc在CppCon上见过,并有幸聆听过他关于“设计和实现与STL良好配合的算法与数据结构”的演讲。今年的CppCon上他的演讲环节更是构成了主旨演讲的重要组成部分,可见他在C++标准中形成的贡献之巨。而这样一部鸿篇巨著,其翻译也所托得人。我与其中的何荣华同学借助网络平台彼此结识,至今已逾多年。现在何荣华也是使用C++作为日常工作的开发语言,以开发自动驾驶底层算法,可以说他的背景与Marc的早期开发经历相比甚至更具优势,因而也非常有潜力成为未来的C++标准委员会成员。通过阅读样章,我也感觉无论是技术准确性还是语言通畅性方面,译者团队都属于一流水准。作为《C++覆辙录》的译者,我当然感同身受地知道,译出这样的大部头需要投入怎样巨量的时间和心血。在此,诚挚地向广大C++社区成员和C++爱好者们推荐这部质量上乘的优秀作品。
高博,卷积传媒创始人
《C++覆辙录》译者
推 荐 序 四
C++标准委员会从2011年开始,每三年定期发布新标准,稳步增添语言特性,不断扩充标准库。光阴飞逝,C++11标准发布至今已十年余,而C++23也于最近正式面世,语言特性越来越丰富。若C++使用者有志于技术精进,则持续学习是不二途径。《C++23 高级编程(第6版)》恰如称手兵刃,能助读者在研习的征途上披荆斩棘。
《C++高级编程》历经6版修订,每一版本都更新相当篇幅,始终紧随技术发展趋势,与业界发展保持高度同步。目前涵盖C++23标准的书籍为数不多,本书正是其中之一。在前面I~IV部分,先以C++的核心基础为切入点快速起步,后续章节则对C++11~ C++23的新特性施以浓墨重彩的描绘,系统、全面地逐一展开讲解。书中文字平实,简明易懂;所举代码范例质量上乘,并且紧密贴合真实世界场景,而非与现实脱节的学院风格,值得认真揣摩仿效。作者还特意编排对比了C++的传统特性与新特性,譬如内存管理与智能指针、迭代器与范围、函数对象/函数指针与lambda等,让读者既能纵观语言全貌又能领会特性精华。更值得称许的是,这些部分并未局限于C++语言层面,还穿插了编码风格、代码复用和程序设计方法论等议题,引领读者提升编程的思维水平。
本书仅凭上述内容便足以领先,又因第V部分而更加脱颖超群。作者借C++为依托,在最后几个章节介绍了编程最佳实践的各种议题,包括软件工程方法、性能调优、测试除错、设计模式和框架开发等。这些领域举足轻重,且与编程开发密不可分,却鲜有编程书籍着墨,而往往以独立专著论述。第V部分承接前文对C++本身的讲解说明,向读者一鼓作气深入揭示代码背后的设计思想和一系列工程方法。我们学习C++,目的是为了编写规范代码,构建高质量软件。倘若拘泥于C++语言自身,仅掌握语法和运用特性,恐怕只能胜任最底层的编程任务。必须提升思想高度,超脱单纯的编程语言,采纳行之有效的设计理念,并运用工程手段。本书正好概括了编程实践经验的精髓,提供了学以致用的最佳指南,为读者开启了更高、更宽广的视角。一旦领悟本书阐述的思想,肯定能受益,明显提升工程能力,并为进一步研读相关专著奠定良好基础。
作者Gregoire先生长期从事软件开发,经验老到,本书凝聚了他(和以往版本合作者)的学识和经验。另一方面,四位译者都对C++语言怀有巨大热忱,他们当中既有在职C++程序员,又有计算机专业的在读研究生,前者在实际工作中直接运用新标准的C++特性,深谙各项技术细节,后者能从学习者的视角考虑译文的表达和遣词造句,四人合作促进了对原书的精准理解,从而保证了高品质翻译,相信读者必能从本书获得相当不错的学习体验。
吴天明
资深软件工程师
推 荐 序 五
在学习使用 C++的这些年里,我注意到 C++的语言、它的应用场景和C++程序员中有趣的相似与同构特征。C++这门语言特性丰富、历史包袱/积累厚重,全球440万 C++开发者使用它,构造了计算机工业的编译器、数据库、操作系统、求解器等基石,也夜以继日地为工业、科学、车船、生物医药等领域提供计算和控制的支撑。编程语言特性的丰富、应用场景的广泛、语言社区的多元等因素相互作用,推动了C++的演化,出现了STL这样的“天成”之作,造就了支持多种编程范式的“现代”C++,也培养了众多如作者Marc Gregoire 和译者何荣华这样的优秀C++程序员。
要将 C++这门语言用好,在参考书籍的选择方面值得动一点心思。当然,C++之父Bjarne Stroustrup撰写的 TCPPPL和Scott Meyers撰写的Effective系列属于必读。不过对于C++这样的语言,只选择几本公认的权威经典参考书恐怕还不足以覆盖专业程序员的日常参考需求。本书的英文原名为 Professional C++, Sixth Edition,读者如果浏览过本书目录,再随机翻开读上几页,就不难发现,这首先是一本优秀的专业案头参考书,适合放在键盘旁随时翻阅。Pro,意味着专业和职业。本书从一线编程实践的角度,结合代码实例,全面展示了C++语言特性。而更有价值的是,作者把C++的语言特性,包括库和相关的工具和方法论放到软件工程的大背景下,结合语言探讨了建模、测试、设计和发布等诸多话题。说是探讨,可能不大贴切,本书的语言风格平实精炼,更像工作中C++高手和专家针对某个具体问题给出的简短而确定的意见,点到为止,讲求实效。
作为 C++的同龄人,也作为用C++谋生和创作的码农,我再次感谢何荣华老师和他的合作者们将这本著作翻译出来,让它能帮助更多的同行写出更多专业而优美的 C++代码。也在此期待C++26 后本书的再次更新。
杨文波
资深嵌入式软件工程师
译 者 序
本书堪称经典之作,内容详实且丰富多元,不仅涵盖C++基础知识,还深入剖析了诸多C++高级特性,特别是C++23的新特性。目前介绍C++基础知识的书籍很多,但聚焦于C++23新特性的书籍却寥寥无几,而既介绍C++基础知识又介绍C++23新特性的书更是凤毛麟角。本书还重点介绍很多编程哲学,包括C++的设计方法论,从专业角度分析C++的编程艺术,并介绍C++的软件工程和调试技术。可以说本书的出版是C++开发人员的福音,本书既适合新手学习C++基础知识,又适合中高级开发者实现技术进阶,是C++领域一本不可多得的佳作。
近十年来,C++引入了很多新特性,有C++11新特性、C++14新特性、C++17新特性、C++20新特性,近期又更新了C++23新特性。作为一名C++程序员,很有必要了解语言最新的变革。读者在学习本书C++23新特性的时候,可以多做一层思考,思考为什么标准委员要引入此新特性。
若想跻身资深 C++开发人员之列,必须扎实理解C++语言的底层原理,了解编程哲学、软件工程方法论、设计、编码、测试、调试和优化等。令人欣喜的是,本书恰好涵盖了这些至关重要的知识,为有志于成为资深 C++开发人员的学习者提供了全面且系统的指引。
本书包括6部分。第I部分是专业的C++简介,第II部分介绍专业的C++软件设计,第III部分从专业角度分析C++编码方法,第IV部分讲解如何真正掌握C++的高级特性,第V部分重点介绍C++软件工程技术。最后,在附录部分提供了 C++技术面试、参考文献、 C++标准头文件和UML简要介绍。
近年来,软件开发领域掀起一股由人工智能驱动的新浪潮,术语“Vibe Coding”逐渐进入大众视野。为方便读者学习,本书特别附赠文档“Vibe Coding浪潮下的C++:审视、比较、适应与未来”,以深入探讨Vibe Coding的核心理念,帮助C++开发者和团队理解如何在AI时代合理地、负责任地利用新工具,同时坚守C++开发的核心原则。
对于这本经典之作,译者在翻译过程中始终秉持严谨态度,力求精准忠实于原文,深度再现原文风格。但鉴于译者水平有限,失误在所难免,如有任何意见和建议,请不吝指正。
感谢清华大学出版社编辑的精心组稿、认真审阅和细心修改,感谢妻子和父母在各个方面的支持和理解。
最后,希望读者通过阅读本书能在C++领域有更深的造诣,深度领略C++语言的独特魅力,进而达成“精通”C++的目标。
译者
作 者 简 介
Marc Gregoire是一位软件项目经理/软件架构师,深耕C/C++开发,尤精Microsoft VC++及MFC框架,拥有开发7×24小时运行于Windows和Linux平台的C++程序的经验(如KNX/EIB家庭自动化软件)。除了C/C++,Marc也擅长C#。
Marc是比利时C++用户组创始人,畅销技术图书Professional C++(第2~6版)的作者,C++ Standard Library Quick Reference(第1~2版)的共同作者,多家出版社多部技术书籍的特约编辑,CppCon C++大会常驻演讲嘉宾,CodeGuru论坛成员(用户名:Marc G)。自2007年以来,他凭借在Visual C++领域的技术影响力,连续十多年荣获微软MVP年度奖项。
Marc毕业于比利时鲁汶大学,先后获得计算机科学工程硕士学位和AI专业的高级硕士学位。职业生涯初期,Marc加入比利时软件咨询公司Ordina,担任技术顾问,主导开发Siemens 和Nokia Siemens Networks中面向电信运营商的关键2G/3G系统 (基于Solaris平台),项目团队横跨南美、美国、欧洲、中东、非洲及亚洲多地。Marc现任职于精密光学仪器与工业检测技术领军企业尼康计量(Nikon Metrology),负责X射线、CT及三维几何检测领域的软件架构设计与项目管理。
技术编辑简介
Bradley Jones精通多种编程语言和工具,从C语言到Unity,从Windows到移动设备平台(包括Web开发),甚至还涉足一些虚拟现实和嵌入式设备开发。除了编程,Bradley还撰写了关于C、C++、C#、Windows、Web等众多技术主题的书籍,以及一些非技术主题的书籍。Bradley是Lots of Software公司的创始人,并因其在行业内的影响力获得广泛认可。Bradley曾被授予微软MVP称号,担任CODiE奖评委,是国际技术演讲者,拥有多重身份和荣誉。
Arthur O’Dwyer是一位专业的C++培训师、软件工程师、作家,以及WG21委员会成员。Arthur是《精通C++17 STL》一书的作者,创立了CppCon的“回归基础”专题(2019),实现了libc++的<memory_resource>头文件(2022),并为C++20和C++23中的简化“隐式移动”语义做出了贡献。他与妻子居住在纽约。
致 谢
我要感谢John Wiley & Sons的编辑和制作团队对本书的支持。特别感谢组稿编辑Jim Minatel给了我撰写本书第6版的机会;感谢资深管理编辑Pete Gaughan、管理编辑Ashirvad Moses Thyagarajan、项目经理Kathryn Hogan博士、内容优化专家Archana Pragash及文稿编辑Kim Wimpsett。
特别感谢技术编辑Bradley Jones和Arthur O’Dwyer,他们对本书的技术准确性进行了核实。他们的反馈和大量贡献使本书更加完善,我对此深表感谢。
当然,我的父母和弟弟的支持与耐心对本书的完成也起到了至关重要的作用。我还要衷心感谢我的雇主Nikon Metrology在完成本项目期间给予我的支持。
最后,我要感谢你们——读者们,感谢你们多年来支持我的工作,并认可我在专业C++软件开发方面的这种写作方法,感谢你们对本书多个版本的持续关注与支持。
——Marc Gregoire
前 言
丹麦计算机科学家Bjarne Stroustrup于1982年发明了C++;C++继承于C,同时引入了类。1985年,发布了第一版的“C++程序设计语言”。第一个标准化版本的C++在1998年发布,称为C++98。在2003年,C++03发布并包含了一些小的更新。在那之后,C++沉默了一段时间,但吸引力开始慢慢增强,导致该语言在2011年进行了重大更新,称为C++11。从那以后,C++标准委员会以3年为周期发布更新的版本,出现了C++14、C++17、C++20及现在的C++23。总之,2023年发布了C++23之后,C++已经将近40岁了,并且仍然很强大。在2023年的大多数编程语言排名中,C++都排在前4位。它被广泛用于各种硬件,从带有嵌入式微处理器的小型设备一直到超级计算机。除了广泛的硬件支持,C++还可以用来完成几乎任何编程工作,包括移动平台上的游戏、对性能要求极高的人工智能(AI)和机器学习(ML)软件、自动驾驶汽车的组件、实时3D图形引擎、底层硬件驱动程序、完整的操作系统、网络设备的软件栈、网页浏览器等。C++程序很难与任何其他编程语言相匹配,因此,多年来,C++都是编写性能卓越、功能强大的企业级面向对象程序的事实标准语言。大型科技公司,如微软、Facebook、亚马逊、谷歌等,使用用 C++编写的服务来运行其基础设施。尽管C++语言已经风靡全球,但这种语言难以完全掌握。专业C++程序员使用一些简单但高效的技术,这些技术并未出现在传统教材中;即使是经验丰富的C++程序员,也未必完全了解C++中某些很有用的特性。
编程书籍往往重点描述语言的语法,而不是语言在真实世界中的应用。典型的C++教材在每一章中介绍语言中的大部分知识,讲解语法并列举示例。本书不遵循这种模式。本书并不讲解语言的大量细节并给出少量真实世界的场景,而是教你如何在真实世界中使用C++。本书还会讲解一些鲜为人知的让编程更简单的特性,以及区分编程新手和专业程序员的编程技术。
读者对象
就算使用C++已经多年,你仍可能不熟悉C++的一些高级特性,或仍不具有使用这门语言的全面能力。也许你编写过实用的C++代码,但还想学习更多有关C++中设计和良好编程风格的内容。也许你还不太了解最新版本 C++23 中引入的所有新特性。也许你是C++新手,想在入门时就掌握“正确”的编程方式。本书能满足上述需求,将你的C++技能提升到专业水准。
因为本书专注于将你从对C++具有基本或中等了解水平蜕变为一名专业C++程序员,所以本书假设你对该语言具有一定程度的认识。第1章涵盖C++的一些基础知识,可以当成复习材料,但是不能替代实际的语言培训和语言使用手册。如果你刚开始接触C++,但有十分丰富的C、Java或C#语言经验,那么应该能从第1章获得所需的大部分知识。
不管属于哪种情况,都应该具有很好的编程基础。应该知道循环、函数和变量。应该知道如何组织一个程序,而且应该熟悉基本技术,例如递归。应该了解一些常见的数据结构(如队列)及有用的算法(如排序和搜索)。不需要预先了解有关面向对象编程的知识—— 这是第5章讲解的内容。
你还应该熟悉开发代码时使用的编译器。稍后将简要介绍Microsoft Visual C++和GCC这两种编译器。要了解其他编译器,请参阅编译器自带的指南。
本书主要内容
阅读本书是学习C++语言的一种方法,通过阅读本书既能提升编码质量,又能提升编程效率。本书贯穿对C++23新特性的讨论。这些新的C++特性并不是独立在某几章中,而是穿插于全书,在有必要的情况下,所有例子都已更新为使用这些新特性。
本书不仅讲解C++语法和语言特性,还强调编程方法论、可重用的设计模式以及良好的编程风格。本书讲解的方法论覆盖整个软件开发过程——从设计和编码,到调试以及团队协作。这种方法可让你掌握C++语言及其独有特性,还能在大型软件开发中充分利用C++语言的强大功能。
想象一下有人学习了C++的所有语法但没有见过一个使用C++例子的情形。他所了解的知识会让他处于非常危险的境地。如果没有示例的引导,他可能认为所有源代码都要放在程序的main()函数中,还可能认为所有变量都应该为全局变量—— 这些都不是良好的编程实践。
专业的C++程序员除了理解语法外,还要正确理解语言的使用方式。他们知道良好设计的重要性、面向对象编程的理论及使用现有库的最佳方式。他们还开发了大量有用的代码并了解可重用的思想。
通过阅读和理解本书的内容,你也能成为一名专业的C++程序员。你在C++方面的知识会得到扩充,将接触到鲜为人知和常被误解的语言特性。你还将领略面向对象设计,掌握卓越的调试技能。最重要的或许是,通过阅读本书,你的头脑中有了大量“可重用”思想,可将这些思想贯彻到日常工作中。
有很多好的理由让你努力成为一名专业的C++程序员,而非只是泛泛了解C++。了解语言的真正工作原理有助于提升代码质量。了解不同的编程方法论和过程可让你更好地和团队协作。探索可重用的库和常用的设计模式可提升日常工作效率,并帮助你避免白费力气去做重复的工作。所有这些学习课程都在帮助你成为更优秀的程序员,同时成为更有价值的雇员。
本书结构
本书包括6部分。
第I部分“专业的C++简介”是C++基础速成教程,能确保读者掌握C++的基础知识。在速成教程后,该部分深入讨论字符串和字符串视图的使用,因为字符串在示例中应用广泛。该部分的最后一章介绍如何编写清晰易读的C++代码。
第II部分“专业的C++软件设计”介绍C++设计方法论。你会了解设计的重要性、面向对象方法论和代码重用的重要性。
第III部分“C++编码方法”从专业角度概述C++技术。你将学习在C++中管理内存的最佳方式,如何创建可重用的类,以及如何利用重要的语言特性,例如继承。你还会学习输入输出技术、错误处理、字符串本地化和正则表达式的使用,学习如何利用模块组织可重用的代码。该部分还会讨论如何实现运算符重载,如何编写模板,如何使用概念限制模板参数,以及如何解锁lambda表达式和函数对象的功能。该部分还解释了C++标准库,包括容器、迭代器、范围和算法。在该部分你还将了解标准中提供的一些附加库,例如用于处理时间、日期、时区、随机数和文件系统的库。
第IV部分“掌握C++的高级特性”讲解如何最大限度地使用C++。该部分揭示C++中神秘的部分,并描述如何使用这些更高级的特性。在该部分你将学习如何定制和扩充标准库以满足自己的需求、高级模板编程的细节(包括模板元编程),以及如何通过多线程编程来充分利用多处理器和多核系统。
第V部分“C++软件工程”重点介绍如何编写企业级质量的软件。在这部分你将学习当今编程组织的工程实践,如何编写高效的C++代码,软件测试概念(如单元测试和回归测试),C++程序的调试技术,如何在自己的代码中融入设计技术、框架和概念性的面向对象设计模式,跨语言和跨平台代码的解决方案等。
第VI部分是四个附录。附录A列出在C++技术面试中取得成功的指南,附录B是带注解的参考文献列表,附录C总结C++标准中的头文件,附录D简要介绍UML(Unified Modeling Language,统一建模语言)(附录A~D可通过扫描封底二维码获取)。
本书没有列出C++中每个类、方法和函数的参考。Peter Van Weert和Marc Gregoire撰写的C++17 Standard Library Quick Reference是C++17标准库提供的所有重要数据结构、算法和函数的浓缩版。附录B列出了更多参考资料。下面是两个很好的在线参考资料。
cppreference.com
可使用这个在线参考资料,也可下载其离线版本,在没有连接到互联网时使用。
cplusplus.com/reference/
本书正文中提到“标准库参考资料”时,就是指上述C++参考资料。
下面是其他的优质在线资源:
github.com/isocpp/CppCoreGuidelines
《C++核心指南》由C++语言发明人Bjarne Stroustrup牵头撰写。指南的目的是帮助人们有效地使用现代C++。这些指导方针侧重于较高级别的问题,如接口、资源管理、内存管理和并发。
github.com/Microsoft/GSL
这是微软的指南支持库(GSL)的一个实现,它包含了C++核心指南使用的函数和类型。这是一个只有头文件的库。
isocpp.org/faq
这是一个频繁被提问的C++问题的庞大集合。
stackoverflow.com
可以在这里搜索常见编程问题的回答,或者提出你自己的问题。
使用本书的条件
要使用本书,只需要一台带有C++编译器的计算机。本书只关注C++中的标准部分,而没有任何编译器厂商相关的扩展。
任何C++编译器
可使用任意C++编译器。如果还没有C++编译器,可下载一个免费的。这有许多选择。例如,对于Windows,可下载Microsoft Visual Studio Community Edition,这个版本免费且包含Visual C++;对于Linux,可使用GCC或Clang,它们也是免费的。
下面将简要介绍如何使用Visual C++和GCC。可参阅相关的编译器文档了解更多信息。
编译器与C++23功能支持
本书包含C++23标准引入的新功能。在撰写本书时,还没有编译器可以完全支持C++23的所有新功能。某些新功能仅由某些编译器支持,而其他编译器不支持,而有些功能尚不受任何编译器支持。编译器厂商正在努力支持所有新功能,我相信不久就会有完全符合C++23标准的编译器可用。可以在en.cppreference.com/w/cpp/compiler_support上查看哪些编译器支持哪些功能。
编译器与C++模块支持
在撰写本书时,还没有编译器可以完全支持C++的模块。不过,所有主流编译器至少部分支持。本书在各个地方都使用了模块。如果你的编译器尚不支持模块,可以将模块代码转换为非模块代码,具体方法在第11章中有简要说明。
示例:Microsoft Visual C++ 2022
首先需要创建一个项目。启动Visual C++ 2022,在欢迎界面上,单击Create A New Project按钮。如果没有出现欢迎界面,单击File | New | Project。在Create A New Project对话框中,使用C++、Windows和Console标签,找到Console App项目模板,然后单击Next按钮。指定项目的名称、保存位置,单击Create按钮。
加载新项目后,就会在Solution Explorer中看到项目文件列表。如果这个停靠窗口不可见,可选择View | Solution Explorer。一个新创建的项目会包括一个名为<projectname>.cpp的文件,就在Solution Explorer中Source Files部分的下方,可以在该文件中开始编写C++代码。如果想要编译源代码文件(扫描封底二维码获取本书源代码压缩文件),则必须在Solution Explorer中选择<projectname>.cpp文件并将其删除。在Solution Explorer中右击项目名,再选择Add | New Item 或Add | Existing Item,就可以给项目添加新文件或已有文件。
在撰写本书期间,Visual C++ 2022尚未自动启用C++23功能。要启用C++23功能,可在Solution Explorer窗口中右击项目,然后单击Properties。在Properties窗口中,选择Configuration Properties | General,根据使用的Visual C++版本,将C++ Language Standard选项设置为ISO C++23 Standard或Preview | Features from the Latest C++ Working Draft,并单击OK按钮。
最后,使用Build | Build Solution编译代码。没有编译错误后,就可以使用Debug | Start Debugging运行了。
注意:
Microsoft Visual C++完全支持模块,包括 C++23 标准中的命名模块std。
示例:GCC
用自己喜欢的任意文本编辑器创建源代码,保存到一个目录下。要编译代码,可打开一个终端,运行如下命令,指定要编译的所有.cpp文件:
g++ -std=c++2b -o <executable_name> <source1.cpp> [source2.cpp ...]
-std=c++2b用于告诉GCC启用对C++23功能的支持。当GCC完全兼容C++23后,这个选项将改为-std=c++23。
模块支持
在 GCC 中,使用-fmodules-ts选项可以启用对模块的支持。
在撰写本书时,GCC 尚不支持 C++23 标准中引入的命名模块std(在第 1 章中介绍)。为了使这类代码能够编译,你需要将import std声明替换为单个标准库头文件的import声明。完成替换后,对于标准库头文件的import声明(例如以下内容),你需要对它们进行预编译:
import <iostream>;
这是一个预编译<iostream>的示例:
g++ -std=c++2b -fmodules-ts -xc++-system-header iostream
例如,第 1 章中的 AirlineTicket 代码使用了模块。为了使用 GCC 编译它,首先将 std::println() 替换为 std::cout,因为在撰写本书时,GCC 尚不支持 <print> 功能。之后,将 import std; 声明替换为适当的 import 声明,在这个例子中是 <string> 和 <iostream>。你可在可下载的源代码归档中的 Examples\Ch00\AirlineTicket 目录中找到已适配的代码。
接下来,编译标准库头文件<iostream>和<string>:
g++ -std=c++2b -fmodules-ts -xc++-system-header iostream
g++ -std=c++2b -fmodules-ts -xc++-system-header string
编译模块接口文件:
g++ -std=c++2b -fmodules-ts -c -x c++ AirlineTicket.cppm
最后,编译应用代码:
g++ -std=c++2b -fmodules-ts -o AirlineTicket AirlineTicket.cpp
AirlineTicketTest.cpp AirlineTicket.o
当其通过编译后,你可以这样运行它:
./AirlineTicket
注意:
使用 GCC 编译 C++ 代码时,采用 C++ 模块的过程可能在未来发生变化。同时,C++23 标准中的命名模块 std 将得到支持。届时,请查阅 GCC 文档,了解如何编译此类代码的更新流程。
C++23的打印范围支持
第 2 章描述了你可以轻松地将标准库容器(如 std::vector)的整个内容打印到屏幕上。这是自 C++23 引入的新特性,在撰写本书时,并非所有编译器都已支持此功能。
例如,第 2 章解释了你可以按如下方式输出 std::vector 的内容。如果你还不理解所有语法,没关系,到第 2 章结束时你就会掌握。
std::vector values { 11, 22, 33 };
std::print("{:n}", values);
这将输出:
11, 22, 33
如果你的编译器尚不支持使用 std::print() 打印容器内容的 C++23功能,你可将代码的第二行改为以下内容:
for (const auto& value : values) { std::cout << value << ", "; }
这将输出:
11, 22, 33
同样,如果你现在还不理解语法,别担心,到第 2 章结束时一切都会变得清晰。
配套下载文件
读者在学习本书中的示例时,可以手动输入所有代码,也可使用本书附带的源代码文件。然而,我建议手动输入所有代码,这对于学习和你的记忆都是有益的。本书使用的所有源代码都可以扫描封底二维码下载。
下载代码后,只需要用自己喜欢的解压缩软件进行解压缩即可。
另外,读者可扫描封底二维码,下载本书附录(附录A~D)和本书习题答案。