本书是久负盛名的C++经典教程,其内容是C++大师Stanley B. Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,已经帮助全球无数程序员学会了C++。本版对前一版进行了彻底的修订,内容经过了重新组织,更加入了C++先驱Barbara E.Moo在C++教学方面的真知灼见。既显著改善了可读性,又充分体现了C++语言的最新进展和当前的业界最佳实践。书中不但新增大量教学辅助内容,用于强调重要的知识点,提醒常见的错误,推荐优秀的编程实践,给出使用提示,还包含大量来自实战的示例和习题。\r\n 对C++基本概念和技术全面而且权威的阐述,对现代C++编程风格的强调,使本书成为C++初学者的最佳指南;对于中高级程序员,本书也是不可或缺的参考书。
第1章 快速入门 \r\n 1.1 编写简单的C++程序 \r\n 1.2 初窥输入/输出\r\n 1.3 关于注释 \r\n 1.4 控制结构 入 \r\n 1.5 类的简介 \r\n 1.6 C++程序 \r\n 小结 \r\n 术语 \r\n第一部分 基本语言\r\n 第2章 变量和基本类型 \r\n 2.1 基本内置类型 \r\n 2.2 字面值常量 \r\n 2.3 变量 \r\n 2.4 const限定符 \r\n 2.5 引用 \r\n 2.6 typedef名字 \r\n 2.7 枚举 \r\n 2.8 类类型 \r\n 2.9 编写自己的头文件\r\n 小结 \r\n 术语 \r\n 第3章 标准库类型 \r\n 3.1 命名空间的using声明 \r\n 3.2 标准库string类型\r\n 3.3 标准库vector类型\r\n 3.4 迭代器简介 \r\n 3.5 标准库bitset类型\r\n 小结 \r\n 术语 \r\n 第4章 数组和指针 \r\n 4.1 数组 \r\n 4.2 指针的引入 \r\n 4.3 C风格字符串\r\n 4.4 多维数组 \r\n 小结 \r\n 术语 \r\n 第5章 表达式 \r\n 5.1 算术操作符 \r\n 5.2 关系操作符和逻辑操作符 \r\n 5.3 位操作符\r\n 5.4 赋值操作符 \r\n 5.5 自增和自减操作符 \r\n 5.6 箭头操作符 \r\n 5.7 条件操作符 \r\n 5.8 sizeof操作符 \r\n 5.9 逗号操作符 \r\n 5.10 复合表达式的求值 \r\n 5.11 new和delete表达式 \r\n 5.12 类型转换 \r\n 小结 \r\n 术语 \r\n 第6章 语句 \r\n 6.1 简单语句 \r\n 6.2 声明语句 \r\n 6.3 复合语句(块) \r\n 6.4 语句作用域 \r\n 6.5 if语句 \r\n 6.6 switch语句 \r\n 6.7 while语句 \r\n 6.8 for循环语句\r\n 6.9 do while语句 \r\n 6.10 break语句 \r\n 6.11 continue语句 \r\n 6.12 goto语句 \r\n 6.13 try块和异常处理\r\n 6.14 使用预处理器进行调试 \r\n 小结 \r\n 术语 \r\n 第7章 函数 \r\n 7.1 函数的定义\r\n 7.2 参数传递\r\n 7.3 return语句\r\n 7.4 函数声明 \r\n 7.5 局部对象\r\n 7.6 内联函数 \r\n 7.7 类的成员函数 \r\n 7.8 重载函数 \r\n 7.9 指向函数的指针 \r\n 小结 \r\n 术语 \r\n 第8章 标准IO库 \r\n 8.1 面向对象的标准库 \r\n 8.2 条件状态 \r\n 8.3 输出缓冲区的管理 \r\n 8.4 文件的输入和输出 \r\n 8.5 字符串流 \r\n 小结 \r\n 术语 \r\n第二部分 容器和算法\r\n 第9章 顺序容器 \r\n 第10章 关联容器\r\n 第11章 泛型算法\r\n第三部分 类和数据抽象\r\n 第12章 类 \r\n 第13章 复制控制 \r\n 第14章 重载操作符与转换 \r\n第四部分 面向对象编程与泛型编程\r\n 第15章 面向对象编程 \r\n 第16章 模板与泛型编程\r\n第五部分 高级主题\r\n 第17章 用于大型程序的工具\r\n 第18章 特殊工具与技术 \r\n附录 标准库 \r\n索引
作为目前业界广泛使用的编程语言,C++可谓包罗万象、博大精深。20年来,讲述C++的图书早已经汗牛充栋、层出不穷,但其中业界公认的完整涵盖C++标准的权威著作只有两部,曾经有评论将之喻为“倚天屠龙”。其中一部当然是C++之父Bjarne Stroustrup所著的《C++程序设计语言》,内容精辟深刻,但是要求较高,只适合有一定经验的程序员提升功力之用。而另一部就是本书,自1989年初版以来,历经多次修订,始终保持了内容全面准确、循序渐进、明快易读的特色,早已奠定了无可替代的经典地位。原版到第3版就累积销售了45万册以上,第3版的中文版引入国内时,也产生了极大影响,甚至曾经出现过洛阳纸贵的局面。
本书的成功当然离不开强大的作者阵容。本书第一作者Stanley Lippman早在C++还处于萌芽时期就是Stroustrup所在的C++编译器项目团队的成员,目前又在微软领导Visual C++和CLI的开发,对C++可以说是了如指掌,实践经验极为丰富,加之多年来著书撰文不辍,在开发社区深孚众望,已成为公认的大师级人物。第二作者Josée Lajoie从第3版开始加入,她曾经在IBM从事C++编译器开发,并担任过ISO C++标准委员会核心语言工作组主席多年,她的加盟,充分保证了本书与C++标准的兼容。
应该说,在很大程度上本书的第3版已臻完美。但是拿到第4版样书之后,我们发现新版完全不是对前版的简单扩充,不仅在布局结构上进行了彻底更新和重新规划,对具体文字和实例也进行了大幅改动,两个版本甚至很难找到相同的段落。在并无新版本的C++标准定案发布的情况下,作者撰写新版而且做出这么大修订的原因何在?而新版又有何重要改进呢?
众所周知,C++从C语言继承而来的历史包袱,C++对多种编程风格的支持,以及各种误解和不良习惯,都大大增加了C++教学和使用的复杂性,而传统教材和教学方法的各种弊端更加剧了这一情况,使C++成为不少人望而生畏的难学难用的“专家语言”。
阅读本书后,我们不得不承认,几位大师级作者们很好地回应了上述挑战。这里我们应该特别提到本书新版增加的第三作者Barbara Moo。她作为项目经理,曾经领导了包括Stroustrup和Lippman在内的贝尔实验室C++编译器团队。她在斯坦福大学教授C++课程的丰富经验和教学改革成果,对本书新版产生了重大影响。
相比之下,本书第4版主要有如下特点:
反映了现代理念。新版紧扣C++语言当前的应用趋势——更加关注程序员的开发效率而不是系统的运行效率,摒弃了传统的阐述方式,不再注重低层编程技术,而是从一开始就强调标准库的使用,让人耳目一新。
突出了实践性。新版在继承了本书原有特色——全面、详细、准确地介绍C++知识点的基础上,特别注重介绍那些实际开发中通用的、行之有效的编程技术。在特定场合,C++提供的丰富“武器库”中应该选择哪些设施,应该注意哪些问题,业界已经总结了哪些优秀的编程实践和易犯的错误等,而这些正是目前其他C++图书所缺乏的。
增加了教学环节,改善了可读性。新版版式设计非常适合阅读,而且每一章都精心组织了重要术语、小结、大量示例和习题,文中另有丰富的额外提示和交叉引用,便于读者查找复习,消化核心概念,巩固所学知识。
我们在翻译过程中深深感到,本书新版在经典前版的基础上又有了质的飞跃,体现了世界C++教学方面的最新进展和最高水平。我们衷心希望本书中文版的出版,能够推动国内C++教学和使用的发展。
参加本书翻译工作的有李师贤、蒋爱军、梅晓勇、林瑛,全书由李师贤审校。参与部分校对或录入工作的还有古思山、黎永基、陈晓君、刘海伟等,在此对他们的工作表示衷心的感谢!
感谢人民邮电出版社图灵公司的编辑们,他们为保证本书的质量做了大量的工作。
由于书中概念和术语数目繁多,且有许多概念和术语目前尚无公认的中文译法,加之译者水平所限,译文中不当之处,恳请读者批评指正。
Stanley B.Lippman的职业是提供关于C++和面向对象的训练、咨询、设计和指导。他在成为一名独立咨询顾问之前,曾经是迪士尼动化公司的首席软件设计师。当他在AT&T Bell实验室的时候,领导了cfront 3.0版本和2.1版本的编译器开发组。他也是Bjarne Stroustrup领导的Bell实验室Foundation项目的成员之一,负责C++程序设计环境中的对象模型部分。他还撰写了许多关于C++的文章。目前他已受雇于微软公司,负责Visual C++项目。遍及全球,深受广大C++学者的喜欢。
前言
本书全面介绍了C++语言。作为入门书(Primer),它以教程的形式对C++语言进行清楚的讲解,并辅以丰富的示例和各种学习帮助手段。跟多数入门教程不同,本书还对C++语言本身进行了详尽的描述,并特别着重介绍了新的、行之有效的程序设计技巧。
无数的程序员使用过本书的前几个版本学习C++。C++也在此期间发展成熟,远非往日可比。这些年来,C++语言的发展方向以及C++程序员的关注点,已经从以往注重运行时效率,转向到千方百计地提高程序员的编程效率上。随着标准库的广泛使用,现在已经能够比以往更高效地学习和使用C++。本版充分体现了这样的可能性。
第4版的改动
为了体现现代C++编程风格,我们完全重新组织了书中的内容,重写了C++ Primer。书中不再强调低层编程技术,而把中心转向标准库的使用说明。书中很早就介绍了标准库的内容,示例也重新改写以利用标准库设施。有关语言主题的叙述做了一定的精简,先后次序也进行了重新编排。
除重新编排内容外,为了利于读者加强理解,我们还增加了几个新的模块。每章新增了“小结”和“术语定义”,概括本章要点。读者可以利用这些部分进行自我检查,如果发现还有不理解的概念,可以重新学习章中的相关部分。
书中还采用了下述几种学习帮助方法:
重要术语用黑体表示,我们认为读者已经熟悉的重要术语则用楷体表示。每个术语都会出现在章后“术语定义”部分。
书中用特殊版式标注的部分,是要给读者提醒语言的重要特性,警示常见的错误,标明良好的编程习惯,列出通常的使用技巧。希望这些标注可以帮助读者更快地消化重要概念,避免犯常见错误。
为了更容易追寻各种特性或概念间的关系,书中大量使用了前后交叉引用。
对于某些重要概念和C++新手最头疼的问题,我们进行了额外的讨论和解释。这部分也以特殊版式标出。
学习任何程序设计语言都需要编写程序。因此,本书从头到尾提供了大量的示例。所有示例的源代码可从下列网址获得:
http://www.awprofessional.com/cpp_primer
万变不离其宗,本书保持了前几版的特色,仍然是一部全面介绍C++的教程。我们的目标是提供一本清楚、全面、准确的指南性读物。我们通过讲解一系列示例来教授C++语言,示例除了解释语言特性外,也展示了如何最充分地利用这门语言。虽然读者不需要事先学过C(C++最初基于C发展起来),但我们假定读者具有用一种现代的块结构语言编程的经验。
本书结构
本书介绍了C++国际标准,既涵盖语言的性质,又包括作为标准一部分的大量的标准库。C++支持运用抽象进行编程,因而具有很大的威力。要学会用C++高效地编程,只是掌握句法和语义是远远不够的。我们的重点在于教会读者怎样利用C++的特性快速地写出安全的程序,而且程序的性能可与用C写成的低层程序相媲美。
C++是一种大型的编程语言,这可能会吓倒一些新手。现代C++可以看作由以下三部分组成:
低级语言,多半继承自C。
较高级语言特性,使用户可以定义自己的数据类型,组织大规模的程序和系统。
标准库,使用上述高级特性提供一整套有用的数据结构和算法。
多数C++教材按照下面的顺序展开:先讲低层细节,再介绍较高级的语言特性;只有在讲完整个语言后才开始解释标准库。结果往往使读者陷入低层编程问题和写复杂的类定义等细节的纠缠中,而不能真正领会抽象方法编程的力量。更不消说,读者始终不能学到足够的知识去建立自己的抽象。
本版中我们独辟蹊径。我们先从语言的基本知识和标准库着手,这样读者可以写出大的有实际意义的程序出来。只有打好坚实基础,使用好标准库,并写出用标准库所能够写出的那种抽象程序,我们才进入下一步,学习用C++的其他高级特性,来写出自己的抽象。
第一和第二部分讨论语言基本知识和标准库设施。其重点在于学会写C++程序,学会使用由标准库提供的抽象。绝大部分C++程序员需要了解本书这两部分的所有内容。
除了讲解基本知识以外,这两部分还有另外一个重要的意图。标准库设施本身是用C++写成的抽象数据类型,它使用的是任何C++程序员都可用的类构造特性。我们教授C++的经验说明,一开始就使用设计良好的抽象类型,读者会更容易理解如何建立自己的类型。
第三到第五部分着重讨论如何写出自己的类型。第三部分介绍C++的核心,即对类的支持。类机制是写出自己的抽象的基础。类也是第四部分讨论的面向对象编程和泛型编程的基础。全书结束于第五部分,我们在这一部分讨论了一些高级特性,它们在构建大型复杂系统时最为常用。
致谢
与前几版一样,我们要感谢Bjarne Stroustrup,他不知疲倦地从事着C++方面的工作,自始至终与我们有着深厚的友情。我们还要感谢Alex Stepanov,正是他最初敏锐的洞察力导致了容器和算法的概念,最终这些概念形成标准库的核心。此外,我们要感谢C++标准委员会的所有成员,他们多年来为C++澄清概念、细化标准和改进功能做出了艰苦的努力。
我们要衷心地感谢我们的审稿人,他们审阅了我们的多次手稿,帮助我们或多或少地改进了本书。他们是:Paul Abrahams, Michael Ball, Mary Dageforde, Paul DuBois, Matt Greenwood, Matthew P.Johnson, Andrew Koenig, Nevin Liber, Bill Locke, Robert Murray, Phil Romanik, Justin Shaw, Victor Shtern, Clovis Tondo, Daveed Vandevoorde, Steve Vinoski。
书中所有示例都已通过GNU和微软编译器的编译。感谢他们的开发者和所有开发其他C++编译器的人,他们使C++变成现实。
最后,感谢Addison-Wesley的工作人员,他们引领了这一版的整个出版过程:Debbie Lafferty ——我们最初的编辑,是他提出了出版本书新版,他从本书最早版本起就一直致力于本书;Peter Gordon——我们的新编辑,他坚持更新和精简本书内容,极大地改进了这一版本; Kim Boedigheimer——他保证了我们所有人能按进度工作;还有Tyrrell Albaugh、Jim Markham、Elizabeth Ryan和John Fuller,他们和我们一起经历了整个设计和制作过程。