万事开头难,开始意味着做出改变,而接下来的任何动作都是延续之前的行为,因为人的强大适应能力而一旦适应了想要再改变就会引起大脑的强烈反应。这有利于人适应环境,也会导致人的思维固化,所以偶尔的外来刺激会导致大脑获得新的认知。这是创造的必要条件。
接下来的几个月时间,我将会把主要精力放在为 《C++ Primer 5th》 这本书的笔记上。C++ 在我多年以来断断续续学了好几遍,之前用《C++ 编程思想》也学过,但那本书过于陈旧了,用《C++ Primer 4th》也学过一段时间,由于书本过于沉溺细节,导致最终没法坚持下来。第五版我去年已经看过一遍了,对于里边的内容也有一个大概的印象,我的一个感受就是第五版的内容安排变好了,而且很多过于细节化的东西被隐藏了。这是非常好的,对于初学者来说更重要的是看到语言的全貌而不是抠细节,我们得知道语言的边界从而为要解决的问题提供良好定义的方案。
我之前得到一些启发,说学习 C 不应该一开始就将 printf 的各种参数细节,这太过于机械记忆。只要用到的时候去查阅对应的文档即可。学太多这种东西,反而妨碍了了解语言的能力和限制,以及怎样设计具有良好结构的程序。所以,在所有这些笔记中如果是过于细节化的东西,我会省略掉,当需要时阅读原文即可。我希望笔记达到的功能是提醒所有想用好 C++ 语言的程序员这门语言的核心是什么。细枝末节将会被忽略。
好,以下是 《C++ Primer 5th》的笔记正文,供各位慢慢阅读。
C++ 语言经过几十年的发展,已经从当初仅仅关注机器效率渐渐开始更加关注开发效率。这很大程度是由于别的语言的冲击,Python 、Javascript 这些语言的开发效率相对来说要高不少,渐渐 C++ 也往这方面考虑。由于 C++ 即想保持机器效率,又想最大化开发效率,导致现在语言特性繁多而且还在不断增加,这是不得已的妥协。
C++11 是目前最广为接受的现代 C++ 标准,近些年还发展出了 C++14 和 C++17 标准,都是在 C++11 上进行小幅扩展的。这本书所讲的内容都是关于 C++11 的。
C++11 具有语言更加统一,标准库更易用更安全并且更高效,动手写自己的库也更加容易的特点。比如 auto 关键字的广泛使用导致程序员可以忽略类型细节,将精力放在解决问题上而不是语言细节上。而智能指针和移动容器(move-enabled containers)使得程序员可以更少关注资源管理(resource management)方面的细节,从而可以更加安全高效的写复杂的库。
本书会用 C++11
标记所有 C++11 添加的新特性,为的是在需要区分这些特性时更容易找到。尽管新标准增添了许多特性,C++ 语言的核心并没有改变,并构成了本书的主要内容。
现代 C++ 语言由以下三部分组成:
- 从 C 语言继承而来的低层(low-level)语言细节;
- 允许定义自己的类型的 OOP 编程方式,从而构建大的程序和系统;
- 丰富的标准库;
很多别的书一开始就将很多关于 C 语言的细节,让读者学一堆动态内存管理和指针的内容,导致读者深陷低层语言的细节从而导致在挫败中放弃。这不是正确的学习 C++ 的方式,正确的方式是一开始就利用 C++ 语言丰富的标准库,而忽略掉低层语言细节,这样写出来的程序更容易写、更容易懂、更健壮。本书将帮助读者从一开始就养成正确的习惯。本书将强调惯用的技巧,提醒读者避免 C++ 中常见的坑,本书也将解释规则后面的原因,知道了为什么是这样读者将更快掌握语言的精髓。
C++ 是一门很大的语言,包含了为各种问题定制的方案。其中一些仅适用于大的项目,而小项目用不上。所以并不是所有程序员需要了解每个特性的所有细节。每个人都需要了解语言的核心部分,而一些高级以及很偏门(special-purpose)的主题可以快速浏览,并在真正需要时才用心研究这些特性。C++ 语言中还有一些概念对于理解整个语言有至关重要的意义,这些部分值的好好理解。
本书的第一、二部分讲的是语言的基础和库的使用,这两个部分是语言的核心,知道了这些部分就可以阅读和写出很多重要的软件。绝大部分程序要都需要这两部分的所有细节。C++ 中的库虽然实现复杂,但全部都是以 C++ 语言本身写就的,在体验库的强大的同时,也了解到语言的威力。学习 C++ 更为重要一点并不在于沉溺于 C 语言的细节,而在于其强大的抽象能力。想想 C++ 的库比 C 库大多少就知道了,C++ 是一门比 C 抽象程度更高的语言。
本书的第三部分教大家怎么写自己的类,其中涉及到拷贝控制(copy control),以及其它使得自定义类像内置类型一样易用的特性。第三部分也会将关于泛型编程(generic programming)的知识。第四部分则将在大型程序中用到的技术。
最后:学习任何语言都需要多写代码,用它去解决实际的问题,才能做到有效学习。