C++编程思想 第2卷:实用编程技术
作者 : Bruce Eckel, Chuck Allison
译者 : 刁成嘉 等
丛书名 : 计算机科学丛书
出版日期 : 2005-10-18
ISBN : 7-111-17115-2
定价 : 59.00元
教辅资源下载
扩展信息
语种 : 简体中文
页数 : 510
开本 : 16开
原书名 : Thinking in C++,Volume Two: Practical Programming
原出版社: Prentice Hall
属性分类: 教材
包含CD :
绝版 :
图书简介

《C++编程思想》(第1版) 荣获1996年度《软件开发》杂志的图书震撼大奖 (Jolt Award),成为该年度最佳图书。

  本书内容:
  ●介绍实用的编程技术和最佳的实践方法,解决C++开发中最困难的课题。
  ●深入研究标准C++库的功能,包括:字符串、输入输出流、STL算法和容器。
  ●讲述模板的现代用法,包括模板元编程。
  ●解开对多重继承的困惑,展示RTTI的实际使用。
  ●深入探究异常处理方法,清晰解释异常安全设计。
  ●介绍被认为是标准C++下一版特征之一的多线程处理编程技术,并提供最新研究成果。
  ●对书中包含的所有示例代码都提供免费下载,这些代码段经过多个软件平台和编译器(包括基于Windows/Mac/Linux的GNU C++编译器) 的测试,稳定可靠。
  
  在本书作者的个人网站www.BruceEckel.com上提供:
  ●本书的英文原文、源代码、练习解答指南、勘误表及补充材料。
  ●本书相关内容的研讨和咨询。
  ●本书第1卷及第2卷英文电子版的免费下载链接。

图书特色

图书前言

通过对本套教材第1卷的学习,读者已经掌握了C与C++的基础知识。这一卷将涉及其更为高级的特性,使读者领悟C++编程的方法与思想,从而编写出健壮的C++程序。
  现在假定读者已经熟悉了第1卷的内容。
  
目标
  编写这套教材的目标是:
  1. 每节只介绍适当的学习内容,使学习向前推进一小步。因此读者能很容易地在继续下一步学习前消化每个已学过的概念。
  2. 讲授实用编程技巧,以便读者在日常的学习和工作中使用这些技巧。
  3. 只把对于理解这门语言比较重要的内容介绍给读者,而不是将我们所知的一切都罗列出来。我们相信,不同信息的重要性是不同的。有些内容对于95%的程序员来说肯定没有必要知道,这些信息只会迷惑人们,加深人们对这门语言复杂性的恐惧。举一个关于C语言的例子,如果记住运算符优先级表(我们从未做到这一点),就能够写出漂亮的代码。但如果对其进行深究,它会让代码的读者或维护者感到迷茫。所以可以摒弃优先级,而在优先级不很清楚的情况下使用括号。同样,C++语言中的某些信息对于写编译程序的人员来说更为重要,而对程序员来说却没那么重要。
  4. 尽可能将每一节内容充分集中,使得授课时间及两个练习之间的间隔时间不长。这样不仅能使读者的思维在每次课堂研讨会期间更加活跃与投入,还可使他们有更大的成就感。
  5. 尽力不用任何特定厂商的C++版本。我们已在所有能见到的C++实现版本中测试了本教材中的代码(前言中稍后将有介绍),有的实现版本无法工作,那是因为它没有遵循C++标准,我们已经在示例中标注这些事实(读者会在源代码中看到这些标注),以便将其从构建过程中摒弃。
  6. 教材中代码的自动编译和测试。由于已经发现未经编译和测试的代码很可能有问题,所以在这一卷中,本教材所提供的例子全是测试过的代码。此外,读者可从http://www.MindView.net下载这些代码,它们是直接从本教材的文本中摘录的,这些程序能够用自动生成的测试文件进行编译和运行测试。读者可以通过这种方式知道教材中的代码都是正确的。

各章简介
  下面是本教材各章内容的简要介绍。
  第一部分  建立稳定的系统
  第1章  异常处理。出错处理在程序设计中一直是一个问题。即便你返回了错误信息或设置了一个标志,函数调用者还会对此视而不见。异常处理是C++的主要特征之一,该机制解决这类问题的方法如下:在致命错误发生时,允许该函数“抛出”一个对象。对应于不同的错误抛掷不同类型的对象,那么该函数的调用者就可以在独立的出错处理子程序中“捕获”这些对象。如果程序中抛出了一个异常,该异常就不能被忽略,这样就可以保证会触发一些事件来响应这一错误。决定采用异常处理机制是影响代码设计向良性方向发展的重要方法。
  第2章  防御性编程。许多软件故障都是可以预防的。防御性编程是一种编写代码的方式,采用此种方式能够较早地发现并更正错误,从而避免了这些错误对相关工作区域造成的危害。在开发过程中使用断言(assertion)是一种很重要的方法,该方法能够在程序员编写代码的过程中进行合法性检验,与此同时在代码中留下了一个可执行文档,该文档可用来揭示程序员开始编写代码时的思路。在向用户交出程序前应严格地测试编写的代码。对于成功地进行常规软件开发的人员来说,自动单元测试框架是一个不可缺少的工具。
  第二部分  标准C++库
  第3章  深入理解字符串。最为常见的编程工作是对文本进行处理。C++字符串类将程序员从内存管理事务中解脱出来,使其有足够的时间和精力增强文本处理能力。此外,为适应国际化应用的需求,C++也支持对宽字符和区域字符的操作。
  第4章  输入输出流。输入输出流类是最早的C++库之一,它提供必不可少的输入输出功能。使用输入输出流类就是用I/O库来代替C语言中的stdio.h。这种I/O库用起来更容易、更灵活并且更易于扩展—可对其做适当的调整使之能够与新定义的类一起工作。该章告诉读者怎样充分利用现有的输入输出流类库来实现标准I/O、文件I/O以及内存中的格式化操作。
  第5章  深入理解模板。现代C++的显著特征是模板的强大功能。模板的作用不仅仅在于生成容器。借助于模板,还可开发出具有健壮性、通用性和高性能的类库。关于模板的内容,需要了解的还有很多,它们构成了C++语言内的一个子语言,使得程序员能在更大程度上控制编译过程。模板的引入对C++程序设计来说是一场革命,可以毫不夸张地说,自从有了模板,C++程序设计焕然一新了。
  第6章  通用算法。算法处于计算的核心。C++借助其模板功能提供了一大批功能强大、高效且易用的通用算法。标准算法也可以通过函数对象进行自定义。该章研究了模板库中的所有算法。(第6章和第7章讲的是标准C++模板库,也就是通常所说的标准模板库(Standard Template Library,STL)。)
  第7章  通用容器。C++以一种类型安全的方式提供对所有常见数据结构的支持。用户不必为容器中的内容而感到忧虑, 其对象的同一性得到了保证。可通过迭代器将容器的遍历与容器自身相分离,这是模板的又一杰作。这种巧妙的安排能够将算法灵活应用于容器,而容器则采用了最简单的设计。
  第三部分 专题
  第8章  运行时类型识别。当你只用一个对象指针或引用指向基类型时,运行时类型识别(RunTime Type Identification,RTTI)就会找到该对象的确切类型。一般情况下,有时会有意忽略掉一个对象的确切类型,而利用虚函数机制实现对应于那个类型的正确操作。但有时(比如当编写像调试器这样的软件工具时)借助于此信息知道一个对象的确切类型是非常有用的,常常可以非常有效地进行某些特殊操作。这一章解释RTTI的用途及其使用方法。
  第9章  多重继承。一个新类可以从多个现存类中继承,这话乍听起来很简单。但是,由此而产生的二义性和对基类对象的多次复制将很难避免。这些问题可通过建立虚基类来解决,但更大的问题仍然存在:什么时候用多重继承?只有当你需要通过多于一个的公共基类来操作一个对象时,多重继承才是必需的。这一章对多重继承的语法做了解释,也提出了可选方案—特别针对使用模板怎样解决一个典型问题进行了深入讨论。运用多重继承来修复一个“被损坏了的”类接口是关于C++这一特性的经典案例。
  第10章  设计模式。自从对象产生以来,在程序设计领域最具革命性的飞跃是设计模式的引进。设计模式是对应于公认的编程问题的经典解决方案,它独立于语言之外,其表述方式的特殊性使它能应用于许多情况之下。因此,像单件(Singleton)、工厂方法(Factory Method)和访问者(Visitor)这样的模式现都已被一般的程序员接受和使用了。这一章介绍如何通过C++来实现和使用一些较为有用的设计模式。
  第11章  并发。人们越来越期待有响应功能的用户接口,而这种接口能(看起来像)同时处理多任务。现代操作系统允许进程拥有共享进程地址空间的多线程。多线程程序设计要求编程人员有与众不同的思维方式,然而,在进行多线程程序设计时也会遇到一些困难。这一章通过一个可免费获得的类库(由IBM的 Eric Crahen 提供的ZThread库)介绍怎样使用C++来有效地管理多线程应用。

练习
  我们发现,在课堂讨论期间使用简单的练习特别有助于学生对相关概念的理解。所以,在每一章后面都附有一定量的练习题。
  这些练习题十分简单,可当堂完成;但有一点,需要有老师在场观察证实,以确保所有的学生都掌握了相关内容。有些练习题有一定的挑战性,是为激发优秀学生的学习兴趣准备的。所有练习被设计为可以在短时间内完成,只是用来测试和完善学生所掌握的知识,而不是为了提出挑战(很可能读者自己会找到这些难题—或者更可能的是难题会自己找上门来)。

源代码
  本教材的源代码是免费版权软件,通过网站http://www.MindView.net发布。该版权是为了防止在未经许可的情况下在印刷媒体上再度出版这些代码。
  在解压缩代码的起始目录中你会发现下列的版权声明:
  只要遵守以上的版权声明,读者就可以在自己的项目里和课堂上使用这些代码。

编译器
  读者使用的编译器可能不支持本教材所论及的C++的所有特征,尤其是当该编译器并非是其最新版本的时候,这种情况就显得尤为突出。所以实现像C++这样的语言绝非易事;同时读者会希望C++的特征一点点展现,而非一下子全部出现。但是,如果读者试做了教材中的一个例子,结果编译器报告了一大堆错误,这就不一定仅仅是代码或编译器中的一个故障那么简单了—很可能在读者选用的编译器上根本就运行不了那个代码。
  教材中的代码已经用很多编译器进行过测试,目的是确保这些代码符合C++标准,并且在尽可能多的编译器上运行。遗憾的是,并非所有的编译器都符合C++标准,因此在使用这些编译器构造可执行文件时,去掉了某些文件。这些被去除的文件在makefiles里都有体现,而makefiles是为这本教材的代码包自动生成的,并且可从 http://www.MindView.net 下载。在makefiles中,从每个程序代码清单开头的注释中都可以看到这些嵌入的排除标记符,这样读者将会知道是否应让某个特定的编译器来运行那个代码(少数情况下,编译器确实会编译代码,但执行动作却是错的,本教材将这些代码也排除在外)。
  下面就是有关的排除标记符和相应的编译器:
  * {-dmc}Walter Bright 的Digital Mars编译器,专为Windows设计,可从www.DigitalMars.com免费下载。这种编译器兼容性超强,整本教材中几乎都看不到该排除标记符。
  * {-g++}免费的Gnu C++ 3.3.1,在大多数Linux软件包和Macintosh OSX中都预装了该编译器。该编译器也是专为Windows设计的Cygwin的一部分(见下文)。从gcc.gnu.org可以得到其为大多数其他操作平台而设计的版本。
  * {-msc}Visual C++.NET是微软(Microsoft)推出的第7版编译器(使用前必须先安装Visual Studio.NET,不能免费下载)。
  * {-bor}Borland C++第6版(不可免费下载;这是最新的版本)。
  * {-edg}Edison Design Group (EDG) C++。该编译器可用来检测代码是否符合标准C++。只是由于类库的原因才出现了这个标记符,因为本教材采用了Dinkumware有限公司赠送的带有兼容类库的EDG前端免费副本。单独使用编译器不会出现任何编译错误。
  * {-mwcc}为Macintosh OSX设计的Metrowerks Code Warrior。注意,使用OSX也必须先安装Gnu C++编译器。
  如果从http://www.MindView.net下载并解压了本教材的代码包,读者会发现用来为上述编译器建立代码的构造文件(makefiles)。本教材使用免费的GNU-make, 它在Linux、Cygwin(一个可在Windows上运行的免费Unix shell,详见www.Cygwin.com)环境下运行,也可安装在读者自己的计算机平台上—详见www.gnu.org/software/make。(这些文件在其他make上也可能运行,但得不到支持。)一旦安装了make,如果在命令行运行方式下键入make,就会得到有关如何为上述编译器建立教材中代码的操作步骤。
  注意,本教材程序示例文件中的这些标记符指出了当时调试用的编译器的版本。很可能在这本教材出版后相应的编译器版本已经升级。也有可能我们在使用很多编译器对本教材中的代码进行编译时,错误地配置了某个编译器;如果没有配错编译器,则相应的代码应该早已经被正确地编译。因此,在自己的编译器上重新调试这些代码,并检查从http://www.MindView.net网站下载的代码是否为最新版本就显得尤为重要。

语言标准
  在本教材中,当提到ANSI/ISO C标准时,指的是1989标准,而且一般情况下只是说“C”。只有当有必要区分标准1989 C和较早的版本,如制定标准前的C语言版本时,才会做出区分。在本教材中并不涉及C99。
  ANSI/ISO C++委员会很早以前就制定出了第一个C++标准,通常称为C++98。本教材用“标准C++”来指这个标准化语言。如果只说C++,那就意味着是“标准 C++”。C++标准委员会还在继续发布对使用C++的公众群体很重要的信息,这些会促使另一C++标准C++Ox的形成,但它的产生在近几年内不太可能实现。

研讨班和咨询
  Bruce Eckel的公司—MindView公司,提供基于本教材中的材料和高级主题的公共实习培训研讨班。每课所讲的都是从各章中精选的内容,每次讲授完毕,后面有一个检测练习阶段,每个学生都能够受到个别指导。我们还提供现场培训、咨询、辅导、设计和代码演练的服务。从http://www.MindView.net网站上可获得有关即将开办的研讨班信息、相关报名表和其他联系信息。

错误
  无论我们怎样挖空心思地去检查错误,总会漏掉一些错误,但这些错误却常常能被热心的读者发现。如果读者发现了任何认为是错误的地方,请使用本教材电子版中的反馈系统与我们联系。读者可在http://www.MindView.net网站上找到该系统。非常感谢您的帮助。

关于封面
  封面上的艺术作品由Larry O誃rien的妻子Tina Jensen绘制(是的,就是那个在《软件开发》杂志中任多年编辑的Larry O誃rien)。封面不但图画很美,而且也很好地体现了多态性。采用这些图画的灵感来源于Daniel Will-Harris,他是一位封面设计者(www.Will-Harris.com),Bruce 的同事。

致谢
  本教材的第2卷曾长时间停留在完成一半的状态,这是因为Bruce还要去做其他事情,即忙于Java、设计模式,尤其是Python (详见www.Python.org)等方面的工作。如果Chuck那时没有心甘情愿地(Chuck 有时认为自己当时的做法很愚蠢)去完成本书的另一半工作,这本教材几乎就不会问世。他是Bruce愿把这份未完的工作托付给的极少数人之一。Chuck 做什么事都追求精确无误,他清晰的解释促成了本教材今天的辉煌。
  Jamie King是在本教材完成过程中由Chuck指导的实习生。他是保证这本教材顺利完成必不可少的一分子;他不但为Chuck提供反馈信息,更可贵的是他不懈地发现与置疑他不完全理解的教材中的每一个细节。如果本教材回答了读者的问题,那么很可能就是因为Jamie先问过这个问题了。Jamie还改进了许多示例程序并在每一章的末尾设计了很多练习题。Chuck的另一位由MindView公司资助的实习生Scott Baker帮助完成了第3章的练习题。
  IBM的Eric Crahen在第11章(并发)的完成过程中发挥了很大作用。在寻找合适的线程软件包时,我们找到了一个直观、易用的软件包,而且该软件包在完成工作的过程中体现了足够的健壮性。我们从Eric那里得到了这个软件包以及其他一些帮助—他非常乐于合作,而且他还根据使用中的反馈意见来增强他的类库,我们也从他的见解中获益很多。
  非常感谢Pete Becker担任本教材的技术编辑。极少有人能像Pete那样出众而且善于表达自己的想法。像Pete那样能够精通C++和软件开发的人也不多。我们也非常感谢Bjorn Karlsson的慷慨和他及时的技术支持,因为他审阅了整个文稿,并做了精辟的批注。
  Walter Bright为确保他的Digital Mars C++编译器可以编译教材中的所有实例,曾做过不懈的努力。他还将其编译器作为http://www.DigitalMars.com上可免费下载的软件。谢谢了,Walter!
  本教材中的思想和见解来源于许多方面。包括:我们的朋友们,如Andrea Provaglio、Dan Saks、Scott Meyers、 Charles Petzold和Michael Wilk;语言开拓者,如Bjarne Stroustrup、Andrew Koenig和Rob Murray;C++标准委员会成员,如Nathan Myers(他给我们提供了特别的帮助和毫无保留的见解)、Herb Sutter、PJ Plauger、 Kevlin Henney、David Abrahams、Tom Plum、Reg Charney、Tom Penello、Sam Druker、Uwe Steinmueller、John Spicer、Steve Adamczyk和Daveed Vandevoorde;在软件开发会议上就C++领域发展进程发过言的人员(该会议由Bruce创建和促进,Chuck在会上发表演说);Michael Seaver、Huston Franklin、David Wagstaff等Chuck 的同事;还有培训班上的学生们,我们需要认真听取他们的问题从而使这本教材更加清晰易懂。
  本教材的规划、字体的选择、封面设计以及封面照片由Bruce的朋友Daniel Will-Harris来完成,他是著名作家和设计师。他在初中时就常常研究字母,那时就期待着计算机的发明和桌面排版系统的问世。此外,我们自己做了排版文件,所以排版错误是我们的错误。本教材是使用Microsoft* Word XP来编写的。排版文件也是使用该软件生成的。正文的字体选用Georgia,标题采用的是Verdana,代码采用的字体是Andale Mono(以上指本书英文版)。
  在这里也感谢Edison Design Group和Dinkumware有限公司慷慨的专业技术人员,感谢他们让我们免费拷贝了他们的编译器和类库(分别拷贝的)。没有他们的专业帮助及无私的给予,本教材中的一些程序示例根本无法得到调试。还要感谢Howard Hinnant和Metrowerks的工作人员,感谢让我们拷贝他们的编译器;还要感谢Sandy Smith和SlickEdit的人员,正是他们这么多年来一直为Chuck提供世界一流的编写环境。此外,Greg Comeau也贡献出了他的基于EDG的编译器的拷贝(Comeau C++),这里一并表示感谢。
  特别要感谢我们的所有老师及所有学生(他们也是我们的老师)。
  Evan Cofsky(Evan@TheUnixMan.com) 提供了服务器方面的多种帮助。他也曾用其擅长的语言—Python,在程序研发工作中为本教材尽心尽力。Sharlynn Cobaugh 和Paula Steuer 也帮了不少忙,他们的帮助使Bruce 能够从繁忙的项目中脱身出来。
  Bruce 的妻子Dawn McGee在本教材编写期间给予了很多灵感和巨大热情。以下是对本教材的出版给予过支持的朋友们的部分名单,但不是全部:Mark Western、Gen Kiyooka、Kraig Brockschmidt、Zack Urlocker、Andrew Binstock、Neil Rubenking、Steve Sinofsky、JD Hildebrandt、Brian McElhinney、Brinkley Barr、Midnight Engineering 杂志的Bill Gates、Larry Constantine和Lucy Lockwood、Tom Keffer、Greg Perry、Dan Putterman、Christi Westphal、Gene Wang、Dave Mayer、David Intersimone、Claire Sawyers、几位意大利籍朋友(Andrea Provaglio、Laura Fallai、Marco Cantu、Corrado、Ilsa 和 Christina Giustozzi)、Chris 和 Laura Strand、Almquist一家、Brad Jerbic, John Kruth & Marilyn Cvitanic, Holly Payne(就是那个著名的小说家!)、Mark Mabry、Robbins一家、Moelter 一家(还有 McMillan一家)、Wilk一家、Dave stoner、Laurie Adams、Cranston一家、Larry Fogg、Mike 和 Karen Sequeira、Gary Entsminger 和Allison Brody、Chester Andersen、Joe Lordi、Dave和Brenda Bartlett、Rentschler一家、Sudek一家、Lynn和Todd,还有他们的家人。当然,还有我们的父母、Sandy、James和Natalie、Kim和Jared、Isaac和Abbi。

作者简介

Bruce Eckel, Chuck Allison:Bruce Eckel:  Bruce Eckel 是MindView公司 (www.MindView.net) 的总裁,向客户提供软件咨询和培训。他是C++标准委员会拥有表决权的成员之一。他也是《Java编程思想》(该书第3版影印版及翻译版已由机械工业出版社引进出版)、《C++编程思想 第1卷》及其他C++著作的作者,已经发表了150多篇论文 (其中有许多C++语言方面的论文) ,他经常参加世界各地的研讨会并进行演讲。
Chuck Allison:  Chuck Allison曾是《C/C++ Users》杂志的资深编辑,著有《C/C++ CodeCapsules》一书。他是C++标准委员会的成员,犹他谷州立学院的计算机科学教授。他还是Fresh Sources公司的总裁,该公司专门从事软件培训和教学任务。

译者简介

刁成嘉 等:暂无简介

译者序

C++语言是一种使用广泛的程序设计语言,掌握了C++基础知识和基本编程技巧的人们,如果还想对C++有深入的了解,并且掌握更高级的C++编程技术的话,我们愿意向广大读者推荐《C++编程思想  第2卷:实用编程技术》的中译本。作者Bruce Eckel是C++标准委员会拥有表决权的成员之一,本书第1版荣获《软件开发》杂志评选的1996年度图书震撼大奖(Jolt Award),成为该年度最佳图书,在美国非常畅销。本书内容十分丰富,结构设计循序渐进,案例翔实而深入浅出,有一定的深度和广度。
  二位作者致力于计算机教学数十年,经验十分丰富。在本书的讲授方法、例子和每章后面的练习的选用上都别具特色。通过一些非常简单的例子和简练的叙述,准确地阐明了C++编程实践中最困难的一些问题和概念,给人以拨云见日、耳目一新的感觉。读者在学习那些原本难于理解的内容时,常常会有豁然开朗的奇特效果,从而在不知不觉中接受并掌握了实用的编程技术。
  本书介绍了实用的编程技术和最佳的实践方法,解决了C++开发中最困难的课题。内容上分为3部分:第二部分深入探究异常处理方法,清晰解释了异常安全设计;第三部分研究了C++的字符串、输入输出流、STL算法和容器;详细阐述了模板的现代用法,包括模板元编程;第三部分解释多重继承的难点,展示RTTI的实际使用,描述典型的设计模式及其实现,介绍被认为是标准C++下一版特征之一的多线程处理编程技术,并提供了最新的研究成果。书中所举的程序例子都经过多个软件平台和编译器的测试,稳定可靠。本书不仅适合C++的初学者,对有经验的C++程序员来说,每次阅读也总能有新的体会,这正是本书的魅力所在。也正因为如此,本书不仅适合作为高等院校计算机、信息技术及相关专业本科生、研究生的教材,也可供广大从事软件开发的研究人员和科技工作者参考。
  作为译者,我早已耳闻《C++编程思想》是一本别具特色的畅销书,并拜读了本书第1卷的中译本,其内容、讲授方法和特色让我受益匪浅。受机械工业出版社华章分社的委托,我有幸承担《C++编程思想》第2卷的翻译工作。翻译这样的成功之作,既是机遇,又是挑战。在翻译的过程中惟恐因水平有限而不能将原著中精彩内容如实转达,所以在翻译本书的过程中力求忠于原著,对书中出现的大量专业术语力求遵循标准译法,并在有可能引起歧义的地方注上英文原文。
  本书在翻译过程中受到南开大学信息学院计算机系刘教授的关心和支持,特此表示感谢。邢恩军、刘胜斐、罗仕波、郑莹莹、肖鹏、程玉鹏、黄硕、金士英、杨鹏飞、赵建树、田新、漆芳敏、费志泉、郜业军、申芳、杨志真、刁奕、高建国、旷昊、蓝炳伟、王叙、李平参加了本书部分章节的初译。由于水平有限,翻译不妥或错误之处在所难免,敬请广大读者批评指正。

刁成嘉
2005年9月
于南开园

图书目录

第一部分  建立稳定的系统
第1章  异常处理 2
1.1  传统的错误处理 2
1.2  抛出异常 4
1.3  捕获异常 5
1.3.1  try块 5
1.3.2  异常处理器 5
1.3.3  终止和恢复 6
1.4  异常匹配 7
1.4.1  捕获所有异常 8
1.4.2  重新抛出异常 8
1.4.3  不捕获异常 9
1.5  清理 10
1.5.1  资源管理 11
1.5.2  使所有事物都成为对象 12
1.5.3  auto_ptr 14
1.5.4  函数级的try块 15
1.6  标准异常 16
1.7  异常规格说明 18
1.7.1  更好的异常规格说明 21
1.7.2  异常规格说明和继承 21
1.7.3  什么时候不使用异常规格说明 22
1.8  异常安全 22
1.9  在编程中使用异常 25
1.9.1  什么时候避免异常 25
1.9.2  异常的典型应用 26
1.10  使用异常造成的开销 28
1.11  小结 30
1.12  练习 30
第2章  防御性编程 32
2.1  断言 34
2.2  一个简单的单元测试框架 36
2.2.1  自动测试 37
2.2.2  TestSuite框架 39
2.2.3  测试套件 42
2.2.4  测试框架的源代码 43
2.3  调试技术 47
2.3.1  用于代码跟踪的宏 48
2.3.2  跟踪文件 48
2.3.3  发现内存泄漏 49
2.4  小结 53
2.5  练习 54
第二部分  标准C++库
第3章  深入理解字符串 58
3.1  字符串的内部是什么 58
3.2  创建并初始化C++字符串 59
3.3  对字符串进行操作 62
3.3.1  追加、插入和连接字符串 62
3.3.2  替换字符串中的字符 63
3.3.3  使用非成员重载运算符连接 66
3.4  字符串的查找 67
3.4.1  反向查找 70
3.4.2  查找一组字符第1次或最后一次出现的位置 71
3.4.3  从字符串中删除字符 73
3.4.4  字符串的比较 74
3.4.5  字符串和字符的特性 77
3.5  字符串的应用 81
3.6  小结 85
3.7  练习 85
第4章  输入输出流 88
4.1  为什么引入输入输出流 88
4.2  救助输入输出流 91
4.2.1  插入符和提取符 91
4.2.2  通常用法 94
4.2.3  按行输入 95
4.3  处理流错误 96
4.4  文件输入输出流 98
4.4.1  一个文件处理的例子 98
4.4.2  打开模式 100
4.5  输入输出流缓冲 100
4.6  在输入输出流中定位 102
4.7  字符串输入输出流 104
4.7.1  输入字符串流 105
4.7.2  输出字符串流 106
4.8  输出流的格式化 109
4.8.1  格式化标志 109
4.8.2  格式化域 110
4.8.3  宽度、填充和精度设置 111
4.8.4  一个完整的例子 111
4.9  操纵算子 114
4.9.1  带参数的操纵算子 114
4.9.2  创建操纵算子 116
4.9.3  效用算子 117
4.10  输入输出流程序举例 119
4.10.1  维护类库的源代码 119
4.10.2  检测编译器错误 122
4.10.3  一个简单的数据记录器 124
4.11  国际化 127
4.11.1  宽字符流 128
4.11.2  区域性字符流 129
4.12  小结 131
4.13  练习 131
第5章  深入理解模板 134
5.1  模板参数 134
5.1.1  无类型模板参数 134
5.1.2  默认模板参数 136
5.1.3  模板类型的模板参数 137
5.1.4  typename关键字 141
5.1.5  以template关键字作为提示 142
5.1.6  成员模板 143
5.2  有关函数模板的几个问题 145
5.2.1  函数模板参数的类型推断 145
5.2.2  函数模板重载 148
5.2.3  以一个已生成的函数模板地址作为参数 149
5.2.4  将函数应用到STL序列容器中 152
5.2.5  函数模板的半有序 154
5.3  模板特化 155
5.3.1  显式特化 155
5.3.2  半特化 156
5.3.3  一个实例 158
5.3.4  防止模板代码膨胀 160
5.4  名称查找问题 163
5.4.1  模板中的名称 163
5.4.2  模板和友元 167
5.5  模板编程中的习语 171
5.5.1  特征 171
5.5.2  策略 175
5.5.3  奇特的递归模板模式 177
5.6  模板元编程 178
5.6.1  编译时编程 179
5.6.2  表达式模板 185
5.7  模板编译模型 190
5.7.1  包含模型 190
5.7.2  显式实例化 191
5.7.3  分离模型 192
5.8  小结 193
5.9  练习 194
第6章  通用算法 196
6.1  概述 196
6.1.1  判定函数 198
6.1.2  流迭代器 200
6.1.3  算法复杂性 201
6.2  函数对象 202
6.2.1  函数对象的分类 203
6.2.2  自动创建函数对象 203
6.2.3  可调整的函数对象 206
6.2.4  更多的函数对象例子 207
6.2.5  函数指针适配器 212
6.2.6  编写自己的函数对象适配器 216
6.3  STL算法目录 219
6.3.1  实例创建的支持工具 220
6.3.2  填充和生成 223
6.3.3  计数 224
6.3.4  操作序列 225
6.3.5  查找和替换 228
6.3.6  比较范围 233
6.3.7  删除元素 235
6.3.8  对已排序的序列进行排序和运算 238
6.3.9  堆运算 245
6.3.10  对某一范围内的所有元素进行运算 245
6.3.11  数值算法 251
6.3.12  通用实用程序 253
6.4  创建自己的STL风格算法 254
6.5  小结 255
6.6  练习 256
第7章  通用容器 260
7.1  容器和迭代器 260
7.2  概述 261
7.2.1  字符串容器 265
7.2.2  从STL容器继承 266
7.3  更多迭代器 268
7.3.1  可逆容器中的迭代器 269
7.3.2  迭代器的种类 270
7.3.3  预定义迭代器 271
7.4  基本序列容器:vector、list和deque 275
7.4.1  基本序列容器的操作 275
7.4.2  向量 277
7.4.3  双端队列 282
7.4.4  序列容器间的转换 284
7.4.5  被检查的随机访问 285
7.4.6  链表 286
7.4.7  交换序列 290
7.5  集合 291
7.6  堆栈 297
7.7  队列 299
7.8  优先队列 302
7.9  持有二进制位 309
7.9.1  bitset<n> 310
7.9.2  vector<bool> 312
7.10  关联式容器 314
7.10.1  用于关联式容器的发生器和填充器 317
7.10.2  不可思议的映像 319
7.10.3  多重映像和重复的关键字 320
7.10.4  多重集合 322
7.11  将STL容器联合使用 325
7.12  清除容器的指针 327
7.13  创建自己的容器 328
7.14  对STL的扩充 330
7.15  非STL容器 331
7.16  小结 335
7.17  练习 335
第三部分  专   题
第8章  运行时类型识别 340
8.1  运行时类型转换 340
8.2  typeid 操作符 344
8.2.1  类型转换到中间层次类型 345
8.2.2  void型指针 346
8.2.3  运用带模板的RTTI 347
8.3  多重继承 348
8.4  合理使用RTTI 348
8.5  RTTI的机制和开销 352
8.6  小结 352
8.7  练习 353
第9章  多重继承 355
9.1  概论 355
9.2  接口继承 356
9.3  实现继承 358
9.4  重复子对象 362
9.5  虚基类 365
9.6  名字查找问题 372
9.7  避免使用多重继承 374
9.8  扩充一个接口 375
9.9  小结 378
9.10 练习 378
第10章  设计模式 380
10.1  模式的概念 380
10.2  模式分类 381
10.3  简化习语 382
10.3.1  信使 382
10.3.2  收集参数 383
10.4  单件 384
10.5  命令:选择操作 388
10.6  消除对象耦合 391
10.6.1  代理模式:作为其他对象的前端 392
10.6.2  状态模式:改变对象的行为 393
10.7  适配器模式 395
10.8  模板方法模式 396
10.9  策略模式:运行时选择算法 397
10.10  职责链模式:尝试采用一系列策略模式 398
10.11  工厂模式:封装对象的创建 400
10.11.1  多态工厂 402
10.11.2  抽象工厂 404
10.11.3  虚构造函数 406
10.12  构建器模式:创建复杂对象 410
10.13  观察者模式 415
10.13.1  “内部类”方法 417
10.13.2  观察者模式举例 419
10.14  多重派遣 422
10.15  小结 428
10.16  练习 428
第11章  并发 430
11.1  动机 430
11.2  C++中的并发 431
11.3  定义任务 433
11.4  使用线程 434
11.4.1  创建有响应的用户界面 435
11.4.2  使用执行器简化工作 437
11.4.3  让步 439
11.4.4  休眠 440
11.4.5  优先权 441
11.5  共享有限资源 442
11.5.1  保证对象的存在 442
11.5.2  不恰当地访问资源 445
11.5.3  访问控制 447
11.5.4  使用保护简化编码 448
11.5.5  线程本地存储 451
11.6  终止任务 452
11.6.1  防止输入/输出流冲突 452
11.6.2  举例观赏植物园 453
11.6.3  阻塞时终止 456
11.6.4  中断 457
11.7  线程间协作 461
11.7.1  等待和信号 461
11.7.2  生产者-消费者关系 464
11.7.3  用队列解决线程处理的问题 467
11.7.4  广播 471
11.8  死锁 476
11.9  小结 480
11.10  练习 481
附   录
附录A  推荐读物 484
附录B  其他 488
索引 493

教学资源推荐
作者: [加拿大] 马丁·P.罗毕拉德(Martin P. Robillard) 著
作者: 谢满德 邵俊 编著
作者: (美)Richard C.Detmer
作者: 孙浩 主编 刘亮 副主编 王宁 张莉萍 参编
参考读物推荐
作者: (爱尔兰)Matt Smith (巴西)Chico Queiroz 著
作者: (美)Robert W.Bill
作者: Pete Becker