《C++实战》:20年老兵的经验分享

发表时间: 2022-01-24 10:07

“C++是一种威力十足的编程语言,如果 C 带给你足够‘绞死’自己的绳索,C++就是间五金店, 里面挤满了准备为你绑绳结的人。” ——来自《Effective C++》一书

20年老兵心法

简洁易懂的避坑指南

让C++不再难学!

《C++实战》

源代码下载
高效编程软技能
安全、优雅的代码
语言和库的【开发】
好用、实用的C++特性

C++编程语言,堪称编程语言中的“全能选手”,它不仅功能强大、灵活,而且适用场景非常广泛。但是要想真正掌握 C++,其技术门槛往往较高,这也使“新手”学起来困难,甚至连“老手”也觉得用好它并不容易。

本书根据作者 20 多年编写 C++代码的实践经验,精选出了现代 C++中好用且实用的若干特性,通过代码演示实战技巧,帮助读者轻松地看懂、学会 C++编程。本书从开发环境、开发综述、核心语言特性、标准库、进阶技能、设计模式、应用实例等方面深入浅出地介绍了 C++实战技巧。除此之外,本书还囊括了作者多年的开发心得,例如图书推荐、工作经验分享、时间管理方法等特色内容。

本书并不是一本入门教程,比较适合学过 C++基础知识,仍缺乏高效的 C++实战技巧的读者阅读。通过阅读本书,读者可以深入洞悉 C++核心知识,进一步夯实实战技能,开拓编程思路。

该怎么学好、用好 C++呢?

我的建议是,尽量从 C++的最新标准开始学,例如现在的 C++17/C++20。这两个版本的 C++ 虽然比以前版本的复杂了很多,但也添加了很多方便、易用的新特性,更接近“现代编程语言”。 只要小心取舍,就可以少遇到那些传统编程方式的“坑”。

为什么要选择《C++实战》

在学习 C++的过程中, 你可能会有这样的感慨:

“道理我都懂,可用起来还是会犯怵,要是身边能有个人来指点一下该多好。”

不知道你刚毕业的时候公司有没有为你安排过“入职导师”,他会带你熟悉环境,制订培养计 划,让你尽快成长为一名合格的职场人。

现有的大部分 C++图书往往只能教你基本的知识。而学习 C++时, 通常你最缺乏的就是“入 职导师”,以帮你跨越从课堂到现实的“鸿沟”,告诉你实际工作时会遇到哪些问题,这些问题又 该怎么解决。

很可惜, 大多数人,也包括我,当初学 C++的时候都没有遇到这样的好导师,一切都要靠自 己摸索。虽然说“实践出真知”,最终仍有所成就,但也浪费了不少大好年华。

所以,在本书里,作者会从庞大的 C++中“裁剪”出一个精致的子集,挑选出适合实际应用的 C++特性,还会把踩过的坑、走过的弯路、收获的果实都毫无保留地分享给你,希望本书能够担 当起“入职导师”/ “引路人”的角色。

总而言之,本书的目标就是一切从实际出发,只讲“实实在在、脚踏实地”的 C++知识,注重语言和库的“开发”,而不会讲那些高深的理论和玄乎的技巧,更不会去讲所谓的“屠龙之术”, 尽量用实例来演示“现代 C++”的自然思维方式。

关于《C++实战》

C++是编程语言中的“全能选手”,它不仅功能强大、灵活, 而且运行和处理速度也很快, 适 用场景非常广泛。21 世纪以来的许多编程语言都从它身上获得了灵感(如 Go/Rust/Swift 等), 无论我们是否使用 C++开发程序,在学习它的时候都能够有所收获。

但说起 C++, 很多人还会有另一个反应— “出了名的难学难用”。

的确如此,因为 C++实在是太复杂了,有太多的特性和细节。

随着标准版本的演进,C++包含的东西也越来越多。不断“膨胀”的核心语言加上庞大的标 准库,让学习使用 C++的门槛在无形中提高了很多, 不仅“新手”学起来很难, 就连“老手”也 觉得用好它并不是一件容易的事情, 总是不可避免地会遇见一些难题。

  • C++太庞大、复杂了, 该怎么抓住重点去学习?
  • 写出的 C++代码和 C 代码没多大区别,面向对象的本质到底是什么?
  • 时间和精力有限,用哪些现代 C++特性能够迅速提高代码质量?
  • C++太底层, 没有垃圾回收,总是担心内存泄漏, 该如何解决?
  • 标准库的内容这么多, 核心的工具有哪些?该怎么用?
  • 不想自己“造轮子”,但开源的 C++库良莠不齐, 究竟哪些库最好用?
  • 都说 C++性能高,但自己写出来的代码却不尽如人意, 该如何改进?
  • ……

本书尝试为以上难题提供一个合理、可验证的答案。

作者根据自己多年编写 C++代码的实践经验,精选出了现代 C++中较好用、较实用的若干特性, 不讲那些烦琐的语法和原理,而是直入主题,通过代码演示实战技巧,减少深研理论的时间成本, 尽可能让读者轻松地看懂、学会。

在讲解核心特性和工具的过程中,本书也会带领读者绕开语言细节、资源管理、库/工具等方 面的陷阱,借鉴前人的经验,避开前人踩过的坑, 从而高效地写出更安全、更优雅的代码, 解决 C++难学、难用、难调试、难优化的问题。

读者对象

本书适合以下读者。

初步掌握 C++开发,但又对 C++的庞大和复杂感到力不从心的软件工程师。 了解或者熟悉 C/C++, 想深入研究现代 C++以提升开发效率的软件工程师。

不以 C++为主要编程语言, 但想要借助 C++开拓思路、实现混合编程的软件工程师。 有志于投身软件开发和互联网行业的计算机编程爱好者和高校学生。

读者要求

因为本书并不是一本入门教材,所以读者首先应当具备基本的 C++编程语言知识,如语法、 关键字、算术/逻辑运算、流程控制语句等,否则在阅读示例代码时可能会存在困难。

现代 C++中大量应用了面向对象编程和泛型编程,读者还应当对这两个领域的知识有足够的 了解,如知道如何用 class 定义一个类,如何用public 或private 定义成员变量或成员函数, 如何用 template 编写泛型类或泛型函数等。

如果读者暂时对这些知识比较陌生, 可以参考本书附录的推荐书目, 再对照着阅读本书。

《C++实战》的结构

全书共 8 章, 各章的内容简介如下。

第 1 章:C++开发环境。

本章介绍运行书中 C++代 码所 需的操 作系 统和编 译器 ,然后 讲解 使用 VM/ Docker/ Kubernetes 等技术搭建对应的实验环境,以方便后续的学习和研究。

第 2 章:C++开发综述。

本章从总体上论述 C++的基本开发原则和注意事项。首先简要介绍目前 C++已有的各大标准 版本,然后讲解 C++的编码、预处理、编译和运行 4 个阶段, 以及面向过程、面向对象、泛型编 程、模板元编程、函数式编程五大编程范式,再以生命周期为切入点,详细讲解各个阶段的特点 和应用技巧, 如编码规范、条件编译、静态断言等。

第 3 章:C++核心语言特性。

现代 C++语言规模非常庞大,学习成本很高。本章删繁就简,重点讲解 C++中 5 类常用特性 (面向对象编程、自动类型推导、常量与变量、异常、函数式编程),此外还简略介绍一些虽然小 但很实用的特性,如内联名字空间、强类型枚举等。

第 4 章:C++标准库。

标准库是 C++的重要组成部分,本章剖析其中关键的数个组件,包括智能指针、字符串、标 准容器、特殊容器、标准算法、线程开发等,讲解过程也并非简单地罗列接口,而是侧重于分类 归纳、特性解析、实际经验和教训, 以帮助读者快速理解和掌握标准库。

第 5 章:C++进阶技能。

语言和标准库只是 C++开发的基础,在它们之外还有更广大的开源社区,开源社区提供了大 量开源库,而用好开源库能够让 C++开发更便捷、高效。本章精心挑选一些高质量的第三方库和 工具介绍给读者, 如准标准库 Boost、数据序列化库
JSON/MessagePack/ProtoBuffer、网 络 通 信 库 libcurl/cpr/cinatra/ZMQ 、 多 语 言 混 合 编 程 , 以 及 运 行 阶 段 的 top/perf/FameGraph 等各种性能分析工具

第 6 章:C++与设计模式。

设计模式和设计原则是指导软件开发的“金科玉律”,本章主要阐述其中的一些经典原则和模 式, 如 SOLID 、DRY 、KISS、工厂、策略、对象池等, 并以实例示范 C++中是如何应用这些原则 和模式的。

第 7 章:C++应用实例。

本章以一个简单的 C/S 架构书店程序为实例,应用前文讲解的众多语言工具和库,讲解从需求到 设计、编码、编译、运行、验证的 C++项目全过程,帮助读者把所学的 C++知识从书面落到实地。

第 8 章:结束语。

作为全书的结束语,本章简略谈论我对 C++的感受和看法,也对如何学习 C++提出了一些建议。

如何阅读本书

因为目前 C++开发环境比较混乱, 编译器版本不统一的情况非常严重,所以读者首先应当阅 读第 1 章, 了解本书使用的操作系统和编译器,在这个“基准”开发环境中较好地学习现代 C++ 。

如果读者是 C++初学者,可以从第 2 章开始顺序阅读,自顶向下、循序渐进地熟悉 C++的 语言特性和标准库组件,同时利用 GitHub 上的源码资源,多动手实践,强化学习效果。

如果读者已经对 C++有较多的使用经验,就可以尝试以目录为索引, 查找比较感兴趣或者 认知比较模糊的部分,针对性地“查缺补漏”,补足开发短板, 完善 C++知识体系。

第 6 章和第 7 章分别从理论和实践两个方面对本书进行全面的总结,建议读者学习完前文 后认真阅读并思考,争取举一反三,让自己对 C++的认识“更上一层楼”。