点 评  内容简介  编辑感言  引言  目录

 

C++编程思想 第2卷:实用编程技术(中文版)(到货)
Thinking in C++,Volume 2: Practical Programming
出版社:机械工业出版社

作者: Bruce Eckel, Chuck Allison

译者: 刁成嘉 等  

价格: 59.00
ISBN: 7-111-17115-2

开本: 16开

页数: 532

点 评

  “恭喜两位完成了这部经典之作!这部精品既妙趣横生,又不乏深度……所用专业知识的精确和语言应用的缜密真是让我大为震撼……我相信你们已经达到了大师级水平,简直太出色了!”

—《 C/C++ Users Journal》杂志专栏主编 Bjorn Karlsson

“此书是一项巨大的成就,你的书架上早就该有这本书了。”

—《 Doctor Dobbs Journal》杂志特约编辑 Al Stevens

“ Eckel的作品是惟一一本如此清晰地阐述如何重新思考以面向对象方法构造程序的书籍。这本书也是一本讲授C++来龙去脉的优秀指南。”

—《 Unix Review》杂志的编辑 Andrew Binstock

“ Bruce 在C++方面的洞察力一次次令我惊叹,而这本《C++编程思想》则是他思想的精萃。如果你想获得C++中难题的清晰解答,就请购买这部杰作吧。”

—《 The Tao of Objects》一书的作者 Gary Entsminger

“《 C++编程思想》不仅系统而详细地探讨了何时和如何使用内联、引用、运算符重载、继承和动态对象等方面的重要问题,而且还讨论了一些深入的技术,如怎样正确使用模板、异常及多重继承等。Eckel本人的面向对象和程序设计的思想也完全融入这部著作中。《C++编程思想》是每个C++开发人员案头必备之书,即每一位用C++开发重要软件的开发人员必须拥有的一本书。”

—《 PC Magazine》杂志特约编辑 Richard Hale Shaw

 

内容简介

   本书介绍 C++ 实用的编程技术和最佳的实践方法,深入探究了异常处理方法和异常安全设计;介绍 C++ 的字符串、输入输出流、 STL 算法、容器和模板的现代用法,包括模板元编程;解释多重继承问题的难点,展示 RTTI 的实际使用,描述了典型的设计模式及其实现,特别介绍被认为是标准 C++ 下一版特征之一的多线程处理编程技术,并提供了最新的研究成果。本书适合作为高等院校计算机及相关专业的本科生、研究生的教材,也可供从事软件开发的研究人员和科技工作者参考。

 


编辑感言

追求并勇敢着
——《 C++编程思想 第2卷 实用编程技术》编辑感言

  承载着原版的荣誉与广大读者的希望与期待,《 C++编程思想 第2卷 实用编程技术》的中文版终于纯朴而谦逊地走来。歌德说:“读一本好书,就像和许多高尚的人谈话。”在阅读本书的过程中,读者也会感受到如同与Bruce Eckel和Chuck Allison二位作者进行平等的对话,而这也正是本书的魅力所在。二位作者用他们的坦诚,以一个全新的视角,用平实而睿智的笔触给读者全面解析C++的实用编程技术。

  作为本书的责任编辑,我深感原版文笔的精确与简洁,在“过”与“不及”之间,正是这种朴素的简洁才体现着智慧,而译者南开大学的刁成嘉教授的译文也可以让我感受到“简洁”二字。在本书的出版前期,刁教授非常配合我们的工作,仅我的邮箱就保留着和刁教授沟通的近 40封电子邮件。为了争取一个连续的斟酌校样的时间,刁教授好几个礼拜早上4点起来工作。这种敬业精神是值得每一个研读《C++编程思想 第2卷 实用编程技术》的读者和我们编辑学习的。很欣赏伽利略的一句“追求科学需要特殊的勇敢”。Bruce Eckel、Chuck Allison对C++的追求何尝不是一种勇敢?刁教授对于原版“如切如磋,如琢如磨”的译文的追求又何尝不是一种勇敢?

  《 C++ 编程思想 》全书整体上保持一种进阶的风格,分为两卷: 第 1 卷:标准 C++ 导引; 本书是其第 2卷。第2卷之所以独立出来,想必作者希望读者在研读的过程中,明确“实用编程技术”这一目标,并从研发的角度把第2卷的内容分为3部分:第一部分“建立稳定的系统”介绍异常处理方法,防御性编程思想;第二部分全面解析“标准C++库”;第三部分“专题”涉及多重继承,运行时类型识别(RunTime Type Identification,RTTI),典型的设计模式,被誉为标准C++下一版特征之一的多线程处理编程技术等。

  不可否认本书第二部分介绍的模板这个话题是本书的特色之一,也是 C++的生命力之体现。从哲学主观辩证法(即思维的辩证法)角度考虑,面向对象思想和模板技术在C++中可以认为是辩证统一的。面向对象是模板技术的基础和前提,是出发点也是归宿,为模板技术提供一般原则。面向对象是建立在认识方法学上的技术思想,旨在让对象的设计者和使用者彼此信息隐藏,其核心是数据抽象。模板通过为编译器提供一种在类和函数体中代换类型名的方法,允许程序员重用源代码,它是一种通用的程序设计工具。举模板的现代应用“模板元编程”为例,“模板元编程”可以看作把C++的编译器当作类似Java解释器来用 ,提高了运行时效率。 从定义上看这体现的正是面向对象思想的三大特征之一“多态”中的编译时多态性,即静态多态性。

  模板技术是面向对象思想的补充。它的出现甚至不再鼓励使用基于对象的容器类层次结构。毕竟多重继承的基于对象的层次结构实践起来还有一定难度。 Bjarne Stroustrup(C++ 语言的实现者 ) 在访谈中也曾说过: “ 我更多的时候鼓励人们考虑并使用泛型编程,而不是面向对象编程。我确信我们将会看到越来越多的泛型编程应用。泛型编程目前仍然没有被足够的理解和充分的使用。 ”可以说没有面向对象就没有模板,模板也离不开面向对象。两者互相依赖、互为补充、互相促进,最终统一于 开发具有健壮性、通用性和高性能的类库、算法和程序。

  作者的智慧和译者的劳动已经为读者在通往 C++实用编程技术的湍急河流上架起桥梁,而能否到达通晓C++编程精髓的彼岸还是要取决于读者的实践。毕竟,“纸上得来终觉浅,绝知此事要躬行”。希望在表达思想的过程中不为驾驭语言所累的读者,《C++编程思想 第2卷 实用编程技术》正是您不错的选择。《C++编程思想 第1卷 标准C++导引》得到了各界人士对其权威性及实用性的赞誉。也许在赞誉的长河里,只有坚实而沉稳的东西才可以沉淀下来。那么就让这本值得期待的《C++编程思想 第2卷 实用编程技术》的中文版,用朴素而简洁的语言,展现凝聚着作者和译者勇敢的C++不懈追求之路。

  诚然,我的工作还存在很多不足,欢迎广大读者批评指正,并提出宝贵意见建议。 您的建议与支持,也是我不断努力的原动力。我的联系方式: sui_xi@yahoo.com.cn 。

机械工业出版社
编辑 隋曦  

 


前 言

  通过对本套教材第 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 。
 


目录

 

出版者的话
专家指导委员会
译者序
前言
第一部分 建立稳定的系统
第 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
 
 
Copyright ©1998~2004 华储网. All rights reserved。
To comment on this site,E-mail :
webmaster@huachu.com.cn