More Exceptional C++起步于Exceptional C++驻足之处

古希腊哲学家苏格拉底通过向学生提问进行教学——他用那些精心构思的问题来指导学生,启发他们从已知得出结论;让他们认识到自己正在学习的事物如何相互联系,这些事物与他们已有的知识又如何联系。这种教学法如此出名,以致于我们今天把它专称为“苏格拉底问答法”。如果让我们也从学生的角度来看问题,苏格拉底的教学法将引导我们,促使我们思考,帮助我们联系并应用现有的知识去获取新知。

本书如同它的前任Exceptional C++ [Sutter00]一样,借鉴了苏格拉底的教学法。它假设你目前正身处C++产品软件开发的某个领域,采用“提问/解答”的形式指导你如何有效地使用标准C++语言及其标准库—— 尤其是,如何运用现代C++中有效的软件工程理论来解决问题。这些问题大多直接取自于我和其他人在编写产品级C++代码时积累的经验,以所谓的“疑问”和“难题”的形式呈现给你。“疑问”的目的在于帮助你从现有的知识和刚刚学到的知识中得出结论,并展现它们之间如何相互关联。“难题”则向你展示如何去分析C++设计和编程上的论题—— 某些是常见的论题,某些并不常见;某些是浅显的论题,某些则比较深奥;还有一些论题之所以拿来讨论,是因为—— 唔,仅仅因为—— 它们很有趣。

本书覆盖C++的方方面面。但我没有说它触及C++的每一个细节—— 那将需要更多的篇幅—— 我是在说,本书提取了C++语言和标准库构件中的广泛素材,向你展示看似毫不相关的个体如何被综合利用起来,构成解决常见问题的新颖方案。它还展示了这些素材中看似毫不相关的那些部分自身是如何相互关联的—— 即使有时你不希望它们有如此的关联;以及,应当如何处理这些关联。你将在此找到关于模板与名字空间、异常与继承、健壮类的设计与设计模式、泛型程序设计与宏的使用技巧等内容—— 这些内容绝不是杂乱地堆砌在一起,而是作为连贯的条款,向你展示现代C++中这些组成部分之间的相互联系。

何为“More”?

More Exceptional C++起步于Exceptional C++驻足之处。本书继承了前任的传统:它提供了新的内容,这些内容被组织为短小的条款,形成有主题的章节。前一本书的读者会在此发现一些熟悉的章节和主题,如异常安全、泛型编程、内存管理技术等,但如今它们包含了新的内容。这两本书在结构和主题而非内容上有重叠之处。

More Exceptional C++还有何不同之处?本书特别强调了泛型编程技术以及如何有效地使用C++标准库,并涉及了如traits和predicates这样的重要技术。有几个条款还深入分析了使用标准容器和算法时应该牢记的要点—— 这其中的许多要点,我在别的地方还没见到它们被提及过。此外,一个新的章节和两个附录集中讨论了单线程和多线程环境下的优化议题—— 对于编写产品级代码的软件开发商来说,这些议题在目前比以往任何时候都更具实用价值。

本书的大多数条款最初出现于互联网和杂志专栏,尤其是Guru of the Week的GotW专题31到62,以及我曾为C/C++ Users Journal、Dr.Dobb’s Journal、以前的C++ Report和其他出版物撰写的印刷版专栏和文章中。自最初版本出现以来,本书的内容历经大量的修订、增补、校正和更新,因而本书(连同它在www.gotw.ca上不可缺少的勘误表)可以被认为是那些原始材料的最新正式版本。

你应该知道的

我认为你已经了解了C++的基础知识。如果不是这样,建议你从一本好的C++入门和概念性的书籍开始,最好选择一本经典的大部头著作,如Bjarne Stroustrup的The C++ Programming Language [Stroustrup00],或者是Stan Lippman与Josée Lajoie合著的C++ Primer第三版 [Lippman98]。然后,一定要挑选一本指导编程风格的书,例如Scott Meyers经典的Effective C++套书[Meyers96][Meyers97]。我发现这套书有基于浏览器阅读的CD版本[Meyers99],十分方便好用。

如何阅读本书

本书的每个条款以一个难题或疑问的形式呈现,它带有一条介绍性的标题,类似下面这样:

条款#:条款的题目 难度:Ⅹ

条款的题目和难度等级提示你将要面对的是何种难题。注意,难度等级是我的主观评断,我只是猜想大多数人碰到每个问题时会觉得有多难,所以你很可能会发现一个难度为“7”的问题对你来说比某个难度为“5”的问题还容易。自从写作Exceptional C++以来,我不时收到一些电子邮件,说“某某条款比你说的要容易(难)”。面对同一条款,不同的人认为“更容易”或“更难”是很自然的。难度等级随人而定;对你来说,任何条款的实际难度真正取决于你的知识和经验,它对别人来说会相对更容易或更难。但大多数情况下你会发现,难度分级是一种不错的经验方法,它指引给你的和你所认为的大致相当。

你可能打算从头至尾阅读整本书。这很好,但不一定非如此不可。你可能会集中阅读一个章节中的所有条款,因为你对那个章节的议题特别感兴趣。这也不错。书中有一些条款被我称为“短系列”,因为它们涉及的是相关的问题,你会看到这些条款用“之一”、“之二”等来标识。除了这些“短系列”外,其余的条款都是很独立的。在本书的条款中还包含很多交叉索引,有些索引还参考到Exceptional C++,你可以遵循这些索引随意跳转阅读。我唯一要告诉你的是,制作“短系列”是为了让它们成为一组以便于连续阅读,除此之外,如何阅读,选择权在你。

名字空间、typename、URL引用以及其他约定

我在本书中提出了不少建议,但我不会指引你去做一些连我自己都没做过的事。这包括整本书里我在我自己的示例代码中所做的那些事。我也会遵循程序设计的现有习惯和现代风格,即使有时候这样做不会对事情带来本质上的差异。

关于这一点,说说名字空间。在本书的代码示例中,如果你在一个例子中看到了一个文件范围内的using指令,又在几页或几个条款后另外的例子中看到了一个函数范围内的using指令,这其实没有什么更深层的含义,只是说明在那些特定情况下,这样做是合理的,而且从美学的角度来看,也让我感到美观。至于名字空间的基本知识,请参阅条款40。在书写代码时,如果想强调我所指的是标准中的东西,我会用std::来修饰标准库名称。这一点确立后,我往往会转而使用不带修饰的名称。

再说说模板参数的声明。我时常碰到一些人,他们认为写class而不写typename是过时的做法,即使这二者没有功能上的不同、而且C++标准本身也在到处使用class。纯粹出于代码书写风格方面的考虑,并且为了强调本书所讨论的是当今现代的C++,在声明模板参数时,我也已经转到使用typename而不使用class。唯一的例外是条款33中的一处,在那儿我直接引用了标准中的代码—— 标准用的是class,我就随它去了。

除非我明确地称某段代码是“完整程序”,否则一般不是。请记住,这些示例通常只是代码片段或者只是程序的一部分,它们不会就这样孤立地通过编译。为了用我所提供的程序片段构成完整程序,你一般还得做一些显而易见的添加工作。

最后,说说URL。互联网上,事事在变。特别是,你无法掌控的那些事物在变。这样一来,在印刷书籍上随意发布URL就成为了一种真正的痛苦:不用等到一本书在你的书桌上躺上五年,在它还没送到印刷厂之前,那些URL可能就已经过时了。本书中,当我引用其他人的文章或网站时,我是通过我自己的网站www.gotw.ca上的URL来实现的。这个网站我可以自己控制,它包含的只不过是直接指向实际网页的重定向链接。如果你发现印刷在本书中的某个链接不再可用,请发电子邮件告诉我,我会更新这个链接,让它指向新的网页位置(如果我能够重新找到这个网页),或者标示这个网页已经不再存在(如果我无法找到这个网页)。无论哪种方式,本书的URL将保持最新—— 尽管在当今互联网世界里,印刷传媒是这样举步维艰。唉!

致谢

深切感谢丛书编辑Bjarne Stroustrup,还有Debbie Lafferty、Tyrrell Albaugh、Chanda Leary-Coutu、Charles Leddy、Curt Johnson,以及Addison-Wesley出版社的其他成员,感谢他们在这个项目中的鼎力协助和坚持不懈。很难想象还能找到比他们更棒的人一起共事,他们的热情和协作使这本书完全达到了我预想的目标。

另外值得感谢和称赞的是审阅过本书的许多专家。对本书的许多内容,他们毫无保留地提出了深刻的见解和犀利的批评,而这些见解和批评是那样一针见血。正是因为他们的努力,你手中的这本书比初稿更完整、更易于理解、更实用。特别感谢(大致以我收到审阅意见的顺序)Scott Meyers、Jan Christiaan van Winkel、Steve DewHurst、Dennis Mancl、Jim Hyslop、Steve Clamage、Kevlin Henney、Andrew Koenig、Patrick McKillen,以及一些不知名的审阅者。书中遗留的所有错误、疏忽和歧义都是因为我,而非他们。

最后,将所有的感谢献给我的家人和朋友—— 无论是在这本书的写作和出版期间,还是其他任何时候,他们都一直陪伴在我身边。

Herb Sutter

你可能感兴趣的:(exception)