本书主要内容:
● 不同的编程方法和高质量的编程风格
● 充分利用C++完成大型软件开发的各种方法
● 确保无错代码的方法
● 认识面向对象设计
● 使用库和模式来提高编程效率、提高编程质量的若干方法
● C++中管理内存的最佳方法
● 输入/输出技术
无
多年以来,在编写速度快、功能强的企业级面向对象程序时,C++已经成为事实上的标准语言。令人惊讶的是,尽管C++变得如此普及,我们却很难全面地掌握这种语言。一些专业C++程序员会使用一些简单但功能很强大的技术,但以往传统的资料中对此都未曾提及;另外,C++中还有一些有用的部分,这些内容即使是对经验丰富的C++程序员来说可能也很神秘。
通常,编程方面的书更多地强调语言的语法,而不注重讲述如何实际使用这种语言来编程。一般的C++书都会分章介绍C++语言的各个主要部分,来解释相关的语法,并提供一个例子。本书不打算落入这种“俗套”。一般的图书只介绍这种语言方方面面的具体细节,而不关注实践内容,本书则不同,我们的目的很明确,就是要教你如何在实际工作中使用C++。你会从书中了解到一些鲜为人知的特性,这些特性能使你的开发更为轻松;另外这里还提供了一些可重用的编码模式,专业的程序员就是因为掌握了这些模式而从初学者中脱颖而出。
本书读者对象
即使你用C++已经很多年了,对这种语言的一些更为高级的特性可能还是不太熟悉,或者并没有充分利用到C++的全部功能。也许你编写的C++代码确实也能完成任务,但是你还想更多地了解如何完成C++设计,以及怎样才是好的编程风格。也许你是刚刚接触C++的初学者,想有一个好的起点,希望了解怎样才能“正确地”编写程序。本书将使你的C++水平更上一个台阶,达到专业水准。
因为这本书的目的是让你进阶,从对C++只有基本或初步的了解,转变成一名专业的C++程序员,因此我们假设你对这种语言已经有一定的认识了。第1章相当于一个复习,其中介绍了C++的基本知识,不过仅凭这一章,并不能取代踏踏实实的培训和具体地使用这种语言。即使你刚开始学习C++,但C编程的经验很丰富,阅读第1章应该也够了,你需要的大多数知识都能从中找到。无论如何,你都应当有牢固的编程基础,除了应该对循环、函数和变量等内容了如指掌外,还应该知道如何组织程序的结构,对诸如递归等基本技术应该也不陌生。另外,你应当对散列表和队列等常用的数据结构有一定了解,还应该知道排序和查找等有用的算法。当然,你可以不了解面向对象编程,这部分内容将在第3章介绍。
你可以采用任何编译器来开发代码,但必须熟悉所用的编译器。本书不会提供各种编译器的具体用法说明,你可以参考编译器随附的文档来回顾有关的内容。
本书内容
本书提供了一种C++编程方法,这种方法不仅可以改进你的代码质量,还可以提高编程效率。本书不单单讲述C++的语法和语言特性,它还强调了一些编程方法、可重用的设计模式以及好的编程风格。其中,编程方法涵盖了整个软件开发过程,从开始设计和编写代码,到测试、调试和分组工作都有涉及。学完本书,你将掌握C++语言和它的诸多特性,并能充分利用C++的强大功能来完成大规模软件开发。
假设有人已经学过C++的所有语法,但没有见过任何一个简单实例,这就很危险了!没有做过或看过具体的例子,他可能会认为所有代码都应当放在程序的main()函数中,或者认为所有变量都应当是全局变量,而通常这些做法都是不好的编程实践。
专业的C++程序员除了了解C++的语法之外,还知道如何正确地使用这种语言。他们认识到好的设计极其重要,并了解面向对象编程理论,知道有哪些最佳的方法来使用现有的库。这些专业的程序员已经开发了大量有用的代码,并提出了许多可重用的思想。
通过阅读本书,你将成为一个专业的C++程序员。你对C++的了解将更为深入,会掌握一些鲜为人知而且通常被误解的语言特性。除此以外,你将学习面向对象程序设计的内容,并获得一些高超的调试技巧。最重要的是,读过这本书后,你的脑海中会留下许多可重用思想,这些思想能够用于实际日常工作当中。
为什么费心尽力地想要成为一个专业的C++程序员,而不是一个只了解C++皮毛的程序员,原因有很多。如果能通晓C++语言的实际工作原理,将大大改善你的代码质量。通过了解不同的编程方法和过程,将有助于你更好地与你的开发小组协作;若能发现可重用的库和常用的设计模式,将有助于提高你的日常工作效率,并避免重蹈覆辙。所有这些,都将使你成为一个更好的程序员和一个更有价值的员工。不过,就算本书没有带给你升迁之喜,多了解一些总不是坏事吧!
本书的组织结构
本书包括6大部分。
第一部分,“专业C++程序设计概述”,先提供C++基础知识的快速入门课程,为你奠定一定的C++基础。在入门课程之后,将分析C++设计方法。你会了解到设计的重要性、面向对象方法、库和模式的使用、代码重用的重要性,以及当前为众多编程机构所用的工程实践方法。
第二部分,“编写C++代码方式”,这一部分从专业角度为读者提供了一次C++技术之旅。从中可了解到如何编写可读的C++代码,如何创建可重用的类,以及如何充分利用诸如继承和模板等重要的语言特性。
第三部分,“掌握C++高级特性”,在此介绍了如何更充分地利用C++。本书这一部分展示了C++的诸多神秘之处,并介绍了如何使用这样一些更高级的特性。在这一部分中你将看到C++语言中一些不常用甚至有些古怪的部分,并了解C++中管理内存有哪些好方法,此外还将学习输入输出技术、专业级错误处理、高级的操作符重载、如何编写高效的C++代码,以及如何编写跨语言和跨平台的代码。
第四部分,“确保无错代码”,这一部分的重点是如何编写企业质量的(enterprisequality)软件。你将了解一些软件测试概念,如单元测试和回归测试,还将学习调试C++程序时会用到的一些技术。
第五部分,“使用库和模式”,这一部分介绍了库和模式的使用,基于库和模式的编程,不仅可以使你更省力,还可帮助你编写出更好的代码。你将了解C++提供的标准库,包括诸如扩展标准库的一些高级主题。你还将学习分布式对象、可重用C++设计技术和概念上的面向对象设计模式的有关内容。
本书最后一部分对各章提供了一个实用指南,以方便查阅有关的C++技术。在本书相关网站上(www.wrox.com),还能找到C++标准库的一个实用参考指南。
使用本书的前提
要使用这本书,只要有一个安装了C++编译器的计算机就足够了。不同的编译器在对C++语言的解释上往往存在差别,不过本书只关注C++中已经标准化的部分。本书中的所有程序已经在Windows、Solaris和Linux等平台上成功地通过了测试。
本书约定
为了帮助你更充分地利用这本书,并了解会出现什么情况,我们将采用如下约定:
诸如此类的方框提供了一些不容忘记的重要信息,这些信息与方框前后的文字有很直接的关系。
对当前讨论的主题可能有一些提示、技巧和旁注,这些都将如此缩进并用楷体显示。
正文中还包括以下样式:
●在初次介绍一些重要的词时,我们会用楷体突出强调。
●按键采用如下形式表示:Ctrl+A。
●文件名、URL和正文中出现的代码表示为:monkey.cpp。
●代码的表示分为两种:
代码示例中,新出现的代码或重要代码用灰色背景突出强调。
对当前讨论不太重要的代码,或者是前面已经出现过的代码不用灰色背景强调。
源代码
在使用本书中的例子时,你可以手工输入所有代码,也可以直接使用本书随附的源代码文件。本书中用到的所有源代码文件都可以从wwwwroxcom下载。访问该网站时,只要找到本书的书名(可以使用搜索(Search)框,也可以使用某个书目列表),并点击该书详细信息网页上的下载代码(Download Code)链接,就可以得到本书的所有源代码。
由于会有许多书名雷同,最快捷的方法是利用ISBN搜索,本书的ISBN是0764574841。
下载了代码之后,只需用你最习惯的压缩工具解压即可。另外也可以前往Wrox主站的代码下载网页(wwwwroxcom/dynamic/books/downloadaspx),在此可以找到这本书以及所有其他Wrox书的可用代码。
勘误
尽管我们竭尽所能力争文字和代码不出错,但人无完人,错误在所难免。如果你在书中发现了错误(如拼写错误或者某段代码有误),希望你能及时反馈给我们,对此我们表示深深的谢意。你所提供的勘误可能会帮助另一个读者节省大量时间,否则他可能会因为同一处错误迷惑不解,而徒劳地花费数小时想去搞清楚;与此同时,你的勘误还将有助于我们提供更高质量的书。
要找到本书的勘误页面,请访问wwwwroxcom,并使用搜索(Search)框或者某个书目列表找到这本书的书名。然后,在本书的详细信息页面上,单击本书勘误(Book Errata)链接。在这个页面上,你将看到针对这本书提交并由Wrox编辑确认发布的所有勘误。在wwwwroxcom/miscpages/booklistshtml上还可以得到一个完整的书目列表,其中也提供了每本书的勘误。
如果你在本书勘误(Book Errata)页面上没有找到你发现的错误,请访问wwwwroxcom/contact/techsupportshtml,填写表单,把找到的错误发送给我们。我们将检查你提供的信息,如果错误属实,我们会在本书勘误页面上发布这条信息,并在本书的后续版本中修正这个问题。
p2pwroxcom
要与作者或其他人讨论有关C++技术问题,请加入P2P论坛(p2pwroxcom)。这个论坛是一个基于Web的系统,你可以在此发表有关Wrox图书和相关技术的消息,并与其他读者和技术用户交流。论坛提供了一个订购功能,针对你感兴趣的主题,如果论坛上新发布了相关的消息,会通过电子邮件通知你。Wrox作者、编辑、其他行业专家以及其他读者也会访问这些论坛。
在 http:∥p2pwroxcom上,你会看到许多论坛,这些论坛不仅可以帮助你阅读本书,还有助于你开发自己的应用软件。要想加入论坛,只需遵循以下几个步骤:
1 访问p2pwroxcom,并单击“注册”(Register)链接。
2阅读使用条文,并单击“同意”(Agree)。
3填写加入论坛的必要信息,如果想提供其他可选信息,也可以相应填写,单击“提交”(Submit)。
4你将收到一个电子邮件,其中将说明如何验证你的账户,并完成加入过程。
如果你只是阅读论坛中的消息,无须加入P2P,不过,如果你想发布自己的消息,就必须加入论坛。
一旦加入,你就可以发布新的消息了,还可以对其他用户发布的消息做出响应。任何时刻你都可以在Web上阅读消息。如果你希望某个论坛能通过电子邮件向你发送新发布的消息,请点击论坛列表中该论坛名旁边的“订购此论坛”(Subscribe to this Forum)图标。
要了解如何使用Wrox P2P的更多信息,请阅读P2P FAQs,在此对这个论坛软件工作的问题做了解释,另外还回答了与P2P和Wrox书有关的许多常用问题。读者若要阅读FAQs,单击任何P2P页面上的FAQ链接都可以。
致谢
本书能成功问世,离不开许多人的帮助,为此我们也欠下了很多人情。这里要感谢Waterside Productions的David Fugate对我们的谆谆教导,还要感谢Wiley的Robert Elliot,是他让一文不名的我们有机会写出这本书,以一种全新的方式讲述C++。如果没有策划编辑Adaobi Obi Tulton的大力协助,这本书的出版可能不会像现在这么好。另外要感谢Kathryn Malm Bourgoine在编辑方面提供的帮助。封面上的照片巧妙地对我们有所美化,感谢Adam Tow拍摄的这张照片。
还要感谢我们的所有同事和老师,是诸位多年以来一直在鼓励我们以正确的方法编写代码。特别地,我们要感谢Mike Hanson、Maggie Johnson、Adam Nash、Nick Parlante、Bob Plummer、Eric Roberts、Mehran Sahami、Bill Walker、Dan Walkowski、Patrick Young和Julie Zelenski。还要向Jerry Cain致以诚挚的谢意,是他最早教我们学C++,不仅如此,他还担任了本书的技术编辑,一丝不苟地分析了本书中的代码,认真的程度就好像在批阅我们的期末试卷一样。
另外要感谢: Rob Baesman、Aaron Bradley、Elaine Cheung、Marni Kleper、Toli Kuznets、Akshay Rangnekar、Eltefaat Shokri、Aletha Solter、Ken Solter和Sonja Solter,各位都审阅了书中的一章甚至多章。当然,如果书中还存在错误,这都要归咎于我们自己。在此还要向各位的家人表示感谢,谢谢大家的耐心和支持。
最后,我们还要感谢你,亲爱的读者,谢谢你打算采用我们提供的方法踏上专业C++开发的道路。
Nicholas A.Solter, Scott J.Kleper:Nicholas A.Solter: Nicholas A. Solter 现就职于Sun Microsystems公司,曾在斯坦福大学攻读计算机科学专业,获得理学学士和理学硕士学位。他具有丰富的C/C++编程经验和计算机游戏开发经历,并作为助理教授在Fullerton学院讲授过一年C++课程。
Scott J.Kleper: Reactivity公司的高级软件工程师。在初中就开始了他的编程生涯,用BASIC为Tandy TRS-80编写过一些冒险游戏。在斯坦福大学就读期间,他担任过程序设计入门和面向对象程序设计等多门课程的助教;并获得了计算机科学的理学学士和硕士学位。毕业后致力于人机交互领域,担任过多家公司开发小组的首席工程师。
刘鑫 杨健康 等:暂无简介
市场上的C++书籍可谓不少,但面向的读者大多是那些对C++已经很了解的人,还有一些C++书籍更像是参考手册,而不是真正的编程书,并没有真正教我们如何使用C++。如果读者还不精通C++,但是想利用它来解决实际问题,这本书就非常适合。它深入浅出地系统介绍了C++的各项高级主题,可以很好地帮助你成为C++专家,而且不要求你先前对C++有太多了解。
本书除了系统、全面的内容介绍外,还讲述了程序设计实践和软件工程,这也是它的另一个闪光点。并不是每个程序员都受过软件工程和软件开发方面的培训,这本书介绍了一些非常好的实践解决方案,告诉我们如何更好地实现重用、如何更快地调试等,这对我们的实际编程尤其有意义。尽早地掌握这些编程实践经验,将有助于编程新手养成良好的编程习惯,即使是具备相当编程经验的人也可以从本书了解到使用C++的更有效方法。
本书有以下特点:
●重视风格。如果不注意编程风格,尽管你完全了解C++,仍有可能写出极糟糕的C++程序,所以这本书中风格问题贯穿始终。
●突出重点。本书明确指出了哪些特性很难用、哪些方面很少用。由于C++是一个如此庞大的语言,所以读者要想真正掌握,必须切中要害,强调重点。
●强调实战。本书没有太多“玩具型”的小例子,而是提供尽可能多的实践示例,这些示例的代码都可以真正用在你的实际工作中。
●关注模式。利用可重用的模式可以编写出更好的代码。本书特别强调了C++程序中反复出现的一些好技术,尤其着很多笔墨来介绍一些可以重用的设计模式。
尽管本书篇幅不短,但是读者读起来一点儿都不会吃力。另外,书中最后还附了一个面试宝典,这是一般的编程书所没有的,这也充分体现出这本书的实用价值。
译者认为,无论本书是作为正式教材还是自学用书,都非常适合。如果你想改进代码质量,提高编程效率,成为一个专业的C++程序员,就千万不要错过这本书。
我们衷心地感谢我们的家人和朋友。在翻译过程中,他们给予了我们莫大的关心、支持和帮助。
全书由刘鑫、杨健康、王林绪、孙健、阎慧、熊伟、朱涛江、王宇、谢剑薇、王树春、韦群、林华君、刘名臣、赵蓓、潘淼、刘立强、龚雪晶、王志淋、刘跃邦、蔡洪量、王三梅、何跃强、苏金国、丁小峰、孙春娟、阎文丽、林琪、周兴汉、张练达等进行翻译,其中,刘鑫、杨健康担任主要翻译,王林绪、孙健等进行全书术语的审核,刘名臣、赵蓓等提供技术问题支持,全体工作人员共同完成了本书的翻译工作,最后由刘鑫统稿。
由于时间仓促,且译者的水平有限,在翻译过程中难免会出现一些错误,请读者批评指正。
第一部分专业C++程序设计概述
第1章C++快速入门
11C++基础
111必不可少的“Hello,World”
112命名空间
113变量
114操作符
115类型
116条件语句
117循环
118数组
119函数
1110结束语
12C++进阶
121指针和动态内存
122C++中的字符串
123引用
124异常
125const的多重用途
13作为一种面向对象语言的C++
14你的第一个实用的C++程序
141一个员工记录系统
142Employee类
143Database类
144用户界面
145对程序的评价
15小结
第2章设计专业的C++程序
21什么是编程设计
22编程设计的重要性
23C++设计有什么不同之处
24C++设计的两个原则
241抽象
242重用
25设计一个象棋程序
251需求
252设计步骤
26小结
第3章基于对象的设计
31面向对象的世界观
311我是在以过程性思维思考吗
312面向对象思想
313身处对象世界中
314对象关系
315抽象
32小结
第4章基于库和模式的设计
41重用代码
411有关术语
412决定是否重用代码
413重用代码的策略
414捆绑第三方应用
415开源库
416C++标准库
42利用模式和技术完成设计
421设计技术
422设计模式
43小结
第5章重用设计
51重用方法论
52如何设计可重用的代码
521使用抽象
522适当地建立代码结构以优化重用
523设计可用的接口
524协调一般性和易用性
53小结
第6章充分利用软件工程方法
61为什么需要过程
62软件生命期模型
621分阶段模型和瀑布模型
622螺旋方法
623统一开发过程
63软件工程方法论
631极限编程(XP)
632软件triage
64建立自己的过程和方法论
641以开放的心态接纳新思想
642汇总新思想
643明确哪些可行,哪些不可行
644不要做叛逃者
65小结
第二部分编写C++代码方式
第7章好的编码风格
71为什么代码看上去要好
711提前考虑
712保持清晰
713好的代码风格包括哪些因素
72为代码加注释
721写注释的原因
722注释风格
723本书中的注释
73分解
731通过重构来分解
732根据设计来分解
733本书中的分解
74命名
741选择一个好名字
742命名约定
75合理地使用语言特性
751使用常量
752利用const变量
753使用引用而不是指针
754使用定制异常
76格式化
761有关大括号对齐的争论
762考虑空格和小括号
763空格和制表符
77风格方面的难题
78小结
第8章掌握类和对象
81电子表格示例
82编写类
821类定义
822定义方法
823使用对象
83对象生命期
831对象创建
832对象撤销
833对象赋值
834区别复制和赋值
84小结
第9章精通类和对象
91对象中的动态内存分配
911Spreadsheet类
912用析构函数释放内存
913处理复制和赋值
92不同类型的数据成员
921静态数据成员
922const数据成员
923引用数据成员
924const引用数据成员
93深入了解方法
931静态方法
932const方法
933方法重载
934默认参数
935内联方法
94嵌套类
95友元
96操作符重载
961实现加法
962重载算术操作符
963重载比较操作符
964利用操作符重载构建类型
97方法和成员指针
98构建抽象类
99小结
第10章探索继承技术
101使用继承构建类
1011扩展类
1012覆盖方法
102继承以实现重用
1021类WeatherPrediction
1022在子类中增加功能
1023在子类中进行功能替换
103考虑父类
1031父构造函数
1032父析构函数
1033引用父类的数据
1034向上类型强制转换和向下类型强制转换
104继承以实现多态
1041Spreadsheet的返回结果
1042设计多态电子表格单元格
1043电子表格单元格的基类
1044各个子类
1045充分利用多态
1046将来的考虑
105多重继承
1051从多个类继承
1052命名冲突与二义基类
106继承技术中有趣而隐蔽的问题
1061改变覆盖方法的特性
1062覆盖方法的特殊情况
1063复制构造函数与相等操作符
1064关键字virtual的真相
1065运行时类型工具
1066非公共继承
1067虚基类
107小结
第11章利用模板编写通用代码
111模板概述
112类模板
1121编写类模板
1122编译器如何处理模板
1123模板代码在文件之间的分布
1124模板参数
1125方法模板
1126模板类特殊化
1127从模板类派生子类
1128继承与特殊化的区别
113函数模板
1131函数模板特殊化
1132函数模板的重载
1133类模板的友元函数模板
114高级模板
1141关于模板参数的更多知识
1142模板类的部分特殊化
1143用重载模板函数部分特殊化
1144模板递归
115小结
第12章理解C++疑难问题
121引用
1211引用变量
1212引用数据成员
1213引用参数
1214引用返回类型
1215采用引用还是指针
122关键字疑点
1221关键字const
1222关键字static
1223非局部变量的初始化顺序
123类型与类型强制转换
1231typedef
1232类型强制转换
124解析作用域
125头文件
126C实用工具
1261变量长度参数列表
1262预处理宏
127小结
第三部分掌握C++高级特性
第13章有效的内存管理
131使用动态内存
1311如何描述内存
1312内存的分配与撤销
1313数组
1314使用指针
132数组与指针的对应
1321数组即指针
1322指针并非都是数组
133动态字符串
1331C风格的字符串
1332字符串直接量
1333C++的字符串类
134低级的内存操作
1341指针运算
1342自定义内存管理
1343垃圾回收
1344对象池
1345函数指针
135常见的内存陷阱
1351字符串空间分配不足
1352内存泄漏
1353二次删除与无效指针
1354访问越界指针
136小结
第14章揭开C++I/O的神秘面纱
141使用流
1411到底什么是流
1412流的源与目的
1413流输出
1414流输入
1415输入与输出对象
142字符串流
143文件流
1431使用seek()与tell()
1432链接流
144双向I/O
145国际化
1451宽字符
1452非西方字符集
1453本地化环境与方面
146小结
第15章处理错误
151错误和异常
1511到底什么是异常
1512C++中的异常为什么好
1513C++中的异常为什么不好
1514我们的建议
152异常机制
1521抛出和捕获异常
1522异常类型
1523抛出和捕获多个异常
1524未捕获的异常
1525抛出列表
153异常和多态
1531标准异常层次体系
1532按类层次捕获异常
1533编写自己的异常类
154栈展开和清除
1541捕获、清除和重新抛出
1542使用智能指针
155常见的错误处理问题
1551内存分配错误
1552构造函数中的错误
1553析构函数中的错误
156综合
157小结
第四部分确保无错代码
第16章重载C++操作符361
161操作符重载概述361
1611为什么要重载操作符
1612操作符重载的限制
1613操作符重载中的选择
1614不应重载的操作符
1615可重载操作符小结
162重载算术操作符
1621重载一元减和一元加
1622重载自增和自减
163重载位操作符和二元逻辑操作符
164重载插入和析取操作符
165重载下标操作符
1651利用operator[]提供只读访问
1652非整数数组索引
166重载函数调用操作符
167重载解除引用操作符
1671实现operator*
1672实现operator->
1673到底什么是operator->*
168编写转换操作符
1681转换操作符的二义性问题
1682布尔表达式的转换
169重载内存分配和撤销操作符
1691new和delete究竟如何工作
1692重载operator new和operator delete
1693重载带额外参数的operator new 和 operator delete
1610小结
第17章编写高效的C++程序
171性能和效率概述
1711实现高效的两种方法
1712两类程序
1713C++是一种低效语言吗
172语言级效率
1721高效地处理对象
1722不要过度使用高开销的语言特性
1723使用内联方法和函数
173设计级效率
1731尽可能缓存
1732使用对象池
1733使用线程池
174测评分析
175小结
第18章开发跨平台和跨语言的应用
181跨平台开发
1811体系结构问题
1812实现问题
1813特定于平台的特性
182跨语言开发
1821混合C和C++
1822转换模式
1823与C代码的链接
1824利用JNI混合Java和C++
1825C++与Perl和Shell脚本的混合
1826C++与汇编代码的混合
183小结
第19章熟练地测试
191质量控制
1911谁来负责测试
1912bug的生命期
1913bug跟踪工具
192单元测试
1921单元测试的方法
1922单元测试过程
1923实战单元测试
193高级测试
1931集成测试
1932系统测试
1933回归测试
194成功测试的提示
195小结
第20章征服调试
201调试基本法则
202bug分类
203避免bug
204找出bug的方法
2041错误日志
2042调试轨迹
2043断言
205调试技术
2051再生bug
2052调试可再生bug
2053调试不可再生bug
2054调试内存问题
2055调试多线程程序
2056调试示例:文章引用
2057从ArticleCitations示例学到的教训
206小结
第21章深入STL:容器和迭代器
211容器概述
2111元素需求
2112异常和错误检查
2113迭代器
212顺序容器
2121vector
2122vector<bool>特殊化
2123deque
2124list
213容器适配器
2131queue
2132priority_queue
2133stack
214关联容器
2141pair工具类
2142map
2143multimap
2144set
2145multiset
215其他容器
2151数组作为STL容器
2152string作为STL容器
2153流作为STL容器
2154bitset
216小结
第五部分使用库和模式
第22章掌握STL算法和函数对象
221算法概述
2211find()和find_if() 算法
2212accumulate() 算法
222函数对象
2221算术函数对象
2222比较函数对象
2223逻辑函数对象
2224函数对象适配器
2225编写自己的函数对象
223算法细节
2231工具算法
2232非修改算法
2233修改算法
2234排序算法
2235集合算法
224算法和函数对象示例:选民注册审计
2241选民注册审计问题描述
2242auditVoterRolls()函数
2243getDuplicates()函数
2244RemoveNames函数对象
2245NameInList函数对象
2246测试auditVoterRolls()函数
225小结
第23章定制和扩展STL
231分配器
232迭代器适配器
2321逆序迭代器
2322流迭代器
2323插入迭代器
233扩展STL
2331为什么要扩展STL
2332编写STL算法
2333编写一个STL容器
234小结
第24章探讨分布式对象
241分布式计算的魅力
2411分布以获得可扩展性
2412分布以获得可靠性
2413分布以获得集中性
2414分布式内容
2415分布式vs网络式
242分布式对象
2421串行化和编组
2422远程过程调用
243CORBA
2431接口定义语言
2432实现类
2433使用对象
244XML
2441XML快速入门
2442XML作为一种分布式对象技术
2443用C++生成和解析XML
2444XML验证
2445用XML构建分布式对象
2446SOAP(简单对象访问协议)
245小结
第25章结合技术和框架
251“我想不起来如何…”
2511……编写一个类
2512……派生一个现有类
2513……抛出和捕获异常
2514……读文件
2515……写文件
2516……编写模板类
252还有更好的办法
2521带引用计数的智能指针
2522双重分派
2523混合类
253面向对象框架
2531使用框架
2532模型视图控制器模式
254小结
第26章应用设计模式
261单例模式
2611举例:日志机制
2612单例的实现2613使用单例
262工厂模式
2621举例:汽车工厂模拟
2622实现工厂
2623使用工厂
2624工厂的其他使用
263代理模式
2631举例:隐藏网络连通性问题
2632实现代理
2633使用代理
264适配器模式
2641举例:适配一个XML库
2642适配器的实现
2643使用适配器
265装饰器模式
2651举例:定义网页中的样式
2652装饰器的实现
2653使用装饰器
266职责链模式
2661举例:事件处理
2662职责链的实现
2663使用职责链
267观察者模式
2671举例:事件处理
2672实现观察者
2673使用观察者
268小结
附录
附录AC++面试宝典
附录B参考书目