《Exceptional C++》序言 《Exceptional C++》通过例子向你展示如何实施可靠的软件工程。本书包括Internet上流行的C++专题“Guru of the Week”(或简写为GotW)前30个议题的扩充版本,并补充了大量的其他材料。“Guru of the Week”包含一系列独立的C++工程问题和解决方案,它们描述了具体的设计和编程技术。 本书并非盛有代码迷题的摸彩袋,它首先是对现实世界的C++企业软件设计的指南。它使用了问题/解决方案的形式,因为这是我知道的将您——文雅的读者——引入问题背后的思想和指导方针背后的理由最有效的方式。尽管这些条款涵盖了形形色色的主题,然而你会注意到反复出现的主题集中于企业级开发议题上,尤其是异常安全、健全的类和模块设计、适当的优化以及编写遵从标准的可移植代码。 我希望你发现这些内容对你的日常工作有用,我还希望你至少从中发现一些极好的思想和优雅的技术,并且在阅读本书的过程中有时突然喊出“啊哈,原来如此!”。是谁说软件工程枯燥乏味的? 如何阅读本书 我期望你已经掌握了C++基础知识,如果你还没有,可以从一本介绍性和概览性的好书(像Bjarne Stroustrup的《The C++ Programming Language》(第3版)[注1]或Stan Lippman和Josée Lajoie合著的《C++ Primer》(第3版)[注2]这样的经典都是优秀的选择)开始学习,然后选读一本编程风格指南,例如Scott Meyers的经典著作《Effective C++》(我发现基于浏览器的CD版方便且实用)[注3]。 [注1] Stroustrup B,The C++ Programming Language,第3版,(Addison Wesley Longman,1997)。 [注2] Lippman S.,Lajoie J,C++ Primer,第3版,(Addison Wesley Longman,1998)。 [注3] Meyers S,Effective C++ CD: 85 Specific Ways to Improve Your Programs and Designs (Addison Wesley Longman,1999)。可访问http://www.meyerscd.awl.com获得在线演示版。 书中的每一个条款都以迷题或问题的形式呈现,并带有一个介绍性的头部,如下所示: Item ##. 问题的标题 Difficulty: X 标题和难度等级(通常从3到91/2,最高为10)提示你将要遭遇到什么。注意,难度等级只是我对自己预期大多数人认为问题有多难的主观猜测,因此,你也许会发现对你而言一个难度等级为7的问题比一个难度等级为5的问题来得更简单。话虽如此,当你看到一个难度为91/2的怪物浮出水面时,最好还是做最坏的思想准备。 你无需按顺序阅读每一个小节和问题,但有几个地方存在一些相关问题的“小型系列”,你可以看到它们被标以“Part 1”、“Part 2”等,有些地方甚至多至“Part 10”。最好按组阅读这些小型系列。 本书包含很多指导方针,在这些指导方针中,以下单词通常传达特别的含义:
最后,关于URL有必要多说一句:在Web上,东西会动来动去。尤其是,我无法控制的一些内容会动来动去。这使得在印刷书籍上刊印随意的Web URL就变成了真正的痛苦:恐怕在该书下厂印刷之前那些URL就已经过时了,更不要说等它在你的书桌上躺上5年之后了。当我在本书中引用他人的文章或Web站点时,我是通过自己的Web站点(www.gotw.ca)上的URL做到这一点的——我自己的Web站点是我所能控制的,它只包含对实际Web网页的重定向链接。如果你发现印刷在本书中的 一个链接不再有效,请写邮件告诉我,我将更新该链接,使其指向新的网页位置(如果我还能找到该网页的话),或者告诉你该网页已不复存在(如果我找不到的话)。不管怎么说,本书的URL将会保持为最新,尽管在这个Internet世界中印刷媒体的日子是如此难过。呜呼! 来龙去脉:GotW与PeerDirect C++“Guru of the Week”系列由来已久。GotW最初创建于1996年底,为我们自己在PeerDirect的开发团队提供有趣的挑战和继续教育。我编写它是为了提供有趣味的学习工具,包括对继承和异常安全之类特性的正确用法的讲解。随着时间的推移,我还将它作为一种工具,用于向我们的团队介绍C++标准会议正在进行的改动。从那以后,GotW作为Internet新闻组comp.lang.c++.moderated的定期专栏对一般C++公众开放,在那儿你可以找到每一个新议题的问题和答案(以及大量有趣的讨论)。 在PeerDirect用好C++非常重要,这与在你的公司用好C++的重要性有很多相同的理由,尽管要达到的目标可能并不相同。我们构建用于分布式数据库和数据库复制的系统软件,在这些领域,诸如可靠性、安全性、可移植性、效率,以及其他很多企业级议题,都是生死攸关的考虑。我们编写的软件要能够移植到不同的编译器和操作系统上,当发生数据库事务死锁、通信中断以及程序异常时, 它要保持安全、强健。顾客用它来管理位于智能卡和pop终端或PalmOS和WinCE设备上的微型数据库,或管理部门级Windows NT和Linux、Solaris服务器,甚至管理Web服务器和数据仓库的大规模并行Oracle后端。这些都使用同样的软件,同样的代码,对可靠性有着同样的要求。现在,当我们费力地工作于大量的密集而未加注释的代码之上时,就会面临可移植性和可靠性的挑战。 对于读者中过去几年来已经读过Internet上“Guru of the Week”的人,我有两句话要说:
《Exceptional C++》并不仅是对已经出现于网络空间的陈旧的GotW议题的剪贴。所有问题和解决方案都已在相当大程度上修订和重写,例如,条款8到条款17讨论的异常安全起先出现于单个GotW迷题中,现在则变成了一个具有10个部分的小型深入系列。每一个问题和解决方案都已经被检视,使其跟上修改后的正式C++标准。 所以,如果你以前是GotW的定期读者,本书中仍然有大量的新东西。再一次对于所有忠实的读者表示感谢,希望这份材料能够帮助你继续磨练和扩展你的软件工程和C++编程技能。 致谢 首先当然要感谢comp.lang.c++.moderated 上的所有GotW的读者和爱 好者,尤其是那些参加为本书起名竞赛的胜出者。有两位对引导我们定出最终书名帮助尤巨,我要对他们特别表示感谢:Marco Dalla Gasperina建议取名“Enlightened C++”,Rob Stewart则建议取名“Practical C++ Problems and Solutions”。鉴于这儿反复强调异常安全,更进一步加入双关语“exceptional”是自然而然的。 非常感谢丛书编辑Bjarne Stroustrup,感谢Marina Lang、Debbie Lafferty以及Addison Wesley Longman的其余编辑人员,感谢他们对此项目投入持续的热情以及在1998年Santa Cruz C++标准会议上给与的周到招待。 我还要感谢很多审稿人(其中不少人是C++标准委员会的成员),他们提供了深刻而尖锐的评论,对改善你将要看到的内容很有帮助。特别感谢Bjarne Stroustrup和Scott Meyers,以及Andrei Alexandrescu、Steve Clamage、Steve Dewhurst、Cay Horstmann、Jim Hyslop、Brendan Kehoe、Dennis Mancl,感谢他们宝贵的洞察力和评论。 最后,特别感谢我的家人和朋友,感谢你们一直以各种方式陪伴着我。 Herb Sutter |