学习大纲#
使用提示#
先看 基础 之后随意.
阅读顺序上, 基础 严格从上到下, 其他可以从上到下.
看书必须看前言, 技术书往往在前言写明了适用人群和阅读方法等.
常用网络资源#
更多见于 我的 C++ 浏览器书签 (2024/08/30) (右键另存为再导入到浏览器) 和 我的 C++ 订阅源 (2024/08/30) (右键另存为再导入浏览器 feedbro 插件).
基础#
严格从上到下.
入门#
看书记得看前言! 看书记得看前言! 看书记得看前言!
- 《Programming: Principles and Practice Using C++, 3rd Edition》(天鹅书, 个人译为《程序设计:使用C++的原理与实践(第3版)》, 第二版译本错译为《C++程序设计:原理与实践(第2版)》)
提示
我为这本好书做了 一个学习项目文件: 为天鹅书第三版制作的学习项目文件 (解压以使用), 解压后打开 "请读我" 文件查看使用说明 (例如需要安装 Git: 通过官网下载).
个人认为最好最优雅的程序设计入门书, 我的 C++ 传授、答疑、学习方法高度基于 本书第二版第 0 章 和 本书第三版第 0 章 (强烈推荐阅读!). 请注意我的说法和书名的翻译: 这本书的主题是 程序设计, 也就是表达代码意图所需的思想、技术和工具. C++ 语言是我们的主要工具, 因此我们比较详细地描述了很多 C++ 语言的特性. 但请记住, C++ 只是一种工具, 而不是本书的主题. 本书是 “用 C++ 语言进行程序设计”, 而不是 “C++ 和一点程序设计理论”.
本书 2024 年 4 月 12 日出版, 教授当代 C++ (C++20 和 C++23) 并涵盖众多程序设计思维、方法, 但却相较于第 2 版缩减了一半篇幅!
在第 0 章, 它会给出书籍配套的资源网站, 其中给出了部分示例代码、部分习题解答、更多参考资料、 PPP Style Guide (天鹅书风格指南) 等资源.
目前本书没有翻译, 但建议使用这本书——哪怕是 DeepL 机翻 (电脑可以用 "沉浸式翻译", 平板可以用 "MarginNote (+ DeepL 插件)"). 如果实在不太习惯英文书, 可以用下方 "以前的入门书三选一" 里的书. 但记得看我附在书名后的短评!
对第二版的书评
2021 年 9 月 9 日.
最好的编程入门书!!!
遗憾的是, 哪怕我提早知道这一点, 也不会在四月时通过它来初学编程. 在考试的压力下, 我需要的是应试本领, 而不是获取知识. ——这是兴趣学习和应试学习的区别使然.
仅花了 10 天就学习完了上下册书, 一方面习题只是脑内构思了一下, 另一方面 (也是最主要的), Bjarne Stroustrup 的讲述深入浅出, 已经到了让人一眼望去不可能看不懂的地步.
唯一的问题在于前言部分提供的资源网站有误, 应是 Bjarne Stroustrup's Homepage.
没有人能比 C++的发明者——Bjarne Stroustrup 更理解 C++.
Bjarne 在 Texas A&M 大学任教时使用 C++ 为大学新生讲授编程, 从而就有了《C++程序设计:原理与实践》这本书——它面向编程初学者, 既包含 C++ 教程, 也包含大量 "程序设计原则".
他将计算机科学的精髓尽可能地融入新手的 C++ 学习中, 涉及甚广:
在我一提及处理数学表达式就想到栈的愚钝大脑里, 醍醐灌顶地指出 "文法" 的存在, 并以一个计算器程序的例子, 让我理解了 "编译器的构造原理".
调试、数学证明和测试. 让新手学会重视正确性.
"不要相信 '魔法'" 的理念: 知其然, 知其所以然. 不然如何得知程序的性能? 如何得知去哪勘误?
一本过半都没有出现指针或 C 风格数组的 C++教程, 从而真正指出指针的作用和 C 风格数组的弊端.
驳斥常有的 "低级语言=高效" 观点, 高效应该包括对代码后期的管理和维护, 指出低级语言的难以优化性和高级语言与人类思维更加接近的特点.
浅析嵌入式程序设计, 其概念、特征、其相关操作、内存管理……
提出 "编码规范". 它针对特定应用领域和特定程序员来设计; 既有指示性, 又有限制性; 指明了程序风格 (命名和缩进原则, 允许使用的语言子集, 注释原则, 使用哪些库)……
讲解 GUI, 如何使用第三方库.
指出比起写程序, 定义正确的问题更为关键.
动态规划、状态机等基础概念的解析.
……
总之, 这套书带给我的震撼太多太多.
以前的入门书三选一
这三门书虽有各自的优点, 但已经被主推的入门书《Programming: Principles and Practice Using C++, 3rd Edition》完全爆杀.
- 《Programming: Principles and Practice Using C++, 2nd Edition》(天鹅书, 个人译为《程序设计:使用C++的原理与实践(第2版)》, 译本错译为《C++程序设计:原理与实践(第2版)》)
提示
我为这本好书做了 一个学习项目文件: 为天鹅书第二版制作的学习项目文件 (解压以使用), 解压后打开 "请读我" 文件查看使用说明 (例如需要安装 Git: 通过官网下载).
个人认为最好最优雅的编程入门书, 在原书 17 章之前一直没使用指针! 我的 C++ 传授、答疑、学习方法高度基于 本书的第 0 章.
在第 0 章, 它会给出书籍配套的资源网站, 其中给出了部分示例代码、部分习题解答、更多参考资料、 PPP Style Guide (天鹅书风格指南) 等资源.
目前有两个译本: 清华大学出版社的和机械工业出版社的. 清华大学出版社的 2024 年 7 月才出, 翻译反而更加糟糕, 建议用机械工业出版社的版本. 但请注意机械工业出版社的中文版印刷导致了一些代码问题问题, 且自以为是地调换了章节顺序拆成了两本书, 把原本分为 4 部分的章节给打乱了 (见书本译者序), 导致如果完全自学不问别人会在初期配置环境时遇到问题.
书评
2021 年 9 月 9 日.
最好的编程入门书!!!
遗憾的是, 哪怕我提早知道这一点, 也不会在四月时通过它来初学编程. 在考试的压力下, 我需要的是应试本领, 而不是获取知识. ——这是兴趣学习和应试学习的区别使然.
仅花了 10 天就学习完了上下册书, 一方面习题只是脑内构思了一下, 另一方面 (也是最主要的), Bjarne Stroustrup 的讲述深入浅出, 已经到了让人一眼望去不可能看不懂的地步.
唯一的问题在于前言部分提供的资源网站有误, 应是 Bjarne Stroustrup's Homepage.
没有人能比 C++的发明者——Bjarne Stroustrup 更理解 C++.
Bjarne 在 Texas A&M 大学任教时使用 C++ 为大学新生讲授编程, 从而就有了《C++程序设计:原理与实践》这本书——它面向编程初学者, 既包含 C++ 教程, 也包含大量 "程序设计原则".
他将计算机科学的精髓尽可能地融入新手的 C++ 学习中, 涉及甚广:
在我一提及处理数学表达式就想到栈的愚钝大脑里, 醍醐灌顶地指出 "文法" 的存在, 并以一个计算器程序的例子, 让我理解了 "编译器的构造原理".
调试、数学证明和测试. 让新手学会重视正确性.
"不要相信 '魔法'" 的理念: 知其然, 知其所以然. 不然如何得知程序的性能? 如何得知去哪勘误?
一本过半都没有出现指针或 C 风格数组的 C++教程, 从而真正指出指针的作用和 C 风格数组的弊端.
驳斥常有的 "低级语言=高效" 观点, 高效应该包括对代码后期的管理和维护, 指出低级语言的难以优化性和高级语言与人类思维更加接近的特点.
浅析嵌入式程序设计, 其概念、特征、其相关操作、内存管理……
提出 "编码规范". 它针对特定应用领域和特定程序员来设计; 既有指示性, 又有限制性; 指明了程序风格 (命名和缩进原则, 允许使用的语言子集, 注释原则, 使用哪些库)……
讲解 GUI, 如何使用第三方库.
指出比起写程序, 定义正确的问题更为关键.
动态规划、状态机等基础概念的解析.
……
总之, 这套书带给我的震撼太多太多.
- 《C++ How to Program, 11th Edition》(《C++大学教程(第11版)》)
必须用第11版及以后, 之前是垃圾书.
从前言、目录和示例代码来看, 虽然有部分不足之处, 但已经非常依据现代 C++ 之哲学和最佳实践, 让我一度怀疑是不是换了作者: 它基于 C++20 版本, 并将新标准的各种特性融汇在初学者教学中, 直接在目录上强调并切实淡化了指针等 C 风格 C++ 内容, 如果不对现代 C++ 有一定理解是不能做到这种程度的.
然而还是过于偏向语法和自底向上, 导致读者可能在能实际编程前就接受了大量底层细节的干扰.
- 《C++ Primer, 5th Edition》
很好的一本书, 但内容编排存在一定问题, 导致初学者用起来比较难.
入门之后#
《A Tour of C++, 3rd Edition》(《C++之旅(第3版)》)
中文翻译非常非常糟糕, 建议用英文 + DeepL 机翻.
对翻译的书评
最喜欢的编程系列书, 但这版翻译质量实在差劲, 甚至不如原书 + DeepL 划句翻译.
粗略浏览一小时, 发现包括但不限于以下问题:
- 毫无帮助作用的注释
解释纯函数说是 "数学意义上的函数", 这样的解释完全依赖于读者的数学基础, 很容易让读者糊涂.
- 术语翻译不够准确
union 翻译为联合, 而明显已有翻译中共用体更为恰当.
- 很多术语缺少术语原文
虚函数一节直接写虚函数表简写为 vtbl, 而无原文对照, 读者不能知道简写如何得来.
- 术语翻译前后不一致
invariant 前文翻译为约束条件, 后文又翻译为不变性.
- 不少中文病句
"为什么……的原因" 等经典病句.
- 删去了术语索引
负责任的翻译者会选择将翻译页码与原文页码对应, 在翻译页面边附上对应的原文页码, 或完全重做索引.
Learning and Teaching Modern C++ - Bjarne Stroustrup - CppCon 2017
《The C++ Programming Language, 4th Edition》(《C++程序设计语言(第4版)》)
《Effective Modern C++》
105 STL Algorithms in Less Than an Hour - Jonathan Boccara - CppCon 2018
Simplicity: Not Just For Beginners - Kate Gregory - CppCon 2018
What Has My Compiler Done for Me Lately? Unbolting the Compiler's Lid - Matt Godbolt - CppCon 2017
Want fast C++? Know your hardware! - Timur Doumler - CppCon 2016
STL and Its Design Principles - Alexander Stepanov (粗略感觉一遍, 到 泛型编程 再深入理解)
工具链#
终端使用#
项目管理: CMake#
《Modern CMake for C++ - Discover a better approach to building, testing and packaging your software》
LLVM: A Modern, Open C++ Toolchain - Chandler Carruth - Pacific++ 2017
CMake 2022 C++ Modules and More - Bill Hoffman - CppNow 2022
更多推荐读物
书籍
《Modern CMake for C++ - Discover a better approach to building, testing and packaging your software》
《Professional CMake》 (别用这本书入门!)
开源项目
-
大幅简化 CMake 项目的基本构建流程, 几步即可达到《Modern CMake for C++》最终效果, 建议看完后尝试配置.
本教程的配置方案已借用这个项目来搭建, 以供 CMake 学习参考.
FeignClaims/cpp_conan_template
我基于 aminya/project_options 的 C++ 项目配置模板, 使用 Conan 2.0 进行包管理.
-
视频
Using Modern CMake Patterns to Enforce a Good Modular Design - Mathieu Ropert - CppCon 2017
Git, CMake, Conan - How to ship and reuse our C++ projects - Mateusz Pusz - CppCon 2018
CMake 2022 C++ Modules and More - Bill Hoffman - CppNow 2022
import CMake - 2023 State of C++20 modules in CMake - Bill Hoffman - CppNow 2023
文档/文章
包管理: Conan#
格式化工具: clang-format#
静态检查工具: clang-tidy#
抽象思维#
《C++ Software Design - Design Principles and Patterns for High-Quality Software》
Inheritance Is The Base Class of Evil - Sean Parent - GoingNative 2013
泛型编程#
《Functional Programming in C++ - How to improve your C++ programs using functional techniques》
Better Algorithm Intuition - Conor Hoekstra @code_report - Meeting C++ 2019
《Elements of Programming》(《编程原本》)
《From Mathematics to Generic Programming》(《从数学到泛型编程》, 译本名为《数学与泛型编程:高效编程的奥秘》)
《Notes on Programming》
Easy to Use, Hard to Misuse: Declarative Style in C++ - Ben Deane - CppCon 2018
Documentation in the Era of Concepts and Ranges - Christopher Di Bella & Sy Brand - CppCon 2021
并发#
Cpu Caches and Why You Care - Scott Meyers - code::dive conference 2014
《C++ Concurrency in Action, 2nd Edition》前4章
《C++ Concurrency in Action, 2nd Edition》之后部分
《Concurrency with Modern C++》
最佳实践#
《Effective Modern C++》
《Beautiful C++ - 30 Core Guidelines for Writing Clean, Safe, and Fast Code, 1st edition》
《C++ Best Practices》
《Embracing Modern C++ Safely》
C++98
《Effective C++ Digital Collection》
《Effective C++》
《More Effective C++》
《Effective STL》
《Exceptional C++ Collection》
《Exceptional C++》
《More Exceptional C++》
《Exceptional C++ Style》
深入语言#
显然, 这部分内容不是几个资料就能学全的 (其他部分也不是!), 因此此处仅选择了一些内容列出, 更多见于 常用网络资源.
Undefined Behavior is Not an Error - Barbara Geller & Ansel Sermersheim - CppCon 2018
Back to Basics: Move Semantics - Nicolai Josuttis - CppCon 2021
《C++ Move Semantics - The Complete Guide》
《The C++ Standard Library, 2nd Edition》by Nicolai M. Josuttis (《C++标准库(第2版)》)
《C++17 - The Complete Guide》
《C++ Templates - The Complete Guide, 2nd Edition》
How C++20 Changes the Way We Write Code - Timur Doumler - CppCon 2020
《C++20 - The Complete Guide》
*(char*)0 = 0: What Does the C++ Programmer Intend With This Code? - JF Bastien - C++ on Sea 2023
How C++23 Changes the Way We Write Code - Timur Doumler - CppCon 2022
An (In-)Complete Guide to C++ Object Lifetimes - Jonathan Müller - ACCU 2024
《C++ Lambda Story - Everything you need to know about Lambda Expressions in Modern C++》
设计与演化#
《The Design and Evolution of C++》(《C++语言的设计与演化》)
《A History of C++ - 1979-1991》
《Evolving a Language in and for the Real World - C++ 1991-2006》
《Thriving in a crowded and changing world - C++ 2006-2020》
扩展阅读#
难以分类和未分类的.
《Large-Scale C++ Volume I - Process and Architecture》
《The Art of Writing Efficient Programs》
C++98
《C++ In Action》
《Inside the C++ Object Model》(《深度探索 C++ 对象模型》)
《STL源码剖析》
《C++ Template Metaprogramming - Concepts, Tools, and Techniques from Boost and Beyond》
程序设计风格#
更多见于 常用网络资源.