首页>参考读物>计算机科学与技术>软件与程序设计

Exceptional C++ 中文版:47个C++工程难题、编程问题和解决方案
作者 : Herb Sutter
译者 : 聂雪军
丛书名 : C++设计新思维
出版日期 : 2007-01-01
ISBN : 7-111-20258-9
定价 : 29.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 187
开本 : 16开
原书名 : Exceptional C++: 47 Engineering Puzzles, Programming Problems, and Solutions
原出版社: AW
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

本书通过示例的方式来讲述如何用标准C++进行正确的软件开发。您是否喜欢解决一些复杂的C++难题?是否喜欢编写健壮的和可扩展的代码?那么您可以花几分钟的时间来研究一些很难的C++设计问题和编程问题。
  本书中所讨论的问题不仅会让您感到有趣,而且还会帮助您成为一名顶尖的C++程序员。书中每个问题都给出了难度系数,这些问题都是用来说明一些微妙的编程错误以及在程序设计上的考虑。在阅读书中给出的解答之前,您可以首先尝试自己给出解答,然后再阅读书中对这些问题给出的详细分析。

  本书所涵盖的C++主题非常广泛,其中包括了以下这些重要的内容:
  ● 泛型程序设计以及如何来编写可重用的模板。
  ● 异常安全性的问题与技术。
  ● 类的健壮设计与继承。
  ● 编译器防火墙和Pimpl惯用法。
  ● 名字查找、名字空间和接口规则。
  ● 内存管理的问题与技术。
  ● 误区、陷阱以及错误的惯用法。
  ● 优化,通过向C++大师们学习来提升您的技术,在阅读完本书后,您应该能够掌握他们的思想和经验,从而编写出执行效率更高、更加有效、更加健壮和可移植性更好的C++代码。

图书特色

图书前言

自C++诞生尤其是ISO/ANSI C++标准问世以来,以Bjarne Stroustrup为首的C++社群领袖一直不遗余力地倡导采用“新风格”教学和使用C++。事实证明,除了兼容于C的低阶特性外,C++提供的高级特性以及在此基础上发展的各种惯用法可以让我们编写出更加简洁、优雅、高效、健壮的程序。
  这些高级特性和惯用法包括精致且高效的标准库和各种“准标准库”,与效率、健壮性、异常安全等主题有关的各种惯用法,以及在C++的未来占据更重要地位的模板和泛型程序设计技术等。它们发展于力量强大的C++社群,并被这个社群中最负声望的专家提炼、升华成一本本精彩的著作。毫无疑问,这些学术成果必将促进C++社群创造出更多的实践成果。
  我个人认为,包括操作系统、设备驱动、编译器、系统工具、图像处理、数据库系统以及通用办公软件等在内的基础软件更能够代表一个国家的软件产业发展质量,迄今为止,此类基础性的软件恰好是C++所擅长开发的,因此,可以感性地说,C++的应用水平在一定程度上可以折射出一个国家的软件产业发展水平和健康程度。
  前些年国内曾引进出版了一大批优秀的C++书籍,它们拓宽了中国C++程序员的视野,并在很大程度上纠正了长期以来存在于C++的教育、学习和使用方面的种种误解,对C++相关的产业发展起到了一定的促进作用。然而在过去的两年中,随着.NET、Java技术吸引越来越多的注意力,中国软件产业业务化、项目化的状况愈发加剧,擅长于“系统编程”的C++语言的应用领域似有进一步缩减的趋势,这也导致人们对C++的出版教育工作失去了应有的重视。
  机械工业出版社华章分社决定继续为中国C++“现代化”教育推波助澜,从2006年起将陆续推出一套“C++设计新思维”丛书。这套丛书秉持精品、高端的理念,其作译者为包括Herb Sutter在内的国内外知名C++技术专家和研究者、教育者,议题紧密围绕现代C++特性,以实用性为主,兼顾实验性和探索性,形式上则是原版影印、中文译著和原创兼收并蓄。每一本书相对独立且交叉引用,篇幅短小却内容深入。作为这套丛书的特邀技术编辑,我衷心希望它们所展示的技术、技巧和理念能够为中国C++社群注入新的活力。

荣  耀
2005年12月
南京师范大学
www.royaloo.com


  本书通过例子展示如何实施可靠的软件工程。本书包括因特网上流行的C++专题“Guru of the Week”(或简写为GotW)前30个议题的扩充版本,并补充了大量的其他材料。“Guru of the Week”包含一系列独立的C++工程问题和解决方案,描述了具体的设计和编程技术。
  本书并非盛有代码谜题的摸彩袋,它首先是对现实世界的C++企业软件设计的指南。它使用了问题/解决方案的形式,因为这是我知道的将您—文雅的读者—引入问题背后的思想和指导方针背后的理由最有效的方式。尽管这些条款涵盖了形形色色的主题,然而你会注意到反复出现的主题集中于企业级开发议题上,尤其是异常安全、健全的类和模块设计、适当的优化以及编写遵从标准的可移植代码。
  我希望本书这些内容对你的日常工作有用,我还希望你至少从中发现一些极好的思想和优雅的技术,并且在阅读本书的过程中有时突然喊出“啊哈,原来如此!”是谁说软件工程枯燥乏味的?
如何阅读本书
  我期望你已经掌握了C++基础知识,如果你还没有,可以从一本介绍性和概览性的好书(像Bjarne Stroustrup的《The C++ Programming Language》(第3版)或Stan Lippman和Jos巈 Lajoie合著的《C++ Primer》(第3版)这样的经典著作都是不错的选择)开始学习,然后选读一本编程风格指南,例如Scott Meyers的经典著作《Effective C++》(我发现基于浏览器的CD版方便且实用)。
  书中的每一个条款都以谜题或问题的形式呈现,并带有一个介绍性的头部,如下所示:
Item ##. 谜题的标题 Difficulty:x
  标题和难度等级(通常从3~,最高为10)提示你将要遭遇到什么。注意,难度等级只是我自己预期大多数人认为问题有多难的主观猜测,因此,你也许会发现对你而言一个难度等级为7的问题比一个难度等级为5的问题更简单。话虽如此,当你看到一个难度为的怪物浮出水面时,最好还是做最坏的思想准备。
  你无需按顺序阅读每一个小节和问题,但有几个地方存在一些相关问题的“小型系列”,你可以看到它们被标以“之一”、“之二”等,有些地方甚至多至“之十”。最好按组阅读这些小型系列。
  最后,关于URL有必要多说一句:在Web上,内容会经常变动。尤其是,我无法控制的一些内容会动来动去。这使得在印刷书籍上刊印随意的Web URL就变成了真正的痛苦:恐怕在该书下厂印刷之前那些URL就已经过时了,更不要说等它在你的书桌上躺上5年之后了。当我在本书中引用他人的文章或Web站点时,我是通过自己的Web站点(www.gotw.ca)上的URL做到这一点的—我自己的Web站点是我所能控制的,它只包含对实际Web网页的重定向链接。如果你发现印刷在本书中的一个链接不再有效,请写邮件告诉我,我将更新该链接,使其指向新的网页位置(如果我还能找到该网页的话),或者告诉你该网页已不复存在(如果我找不到的话)。不管怎么说,本书的URL将会保持为最新,尽管在这个因特网世界中印刷媒体的日子是如此难过。呜呼!
  来龙去脉:GotW与PeerDirect
  C++“Guru of the Week”系列已经由来已久。GotW最初创建于1996年底,为我们自己在PeerDirect的开发团队提供有趣的挑战和继续教育。我编写它是为了提供有趣味的学习工具,包括对继承和异常安全之类特性的正确用法的讲解。随着时间的推移,我还将它作为一种工具,用于向我们的团队介绍C++标准会议正在进行的改动。从那以后,GotW作为因特网新闻组comp.lang.c++.moderated的定期专栏对一般C++公众开放,在那儿你可以找到每一个新议题的问题和答案(以及大量有趣的讨论)。
  在PeerDirect用好C++非常重要,这与在你的公司用好C++的重要性有很多相同的理由,尽管要达到的目标可能并不相同。我们构建用于分布式数据库和数据库复制的系统软件,在这些领域,诸如可靠性、安全性、可移植性、效率,以及其他很多企业级议题,都是生死攸关的考虑。我们编写的软件要能够移植到不同的编译器和操作系统上,当发生数据库事务死锁、通信中断以及程序异常时,它要保持安全、强健。顾客用它来管理位于智能卡和pop终端或PalmOS和WinCE设备上的微型数据库,或管理部门级Windows NT和Linux、Solaris服务器,甚至管理Web服务器和数据仓库的大规模并行Oracle后端。这些都使用同样的软件、同样的代码,对可靠性有着同样的要求。现在,当我们费力地工作于大量的密集而未加注释的代码之上时,就会面临可移植性和可靠性的挑战。
  对于读者中过去几年来已经读过因特网上“Guru of the Week”的人,我有两句话要说:
  * 感谢你们的关心、支持、电子邮件、赞扬、纠正、评论、批评、提问,特别感谢你们对GotW系列印行成书的要求。它来了,希望你们喜欢。
  * 本书包含的内容比你在网上看过的多得多。
  本书并不只是对已经浮现于网络空间的陈旧的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
1999年6月

图书序言

这是一本非凡的书,不过直至快要读完全书我才意识到它是多么不平凡。这可能是第一本写给已经熟悉C++—熟悉C++的一切—的人看的书。从语言特性到标准库组件再到编程技术,本书从一个主题跳到另一个主题,总是使你处于些微失衡的状态,总是确保你专心致志。就像现实C++程序一样,类设计撞上虚函数的行为,迭代器协定碰到名字查找规则,赋值操作符擦上异常安全,编译依赖遭遇导出模板。就像在现实程序中的一样,语言特性、库组件和编程技术形成的混乱的大漩涡,精彩而令人眩晕。
  我将GotW(Guru of the Week)发音为“Gotcha(got you,抓到你了)”可能并无不妥。当我将自己针对书中测验给出的解决方案与Sutter的答案进行比较时,我往往会落入他(和C++)设置的陷阱中,次数之多,使我羞于承认。每当我犯错时,我几乎能看到Herb面带微笑轻声说道:“Gotcha!”也许有人争论这证明我对C++知之甚少,另有人可能宣称这说明C++太复杂,以至于任何人都很难精通它。我则认为这表明在使用C++进行工作时,你必须小心谨慎地思考你正在做的事情。C++是一门威力极大的语言,它被设计用于解决需求苛刻的问题,尽可能细致地磨练你在语言、库和编程惯用法方面的知识,至关重要。本书讨论主题范围之广,内容安排之独特(采用了基于测验的格式),对你的磨练过程将会助一臂之力。
  C++新闻组的老读者都知道选出“Guru of the Week”有多么困难,那些有经验的参与者对此更是深有体会。尽管在网上每周只能产生一名guru,然而有了本书提供的知识撑腰,每当编程时你都可冀望产出有着guru质量的代码。

Scott Meyers
1999年6月

作者简介

Herb Sutter:Herb Sutter:  Herb Sutter是广受赞誉的Exceptional三卷本 (《Exceptional C++》、《More Exceptional C++》和《Exceptional C++ Style》)的作者,还曾发表了上百篇软件开发方面的技术文章和论文。他是ISO C++标准委员会的主席、《C/C++ Users Journal》的撰稿编辑和专栏作者。同时,他还担任Microsoft Visual C++架构师,负责C++语言在.NET编程环境扩展 (C++/CLI) 方面的工作。

译者简介

聂雪军:2002年起从事软件开发工作,主要开发语言为C++,具有较丰富的Windows和Linux开发经验。译作有《C++编程风格》、《Exceptional C++中文版》等。

译者序

这是一本大师编写的C++书籍。
  能够成为一名大师,是每个C++程序员的梦想。在经过了几年的实践之后,许多程序员都能在日常工作中很好地应用C++来解决编程问题和实现功能模块。然而,在处理一些较为复杂的问题时,却往往还是会感到有些力不从心。例如,我们很难编写出非常稳定的代码;在设计大型系统时,总会有一些不完善的地方。有时候虽然能够从直觉上感觉到一些东西,但却始终无法找到问题的关键所在,也很难确定该从哪些方面来入手。究其原因,这是因为虽然我们已经掌握了C++,但对于一些深层次的细节,我们还没有进行深入和细致的研究。对于上述这些问题,本书将会给出很好的解答。
  本书主要有以下的特点:
  (1) 深入性。这是一本颇具深度的书籍。本书对C++的分析深度是很多C++书籍所不能达到的。对于书中的每个主题,作者首先从理论上进行了严谨的论证,然后再给出实际的代码进行全面和细致的分析,做到了详尽无遗。对于每一种应用,作者都非常清楚地解释了为什么要这么做,以及这种做法的使用环境。如果你已经具备了一定的C++基础,那么本书的内容能够对你的C++编程能力产生质的提升。
  (2) 拓展性。C++中的一些特性,例如异常安全性,对于编写高质量的程序来说,是非常必要的。但遗憾的是,到目前为止,了解并使用这些特性的程序员还是不多。大多数程序员都还是停留在一些普通的C++特性上,而很少会去研究C++的高级特性。本书对一些C++的高级特性进行了详细的阐述和分析,特别指出了在哪些情况下,这些特性的优势能够得到最大的发挥,以及这些特性能够为我们带来怎样的好处。通过对这些高级特性的学习,我们不仅能够从更全面的角度来看待问题,而且能够拓展新的设计思路。
  (3) 纠错性。在学习C++的过程中,我们免不了会犯一些错误,例如对继承的过度使用,好像“没有大量继承的OO就不是OO,而我们自己是很难发现这些错误的。久而久之,我们会不知不觉地陷入到一些思维陷阱中,并因此养成不好的编程习惯。本书的一大特点就是,在分析问题的同时,还指出了一些不好的编程习惯和常见的错误,并且解释了为什么这些做法是不好的或错误的。在阅读了这部分内容之后,你肯定会发现其中有些错误是你原来没有觉察到的,并且在今后的工作中,你也会有意识地去改正这些错误。
  对于本书的翻译工作,译者投入了大量的时间和精力,工作到凌晨是常有的事情。在翻译的过程中,对于每一个难以理解的地方,译者首先保证自己能够充分地理解,然后再用浅显的语言表达出来,从而帮助读者能够更快、更准确地理解书中的内容。参加本书翻译工作的还有李杨、吴汉平、徐光景、童胜汉、陈军、胡凯、李斌、张玮、陈红和刘红。由于译者的时间和水平有限,翻译中的疏漏和错误在所难免,还望读者和同行不吝指正。
  书山有路勤为径。只有让自己不断地学习,不断地提高,成为大师的梦想才有可能实现。祝愿所有的C++程序员都能实现自己的梦想。
致谢
  首先要感谢陈冀康编辑对我的信任和耐心,使得我能够顺利地完成本书的翻译工作。感谢李南丰编辑对本书的审阅,帮助我改正了译稿中的一些错误。在翻译本书的时候,妻子云兰正在准备迎接我们的第一个孩子。感谢你们,你们是我所有的动力。感谢我的父母,你们一直都在默默地支持着我。

聂雪军
2006年8月于北京

图书目录

第1章  泛型程序设计与C++标准库 1
条款1:迭代器 1
条款2:大小写不敏感的字符串—之一 3
条款3:大小写不敏感的字符串—之二 7
条款4:可重用性最大的泛型容器—之一 9
条款5:可重用性最大的泛型容器—之二 9
条款6:临时对象 16
条款7:标准库的使用(再论临时对象) 21
第2章  异常安全性的问题与技术 23
条款8:编写异常安全的代码—之一 23
条款9:编写异常安全的代码—之二 27
条款10:编写异常安全的代码—之三 30
条款11:编写异常安全的代码—之四 34
条款12:编写异常安全的代码—之五 36
条款13:编写异常安全的代码—之六 41
条款14:编写异常安全的代码—之七 46
条款15:编写异常安全的代码—之八 48
条款16:编写异常安全的代码—之九 50
条款17:编写异常安全的代码—之十 54
条款18:代码的复杂性—之一 55
条款19:代码的复杂性—之二 58
第3章  类的设计与继承 63
条款20:类的编写技巧 63
条款21:对虚函数进行重载 68
条款22:类之间的关系—之一 73
条款23:类之间的关系—之二 76
条款24:继承的使用和误用 81
条款25:面向对象程序设计 89
第4章  编译器防火墙和Pimpl惯用法 91
条款26:将编译期依赖性降到最低—之一 91
条款27:将编译期依赖性降到最低—之二 93
条款28:将编译期依赖性降到最低—之三 97
条款29:编译防火墙 99
条款30:Fast Pimpl惯用法 102
第5章  名字查找、名字空间和接口规则 109
条款31:名字查找与接口规则—之一 109
条款32:名字查找与接口规则—之二 111
条款33:名字查找和接口规则—之三 119
条款34:名字查找与接口规则—之四 122
第6章  内存管理 129
条款35:内存管理—之一 129
条款36:内存管理—之二 131
条款37:auto_ptr 136
第7章  误区、陷阱以及错误的惯用法 147
条款38:对象标识 147
条款39:自动转换 149
条款40:对象的生存期—之一 151
条款41:对象的生存期—之二 153
第8章  其他主题 161
条款42:变量的初始化 161
条款43:正确地使用const 162
条款44:类型转换 169
条款45:bool 174
条款46:转调函数 177
条款47:控制流程 179
参考文献 186
后记 187

教学资源推荐
作者: [美] 斯图尔特·里杰斯(Stuart Reges) 马蒂·斯特普(Marty Stepp) 艾利森·奥伯恩(Allison Obourn) 著
作者: (美)Clovis L.Tondo,Scott E.Gimpel
作者: 郑阿奇
作者: 马玉春 李壮 张鲲 黄应红 编著
参考读物推荐
作者: IBM公司
作者: [美] 苏妮塔·钱德拉塞克兰(Sunita Chandrasekaran) [德]吉多· 杰克兰德(Guido Juckeland) 编
作者: 贾佳 郝洪明