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

More Exceptional C++ (英文版)
作者 : Herb Sutter
丛书名 : C++设计新思维
出版日期 : 2006-03-03
ISBN : 7-111-18370-3
定价 : 36.00元
扩展资源下载
扩展信息
语种 : 英语
页数 : 279
开本 : 16开
原书名 : More Exceptional C++: 40 New Engineering Puzzles, Programming Problems, and Solutions
原出版社: Addison Wesley
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

本书针对Exceptional C++中所没有提及的40个使用C++的实际问题,采用实用的“问题和解决方案”的格式,提供成功的解决策略。
  本书通过这40个问题帮你理解关于C++软件设计和开发成败的规则和问题,这些问题强调泛型编程、内存管理和使用C++标准库等等。
  本书是高级程序员必备的C++读物,它有助于使用C++写出非常出色的代码,从而加强你对语言的深刻理解和丰富实践。

  本书英文支持网页:http://www.gotw.ca/publications/mxc++.htm

图书特色

图书前言

“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


前   言
  古希腊哲学家苏格拉底通过向学生提问进行教学。那些问题被设计用于引导他们,帮助他们从已知的东西得出结论,还向他们展示正在学习的东西是如何相互联系的,又如何与他们已有的知识相互联系。这种教学方式是如此著名,以至于今天我们称之为“苏格拉底教学法”。从我们作为学生的观点来看,苏格拉底的教学方法能够引起我们的兴趣,促使我们思考,帮助我们联系并应用已知的知识去获取新知识。
  本书与其姊妹篇《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誷 Journal》、《C++ Report》(已停刊)以及其他出版物撰写的专栏和文章。与最初的版本相比,本书中的材料经过大幅修订、扩充、校正和更新,因而本书(连同www.gotw.ca上不可或缺的勘误表)应被视作那些原始材料的最新权威版。

我假定你已经知道的
  我期望你已经掌握了C++基础知识,如果你还没有,可以从一本介绍性和概览性的C++好书开始学习。像Bjarne Stroustrup的《The C++ Programming Language》(第3版)[Stroustrup00]或Stan Lippman和Jos巈 Lajoie合著的《C++ Primer》(第3版)[Lippman98]这样的经典著作都是不错的选择。接下来,务必选读一本编程风格指南,例如Scott Meyers的经典著作《Effective C++》系列[Meyers96][Meyers97]。我发现基于浏览器的CD版[Meyers99]方便且实用。

如何阅读本书
  书中的每一个条款都以谜题或问题的形式呈现,并带有一个介绍性的头部,如下所示:
  标题和难度等级提示你将要遭遇到什么。注意,难度等级只是我自己预期大多数人认为问题有多难的主观猜测,因此,你也许会发现对你而言一个难度等级为7的问题比某个难度等级为5的问题更简单。自从写作《Exceptional C++》以来,我就不断收到一些电子邮件,说“条款N比你说的要容易(或困难)!”对于同一个条款而言,不同的人认为“更容易”或“更困难”是很正常的。难度等级因人而异,任何条款的实际难度取决于你的知识和经验,它们对于其他人而言则可能更容易或更困难一些。话虽如此,大多数情况下你应该发现这些难度等级对你将要看到的内容(的难度)还是给出了合理的提示。
  你也许打算从头至尾按顺序阅读本书,这很好,但你未必非得这样不可。你也许决定阅读某个特定章节中的所有条款,因为你对该章节的主题特别感兴趣,这同样很好。除了被我称为“小型系列”的那些被标以“Part 1”、“Part 2”等条款讨论的是相关的问题外,书中条款通常是相当独立的,因此你可以遵循条款之间的交叉引用以及对《Exceptional C++》的引用,自由地跳着读。我唯一要忠告的是,那些“小型系列”要成组按顺序阅读,除此之外,如何阅读全凭你的喜好。

名字空间、typename、引用及其他约定
  我在书中给出了不少建议,但我不会给你这样的指导方针:叫你去做连我自己都没做过的事。这包括我在整本书中我自己的示例代码中做的事。我还随既有实践和现代风格的大流,即便有时这并无实质性的影响。
  在这方面,有必要说一下名字空间。在示例代码中,如果你在一个例子中看到一个文件范围的using指令,而在几页或几个条款之后的另一个例子中看到函数范围的using指令,这并没有什么深层次的原因,只是说明在该特定的情形下,那种用法是合适的,并且带给我美学上的愉悦,如是而已。如欲了解名字空间的基本原理,可阅读条款40。在正文中,当我想强调正在讨论的是标准库设施时,我会使用以std::限定的标准库名字,一旦确立了这一点,我通常重新使用非资格限定名字。
  谈及模板参数的声明,我不时碰到一些人说写class而不是typename是过时的做法,即便这二者之间并无功能上的差别,而且标准文档自身都到处使用class。纯粹出于对风格的考虑,并且强调本书是关于今天的现代C++的,我已经转而使用typename而不是class来声明模板参数了。唯一的例外是在条款33中的某一处,由于那是我直接从标准中摘来的,标准使用的是class,我也就懒得动它了。
  除非我明确指出某段代码是一个“完整的程序”,否则它很可能不是。记住,代码示例通常只是代码片段或部分的程序,别指望它们能被独立编译。为了从这些代码片段构建出完整的程序,通常你需要补充一些显而易见的边角代码。
  最后,关于URL有必要多说一句:在Web上,东西会动来动去。尤其是,我无法控制的一些内容会动来动去。这使得在印刷书籍上刊印随意的Web URL就变成了真正的痛苦:恐怕在该书下厂印刷之前那些URL就已经过时了,更不要说等它在你的书桌上躺上5年之后了。当我在本书中引用他人的文章或Web站点时,我是通过自己的Web站点(www.gotw.ca)上的URL做到这一点的—我自己的Web站点是我所能控制的,它只包含对实际Web网页的重定向链接。如果你发现印刷在本书中的一个链接不再有效,请写邮件告诉我,我将更新该链接,使其指向新的网页位置(如果我还能找到该网页的话),或者告诉你该网页已不复存在(如果我找不到的话)。不管怎么说,本书的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
2001年6月于多伦多

封底文字

图书序言

如何才能成为专家?在我了解的所有领域中答案都是一样的:
  1. 学习基础知识。
  2. 再一次学习同样的素材,但这一次集中于你初次学习时未意识到其重要性的细节。
  如果你选择了适当的细节且对它们的掌握透彻到无需为之费神的地步,你就快要成为一位专家了。然而,在真正成为专家之前,你又如何知道应该选择哪些细节呢?如果有人已经为你挑选好适当的细节,你学习起来将会更快速、更快乐。
  例如,我曾经参加过一位不错的摄影师Fred Picker举办的摄影研讨班。他告诉我们,摄影只有两个困难的环节,一是如何取景,二是何时按快门。接下来他花费大部分研讨班时间向我们介绍关于曝光、加工和冲印的技术细节—只有彻底理解了这些细节,我们才能很好地掌握摄影,否则关注那两个“困难”的环节就了无意义。
  尝试回答关于C++程序的问题,是一种尤其富有乐趣的学习C++编程细节的方式。例如:
  * f(a++);和f(a); ++a;具有相同的效果吗?
  * 你能使用一个迭代器来改变一个set的内容吗?
  * 假定你正在使用一个名为v的vector,它占用的内存已经增长至让人感到不爽的地步,你希望清除该vector并将其占用的内存归还给系统,那么,v.clear()能胜任吗?
  你也许已经猜到这些貌似明显的问题答案必定是“no”,否则我就不会问这些问题了,但你知道答案为何是“no”吗?你确信?
  本书回答了这些问题以及其他很多精心挑选的“貌似很普通的程序”的问题。没有多少书籍像本书一样(当然了,它的姊妹篇《Exceptional C++》除外)。很多宣称是“高级”的C++书籍,要么是关于专门的主题(只有当你希望精通这些特定的主题而非试图深入研究日常编程问题时,这些书才有意义),要么纯粹是拿“高级”一词来吸引读者的眼球。
  一旦透彻理解了这些问题及其答案,你在编程时就不必过多地烦神于有关细节,大可将精力集中于真正努力解决的那些问题之上。

Andrew Koenig
2001年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) 方面的工作。

推荐序

图书目录

Item 1: Switching Streams (2 / 10).
Item 2: Predicates, Part 1: What remove() Removes (4 / 10).
Item 3: Predicates, Part 2: Matters of State (7 / 10).
Item 4: Extensible Templates: Via Inheritance or Traits  7/ 10).
Item 5: Typename (7 / 10).
Item 6: Containers, Pointers, and Containers That Aren't (5 / 10).
Item 7: Using Vector and Deque (3 / 10).
Item 8: Using Set and Map (5 / 10).
Item 9: Equivalent Code (5 / 10).
Item 10: Template Specialization and Overloading (6 / 10).
Item 11: Mastermind (8 / 10).
Optimization and Performance.
Item 12: Inline (4 / 10).
Item 13: Lazy Optimization, Part 1: A Plain Old String (2 / 10).
Item 14: Lazy Optimization, Part 2: Introducing Laziness (3 / 10).
Item 15: Lazy Optimization, Part 3: Iterators and References (6 / 10).
Item 16: Lazy Optimization, Part 4: Multi-Threaded Environments (8 / 10).
Exception Safety Issues and Techniques.
Item 17: Constructor Failures, Part 1: Object Lifetimes (4 / 10).
Item 18: Constructor Failures, Part 2: Absorption (7 / 10).
Item 19: Uncaught Exceptions (6 / 10).
Item 20: An Unmanaged Pointer Problem, Part 1: Parameter Evaluation (6 / 10).
Item 21: An Unmanaged Pointer Problem, Part 2: What About auto_ptr (8 / 10).
Item 22: Exception-Safe Class Design, Part 1: Copy Assignment (7 / 10).
Item 23: Exception-Safe Class Design, Part 2: Inheritance (6 / 10).
Inheritance and Polymorphism.
Item 24: Why Multiple Inheritance (6 / 10).
Item 25: Emulating Multiple Inheritance (5 / 10).
Item 26: Multiple Inheritance and the Siamese Twin Problem 4 / 10).
Item 27: (Im)pure Virtual Functions (7 / 10).
Item 28: Controlled Polymorphism (3 / 10).
Memory and Resource Management.
Item 29: Using auto_ptr (5 / 10).
Item 30: Smart Pointer Members, Part 1: A Problem with auto_ptr (5 / 10).
Item 31: Smart Pointer Members, Part 2: Toward a ValuePtr (6 / 10).
Free Functions and Macros.
Item 32: Recursive Declarations (6 / 10).
Item 33: Simulating Nested Functions (5 / 10).
Item 34: Preprocessor Macros (4 / 10).
Item 35: #Definition (4 / 10).
Miscellaneous Topics.
Item 36: Initialization (3 / 10).
Item 37: Forward Declarations (3 / 10).
Item 38: Typedef (3 / 10).
Item 39: Namespaces, Part 1: Using-Declarations and Using-Directives (2 / 10).
Item 40: Namespaces, Part 2: Migrating to Namespaces (4 / 10).
Afterword.
Appendixes,
Appendix A. Optimizations That Aren't (In a Multithreaded World).
Appendix B. Test Results for Single- versus Multi-Thread-Safe String Implementations.
Bibliography.
Index.

教学资源推荐
作者: Y. Daniel Liang
作者: [美]杰瑞 R. 汉丽(Jeri R. Hanly)埃利奥特 B. 考夫曼(Elliot B. Koffman) 著
参考读物推荐
作者: [美]马克·卢茨(Mark Lutz)著
作者: 达观数据 著
作者: 金华,胡书敏 编著