Introduction 导言
学习一种编程语言的基础是一回事;学习如何用那种语言设计和实现高效率的程序完全是另外一回事。对于 C++ ——一种以拥有非同寻常的能力范围和表现力而自豪的语言——更是尤其如此。如果能正确使用,与 C++ 共事是一件令人快乐的事情。设计上的一个巨大变化能被直接表达并有效地实现。对于类,函数,以及模板的明智选择和小心精巧的安排能使应用程序的编程更加简单,直观,高效,并基本无错。如果你知道如何去做,写出高效的 C++ 程序并不特别难。然而,如果不经训练就贸然使用,C++ 也会导致不可理解的,难以维护的,无法扩展的,低效率的,错误百出的代码。
本书的目的在于引导你如何高效使用 C++。我假设你已经熟悉了作为语言的 C++ 并有使用它的一些经验。我在此提供的是使用这种语言的指南,以使你的程序易于理解,可维护,易移植,可扩展,效率高,而且行为符合你的预期。
我提供的建议落在两个主要的范围中:普通的设计策略,以及特殊语言特性的具体细节。设计的讨论集中于如何在 C++ 做某件事情的多种不同方法之间进行选择。如何在继承和模板之间选择?如何在 private 继承和复合(composition)之间选择?如何在成员函数和非成员函数之间选择?如何在传值和传引用之间选择?在一开始就做出正确的决定是很重要的,因为一个不好的选择可能会直到开发过程很晚的阶段才显现出来,在这时候再调整它常常是困难重重,极为耗时而且代价不菲的。
即使当你正确地知道你要做什么,仅仅把事情做对也是需要技巧的。赋值运算符的合适的返回类型是什么?析构函数什么时候应该是虚拟的?当运算符 new 找不到足够的内存时它应该怎么办?类似这些的令人费神的细节是至关重要的,因为错误的做法几乎总是导致无法预料的,还可能令人迷惑的程序行为。这本书正是来帮助你避免这些问题的。
这不是一本全面的 C++ 手册。它收集了 55 个详细的提议(我称它们为 Item)告诉你怎样才能改善你的程序和设计。每一个 Item 都能独立成章(stands more or less on its own),但大部分也包含对其它 Items 的参考。因而,读这本书的一个方法就是从你感兴趣的一个 Item 开始,然后顺着它的参考条目继续看下去。
这本书也不是一本 C++ 入门书。例如,在第二章,我希望能告诉你关于构造函数,析构函数,以及赋值运算符正确实现的全部内容,但是我假设你已经知道或者能在别处找到这些函数做些什么以及它们该怎样声明的资料。大量 C++ 书籍包含类似这样的信息。
这本书的目的是为了突出 C++ 编程中那些常常被忽略的方面。其它书描述了语言的不同部分。这本书则告诉你如何将这些部分结合起来以达到高效编程的最终目的。其它书告诉你如何使你的程序能够编译。这本书则告诉你如何避免那些编译器不能告诉你的问题。
与此同时,本书将自己限制在标准 C++ 之内。在此仅仅使用官方的语言标准中的特性。可移植性是本书一个关键的关注点,所以如果你要寻找平台依赖的特性和部件,在这里不会找到。
另一个在本书中找不到的东西是 C++ 福音书(C++ Gospel)——通向完美的 C++ 软件的一条真理之路(One True Path)。本书中的每一个 Item 都在如何开发更好的设计,如何避免一般的问题,以及如何得到更高的效率等方面提供指导,但没有一个 Item 是普遍适用的。软件设计和实现是一项复杂的任务,被硬件,操作系统,和应用程序的限制所影响,所以我能做的最好的事情就是为创建更好的程序提供指南。
如果你在所有的时候都遵守这些指南,你将不太可能落入环绕在 C++ 周围的大量陷阱中,但是作为指南的固有限制,它总有例外。这就是为什么每一个 Item 都有一个详细的解释。这些解释是本书中最重要的部分。只有理解了一个 Item 背后的基本原理,你才能决定它是否适合你开发的软件以及你被困其下的特有的限制。
本书最好用来增加 C++ 如何运转,为什么它会这样运转,以及如何让它的行为为你服务等方面的知识。盲目运用本书的 Items 无疑是不适当的,但是与此同时,如果你没有更好的理由,多半也不应该违反这些指南中的任何一条。