《Accelerated C++》序言 

一种教授C++编程的新方式 

我们假定你希望快速地学习如何编写有用的C++程序,因此我们以解释C++最有用的部分开始。尽管一旦付诸实施,这种策略看上去便理所当然,但它其实有着激进的隐喻:我们并不从C开始教C++,纵然C++构建于C之上。相反,我们从一开始就使用高级数据结构,只是在较晚的时候才解释那些数据结构所依赖的基础。这种方式可以让你很快就编写出地道的C++程序。 

从另一方面来看我们的方式也非同寻常:我们专注于解决问题而非探究语言和库的特性。当然,我们也解释一些特性,但这么做是为了给程序提供支持,而不是将程序用作演示语言特性的工具。 

正因为本书教授C++编程而非仅仅讲解语言特性,所以对那些已经了解一些C++并希望以更自然、更有效的风格使用C++的读者而言,这本书尤其有用。C++新手往往只学习语言技巧而没有学习如何将其用于解决日常问题。 

我们的方式同时适应于初学者和经验丰富的程序员 

在过去的每一个夏季我们都在斯坦福大学教授为期一周的C++强化班。起先我们采用传统的方式进行授课,即假定学生已经了解C语言,因此我们从讲授如何定义类开始,然后系统地过渡到语言的其余部分。我们发现学生们大约要熬过困惑、沮丧的两三天,直到所学的知识足以编写出有意义的程序。而一旦能够写出有意义的程序,他们学起来就快多了。 

当我们接触到一种为崭新的标准库提供足够支持的C++实现时,我们就全面修订了课程。新课程从一开始就使用标准库,专注于编写有用的程序,仅当学生掌握的知识足以富有成效地运用语言和库的各种细节时,我们才深入探讨有关细节。 

结果富有戏剧性:仅在教室端坐一天,学生们就能编写出在老课程中要花费大半周时间才能写出来的程序。此外,他们的沮丧感也烟消云散、了无踪影。 

抽象 

我们的方式之所以可行,是因为C++(以及我们对它的理解)已经日渐成熟,这使我们得以忽略许多为早期的C++程序和程序员所依赖的低层概念。 

允许忽略细节的能力是成熟技术的特征。例如,早期的汽车常常会出故障,因此每一个司机都不得不同时是一个业余的机械修理工。在不知道当车子出了故障时如何修好它并将其开回家的情况下,驾车出行实为莽撞之举。但今天的司机无需具备工程细节知识即可从事汽车运输。也许他们出于某些原因去学习工程细节,但那完全是另外一回事。 

我们将“抽象”定义为有选择性的忽略,即专注于和手头任务相关的概念并忽略其他一切,我们认为这是现代程序设计中最重要的思想。编写一个成功的程序的关键在于明白问题的哪些部分应该予以考虑,哪些部分又应该被忽略。每一种编程语言都提供了用于创建有用的抽象的工具,每一个成功的程序员都清楚如何使用这些工具。 

我们认为抽象非常有用,于是乎书中随处可见“抽象”。当然,我们通常并不直接称之为抽象,它们以多种形式出现,分别称为函数、数据结构、类以及继承——所有这些都是抽象。我们不仅提到它们,而且对它们的使用贯穿全书。 

如果抽象有着良好的设计并且是善加选择的结果,我们相信即使在不了解其工作机理的全部细节的情况下也可以使用它们。我们无需成为汽车工程师就可以驾驶汽车,类似地,我们在能够使用C++之前也无需了解其全部工作细节。 

涵盖的范围 

如果你将C++编程视作一件严肃的事情,你需要知道本书包含的一切知识,尽管本书并没有告诉你需要知道的一切知识。 

这个说法并不像听上去的那样矛盾。没有哪一本具有这般厚度的书能够涵盖你需要知道的一切C++知识。由于不同的程序员和应用需要不同的知识,因而任何一本覆盖了C++所有知识的书籍(例如Stroustrup的《The C++ Programming Language》(Addison-Wesley2000))都不可避免地告诉你许多你本不需要知道的东西。原因是明摆着的,即便你不需要那些知识,自有他人需要。 

另一方面,C++的许多部分具有普遍的重要意义,如果不理解它们就很难高效地开发程序。我们专注于这些部分。仅仅使用本书提供的信息来编写各种各样的有用程序是完全可能的。事实上,本书的一位审稿人(一个使用C++编写真实商业系统的主程序员)告诉我们,本书基本上涵盖了他在工作中用到的所有编程设施。 

使用这些设施,你可以编写真正的C++程序而非C或任何其他语言风格的程序。一旦你掌握了书中介绍的内容,你就会明白自己还需要学一些什么别的C++知识以及如何去学。在业余望远镜制作者中流传着这么一种说法:先制作一个3英寸的镜片然后再制作6英寸的镜片比一上来就制作一个6英寸的镜片要来得容易。C++的学习与之类似。 

我们仅仅讨论标准C++而忽略其他专有扩展。这种方式的优点在于我们教你编写的程序可以在任何环境下工作。不过这也意味着我们不会探讨如何编写运行在窗口环境下的程序,因为这样的程序将不可避免地被绑定到某种特定的环境,而且往往还被绑定到某个特定的厂商。如果你希望编写仅工作于特定环境下的程序,你需要改用其他途径学习有关编程方法——然而请不要就此合上本书,因为我们在书中介绍的方式具有普遍性,有朝一日你可以在任何环境中使用在此学到的任何知识。你当然可以转而阅读别的关于GUI应用的书,不过在此之前请首先阅读这一本。 

富有经验的CC++程序员请注意 

当你学习一门新的编程语言时,你可能抵制不住采用类似于你已经知道的其他语言的风格来编写程序的诱惑。我们的方式通过从一开始就使用来自C++标准库的高级抽象以努力避免这种“诱惑”的出现。如果你已经是一个富有经验的CC++程序员,这种方式包含一些好消息和一些坏消息,它们其实是相同的消息。 

消息就是,你可能会对这一点感到惊讶:你已有的C++知识对于理解我们展示的C++知识用处不大。一开始你需要学习的知识要比你预想的多(此为坏消息),但你的学习效率也将比你预期的要高(此为好消息)。特别是,如果你此前学过C++,你可能首先学习如何采用C进行编程,这就意味着你的C++编程风格是建立在C的基础之上的。这种方式并没有错,但我们的方式是如此与众不同,相信你将看到你以前从未见过的C++的另一面。 

当然了,很多语法细节是相似的,不过它们仅仅是细节而已。我们处理重要思想的顺序全然不同于你此前遇到过的。举个例子,我们直至第10章才提到指针或数组,我们甚至压根就没打算讨论你的旧爱printfmalloc。另一方面,我们在第1章就开始讨论标准库的string类。总之,当我们宣称正在采用一种全新的教授方式时,事实的确如此! 

本书的结构 

你也许会发现将本书分成两个部分进行考虑会更方便一些。第一部分为前七章,专注于使用标准库抽象进行编程。第二部分从第8章开始,讨论如何定义你自己的抽象。 

首先介绍库是一个非同寻常的主意,但我们认为这是正确的。C++语言的许多部分——尤其是那些较困难的部分——主要出于库作者利益的考虑而存在的。库的用户根本无需了解语言的那些部分。因此在第一部分中我们避开语言的这些特性不谈。与使用较传统的方式相比,我们的方式使得更快地编写出有意义的C++程序成为可能。 

一旦理解了库的用法,你就要准备学习库赖以构建的低层设施以及如何使用这些设施来编写你自己的库。此外,你将会获得对如何使得一个库有用以及何时应避免从头编写全新的库的感性认识。 

尽管本书要比许多C++书籍来得薄,但我们在书中已努力使用每一个重要的概念至少两次,关键概念的使用次数则更多。结果,书中的许多部分中会引用到其他部分。这种引用看上去像“§39.4.3/857”的模样,它指的是引用的文本位于第857页,并且是第39.4.3小节的一部分(如果本书有这么多的小节或页数的话,含义就是如此)。当我们第一次解释某个概念时,我们会采用粗体字标明,使得它易被发现并可唤起你的注意力,以将其视作一个重点。 

本书的每一章(除了最后一章外)都以一个名为“Details”的小节收尾。安排这一节有两个用意:它们可以使你加深对该章介绍的概念的记忆,并且它们还包含一些额外的相关信息,我们认为你终有一天需要了解这些信息。建议你初次阅读时忽略这些内容,他日需要时,可以再回首查阅。 

本书的两个附录在细节的层面上总结并阐明了语言和库的重要部分,希望在你编写程序时它们能派上用场。 

最大限度地发挥本书的作用 

每一本关于编程的书都包含有例子程序,本书也不例外。为了理解这些程序是如何工作的,除了在计算机上运行它们别无更好的方式。这样的计算机到处都有,而且新式计算机也不断出现。这就意味着,等到你读到这些文字时,我们对它们的任何叙述都可能是不准确的。如果你还不知道如何编译和执行一个C++程序,请访问http://www.acceleratedcpp.com并参考那里的描述。我们会不时更新网站,添加关于运行C++程序机制的建议和信息。该网站还提供了一些机器可读的示例程序版本以及其他一些你也许感觉有趣的信息。 

致谢 

我们对以下人士表示谢意,没有他们本书就不可能诞生。本书的成型很大程度上要归功于以下审稿人:Robert BergerDag BrückAdam BuchsbaumStephen ClamageJon KalbJeffrey OldhamDavid Slayton Bjarne StroustrupAlbert TenbuschBruce Tetelman以及Clovis TondoAddison-Wesley有许多工作人员都参与了本书的出版工作,我们知道的有Tyrrell AlbaughBunny AmesMike HendricksonDeborah LaffertyCathy Ohala以及Simone Payment等。Alexander Tsiris则校核了§13.2.2/236中的希腊词源。最后,以高级编程开始讲解的想法由来已久,这是受到数百名耐心听完我们课程的学生以及数千名听过我们演讲的 听众的激励而产生的。 

Andrew Koenig, Barbara E. Moo
新泽西 吉列

2000
6

荣耀 译
2006年2月
南京师范大学
www.royaloo.com