\r\nC++ Primer的第三版结合了Stanley Lippman的实践经验和Josée Lajoie对于ANSI/ISO标准C++的深入理解。这本指导书的第三版已经被重新改写过,以便更加精确地讲述标准C++的特性和用法。在本书中,对于C++初学者特别有价值的是一些来自真实世界中的程序例子,它们说明了泛型程序(generic program)的设计、面向对象程序的设计、模板的用法,以及使用标准C++进行程序设计的方方面面。而且,本书也在适当的地方讲到了一些习惯用法以及效率指导。
\r\n
\r\n
\r\n
\r\n
\r\n
第一篇 C++概述
\r\n第1章 开始 3
\r\n1.1 问题的解决 3
\r\n1.2 C++程序 4
\r\n1.3 预处理器指示符 10
\r\n1.4 注释 14
\r\n1.5 输入/输出初步 16
\r\n第2章 C++浏览 20
\r\n2.1 内置数组数据类型 20
\r\n2.2 动态内存分配和指针 23
\r\n2.3 基于对象的设计 26
\r\n2.4 面向对象的设计 36
\r\n2.5 泛型设计 44
\r\n2.6 基于异常的设计 50
\r\n2.7 用其他名字来命名数组 54
\r\n2.8 标准数组--向量(vector) 59
\r\n第二篇 基本语言
\r\n第3章 C++数据类型 67
\r\n3.1 文字常量 67
\r\n3.2 变量 70
\r\n3.3 指针类型 78
\r\n3.4 字符串类型 83
\r\n3.5 const限定修饰符 91
\r\n3.6 引用类型 94
\r\n3.7 布尔类型 99
\r\n3.8 枚举类型 100
\r\n3.9 数组类型 102
\r\n3.10 vector容器类型 110
\r\n3.11 复数类型 113
\r\n3.12 Typedef名字 114
\r\n3.13 volatile 115
\r\n3.14 pair类型 116
\r\n3.15 类(class)类型 117
\r\n第4章 表达式 127
\r\n4.1 什么是表达式 127
\r\n4.2 算术操作符 129
\r\n4.3 等于、关于和逻辑操作符 131
\r\n4.4 赋值操作符 134
\r\n4.5 递增和递减操作符 138
\r\n4.6 复数操作 140
\r\n4.7 条件操作符 143
\r\n4.8 sizeof操作符 144
\r\n4.9 new和delete表达式 146
\r\n4.10 逗号操作符 148
\r\n4.11 位操作符 148
\r\n4.12 bitset操作 151
\r\n4.13 优先级 155
\r\n4.14 这表型转换 158
\r\n4.15 栈类实例 167
\r\n第5章 语句 171
\r\n5.1 简单语句和复合语句 171
\r\n5.2 声明语句 172
\r\n5.3 if语句 175
\r\n5.4 switch语句 183
\r\n5.5 for循环语句 190
\r\n5.6 while循环 194
\r\n5.7 do while 196
\r\n5.8 break语句 198
\r\n5.9 continue语句 199
\r\n5.10 goto语句 199
\r\n5.11 链表例子 201
\r\n第6章 抽象容器类型 226
\r\n6.1 我们的文本查询系统 227
\r\n6.2 vector还是list? 230
\r\n6.3 cector怎样自己增长 231
\r\n6.4 定义一个顺序容器 234
\r\n6.5 迭代器 238
\r\n6.6 顺序容器操作 242
\r\n6.7 存储文本行 246
\r\n6.8 找到一个子串 249
\r\n6.9 处理标点符号 255
\r\n6.10 注意其他格式的字符串 258
\r\n6.11 其他string操作 261
\r\n6.12 生成文本位置map 266
\r\n6.13 创建单词排除集 276
\r\n6.14 完整的程序 279
\r\n6.15 multimap和multiset 288
\r\n6.16 栈(stack) 291
\r\n6.17 队列(queue)和优先队列(priority_queue) 293
\r\n6.18 回顾iStack类 294
\r\n第三篇 基本过程的程序设计
\r\n第7章 函数 299
\r\n7.1 概述 299
\r\n7.2 函数原型 302
\r\n7.3 参数传递 305
\r\n7.4 返回一个值 322
\r\n7.5 递归 326
\r\n7.6 inline函数 328
\r\n7.7 链接指示符:extern'C'※ 329
\r\n7.8 main():处理命令行选项※ 332
\r\n7.9 指向函数的指针※ 342
\r\n第8章 域和生命期 353
\r\n8.1 域 353
\r\n8.2 全局对象和函数 358
\r\n8.3 局部对象 364
\r\n8.4 动态分配的对象 367
\r\n8.5 名字空间定义 ※ 379
\r\n8.6 使用名字空间成员 ※ 391
\r\n第9章 重载函数 400
\r\n9.1 重载函数声明 400
\r\n9.2 重载解析的三个步骤 411
\r\n9.3 参数类型转换 ※ 413
\r\n9.4 函数重载解析细节 426
\r\n第10章 函数模板 439
\r\n10.1 函数模板定义 439
\r\n10.2 函数模板实例化 446
\r\n10.3 模板实参推演 ※ 449
\r\n10.4 显式模板实参 ※ 453
\r\n10.5 模板编译模式 ※ 456
\r\n10.6 模板显式特化 ※ 460
\r\n10.7 重载函数模板 ※ 465
\r\n10.8 考虑模板函数实例的重载解析 ※ 467
\r\n10.9 模板定义中的名字解析 ※ 474
\r\n10.10 名字空间和函数模板 ※ 480
\r\n10.11 函数模板示例 484
\r\n第11章 异常处理 487
\r\n11.1 抛出异常 487
\r\n11.2 try块 490
\r\n11.3 捕获异常 494
\r\n11.4 异常规范 502
\r\n11.5 异常与设计事项 505
\r\n第12章 泛型算法 507
\r\n12.1 概述 507
\r\n12.2 使用泛型算述 510
\r\n12.3 函数对象 520
\r\n12.4 回顾iterator 528
\r\n12.5 泛型算法 535
\r\n12.6 何时不用泛型算法 538
\r\n第四篇 基于对象的程序设计
\r\n第13章 类 545
\r\n13.1 类定义 545
\r\n13.2 类对象 552
\r\n13.3 类成员函数 554
\r\n13.4 隐含的this指针 565
\r\n13.5 静态类成员 570
\r\n13.6 指向类成员的指针 576
\r\n13.7 联合(union):一个节省空间的类 585
\r\n13.8 位域(bit-field):一种节省空间的成员 590
\r\n13.9 类域 ※ 591
\r\n13.10 嵌套类 598
\r\n13.11 作为名字空间成员的类 ※ 607
\r\n13.12 局部类 ※ 610
\r\n第14章 类的初始化、赋值和析构 613
\r\n14.1 类的初始化 613
\r\n14.2 类的构造函数 615
\r\n14.3 类的析构函数 625
\r\n14.4 类对象数组和vector 631
\r\n14.5 成员初始化表 637
\r\n14.6 按成员初始化 ※ 643
\r\n14.7 按成员赋值 ※ 648
\r\n14.8 效率问题 651
\r\n第15章 重载操作符和用户定义的转换 657
\r\n15.1 操作符重载 657
\r\n15.2 友元(friend) 666
\r\n15.3 操作符 = 669
\r\n15.4 操作符 [] 671
\r\n15.5 操作符operator() 672
\r\n15.6 操作符 -> 674
\r\n15.7 操作符 ++和-- 676
\r\n15.8 操作符new和delete 680
\r\n15.9 用户定义的转换 688
\r\n15.10 选择一个转换 ※ 697
\r\n15.11 重载解析和成员函数 ※ 708
\r\n15.12 重载解析和操作符 ※ 713
\r\n第16章 类模板 722
\r\n16.1 类模板定义 722
\r\n16.2 类模板实例化 730
\r\n16.3 类模板的成员函数 739
\r\n16.4 类模板中的友元(friend)声明 742
\r\n16.5 类模板的静态数据成员 747
\r\n16.6 类模板的嵌套类型 749
\r\n16.7 成员模板 ※ 752
\r\n16.8 类模板和编译模式 ※ 756
\r\n16.9 类模板特化 ※ 762
\r\n16.10 类模板部分特化 ※ 765
\r\n16.11 类模板中的名字解析 ※ 767
\r\n16.12 名字空间和类模板 ※ 769
\r\n16.13 模板数组类 771
\r\n第四篇 面向对象的程序设计
\r\n第17章 类继承和子类型 781
\r\n17.1 定义一个类层次结构 784
\r\n17.2 确定层次的成员 790
\r\n17.3 基类成员访问 800
\r\n17.4 基类和派生类的构造 807
\r\n17.5 基类和派生类虚拟函数 816
\r\n17.6 按成员初始化和赋值 ※ 839
\r\n17.7 UserQuery管理类 844
\r\n17.8 把它组合在一起 852
\r\n第18章 多继承和虚拟继承 858
\r\n18.1 准备阶段 858
\r\n18.2 多继承 862
\r\n18.3 public、private和protected继承 868
\r\n18.4 继承下的类域 875
\r\n18.5 虚拟继承 ※ 883
\r\n18.6 多继承及虚拟继承实例 ※ 893
\r\n18.7 按成员赋值 ※ 648
\r\n18.8 效率问题 651
\r\n第19章 C++中继承的用法 906
\r\n19.1 运行时刻类型识别 906
\r\n19.2 异常和继承 916
\r\n19.3 重载解析过程和继承 ※ 932
\r\n第20章 iostream库 942
\r\n20.1 输出操作符<< 946
\r\n20.2 输入 951
\r\n20.3 其他输入/输出操作符 962
\r\n20.4 重载输出操作符<< 968
\r\n20.5 重载输入操作符>> 972
\r\n20.6 文件输入和输出 975
\r\n20.7 条件状态 984
\r\n20.8 string流(字符串流) 986
\r\n20.9 格式状态 989
\r\n20.10 一个强类型库 997
\r\n
\r\n附录 泛型算法(按字母序) 999
\r\n
Stanley Lippman 他的职业是提供关于C++和面向对象的训练、咨询、设计和指导。他在成为一名独立咨询顾问之前,曾经是迪士尼动画公司的首席软件设计师。当他在AT&T B ell实验室的时候,领导了cfront 3.0版本和2.1版本的编译器开发组他也是Bjarne Stroustrup领导的Bell实验室Foundation项目的成员之一,负责C++程序设计环境中的对象模型部分。Stan是本书所有三个版本的作者,他还撰写了许多关于C++的文章。目前他已受雇于微软公司,负责Visual C++项目。
Josee Lajoie 是IBM加拿大实验室的C/C++编译器开发组的一名成员,也是ANSI/ISO C++标准委员会的核心语言工作组的主席。Josee是《C++ Report》杂志的专栏作家,目前正在滑铁卢大学的计算机图形实验室攻读硕士学位。
潘爱民 浙江海宁人,现任职于北京大学计算机科学技术研究所,副研究员,研究方向为网络与信息安全。自1994年至1999年,他一直从事计算机软件开发方面的工作。1998年到今,了利用业余时间著译了多部关于软件开发的著作,如《Visual C++技术内幕》(第四版),《COM原理与应用》、《COM本质论》、《深入解析ATL》等。1999年他还是《微电脑世界》杂志社的合作专家,撰写了大量深入权威的技术文章。1991年他在南开大学数学系获学士学位,1994年在清华大学自动化系获硕士学位。
C++Primer的第二版和第三版之间的变化非常大。最引人注意的是,C++已经被国际标准化,这不但为语言增加了新的特性,比如异常处理、运行时刻类型识别(RTTI)、名字空间、内置布尔数据类型、新的强制转换方式,而且还大量修改并扩展了现有的特性,比如模板、支持面向对象(object-oriented)和基于对象(object-based)程序设计所需要的类(class)机制、嵌套类型、以及重载函数的解析机制。也许更重要的是,一个覆盖面非常广阔的库现在成了标准C++的一部分,其中包括以前的标准模板库或STL。新的string类型、一组顺序和关联容器类型棗比如vector、list、map和set棗以及在这些类型上进行操作的一组可扩展的泛型算法(generic algorithms),都是这个新标准库的特性。本书不但包括了许多新的资料,而且还涵盖了怎样在C++中进行程序设计的新的思考方法。简而言之,实际上,不但C++已经被重新创造,它的C++ Primer,第三版,也有了很大的变化。
在此第三版中,不但对语言的处理方式发生了根本的变化,而且作者本身也发生了变化:首先,我们的人数已经加倍。而且,我们的写作过程也已经被国际化了(尽管我们还牢牢扎根于北美大陆):Stan是美国人,Josée是加拿大人。最后,这个双作者关系也反映了C++团体的两类主要活动:Stan现在正在华特迪思尼动画公司(Walt Disney Feature Animation)致力于以C++为基础的3D计算机图形和动画应用,而Josée正专心于C++的定义与实现,同时她也是C++标准的核心语言小组的主席,以及IBM加拿大实验室的C++编译器组的成员。
Stan是Bell实验室中与Bjarne Stroustrup(C++的发明人)一起工作的早期成员之一,从1984年开始一直从事C++方面的工作。Stan曾经致力于cfront的各种实现,从1986年的版本1.1到版本3.0,并领导了2.1和3.0版本的开发组。之后,他参与了Stroustrup领导的、Foundation Research Project项目中关于程序设计环境的对象模型部分。
Josée作为IBM加拿大实验室C++编译器组的成员已经有八年时间了。从1990年开始她成为C++标准委员会的一个成员。她曾经担任委员会的副主席三年,目前担任核心语言小组委员会的主席已经达四年之久。
C++ Primer的第三版展示了一个大幅修订的版本,不仅反映了语言的变化和扩展,也反映了作者洞察力和经验的变化。
本书的结构
C++ Primer 为C++国际标准提供了一个全面的介绍。在这种意义上,它是一个初级读本(primer),它提供了一种指导性质的方法来描述C++语言。(但是,它也为C++语言提供了一种简单而温和的描述,从这个角度来看,它不是一本初级读物。)C++语言的程序设计要素,比如异常处理、容器类型、面向对象的程序设计等等,都在解决特定问题或程序设计任务的上下文环境中展示出来。C++语言的规则,比如重载函数调用的解析过程以及在面向对象程序设计下支持的类型转换,也都有广泛的论述,这看起来就超出了一本初级读本的范畴。我们相信,为了加强读者对于C++语言的理解,覆盖这些内容是必要的。对于这些材料,读者应该不时地回头翻阅,而不是一次消化了事。如果开始的时候你发现这些内容比较难以接受或者过于枯燥,请把它们放到一边,以后再回头来看棗我们把这样的章节加上特殊的记号:※。
我们没有假设读者具有C语言的知识,但是,熟悉某些现代的块结构语言会使得学习进展更快一些。本书的意图是作为学习C++的第一本书;而不是学习程序设计的第一本书!为了确保这一点,我们都以一个公共的词汇表作为开始;然而,开始的章节涵盖了一些基本的概念,比如循环语句和变量等,有些读者可能会觉得这些概念太浅显了。不必担心:深层的内容很快就会看到。
C++的许多威力来自于它对程序设计新方法的支持,以及对程序设计问题的思考方式。因此,要想有效地学习使用C++,不只要求简单地学会一组新的语法和语义。为了使这种学习更加容易,本书将围绕一系列可扩展的例子来组织内容。这些例子被用来介绍各种语言特性的细节,同时也说明了这些语言特性的动机所在。当我们在一个完整例子的上下文环境中学习语言特性时,这样的特性为什么会有用处的原因也就变得很清楚了,它使我们对于“何时以及怎样在实际的问题解决过程中使用这些特性”有了一点感觉。另外,把焦点放在例子上,可使读者能够尽早地使用一些概念,随着读者的知识基础被建立起来之后,这些概念会被进一步完整地解释清楚。本书初期的例子含有C++基本概念的简单用法,读者可以先领略一下C++中程序设计的概貌,而不要求完全理解C++程序设计和实现的细节。
第1章和第2章形成了一个独立完整的C++介绍和概述。第1篇的目的是使我们快速地理解C++支持的概念和语言设施,以及编写和执行一个程序所需要的基础知识。读完这部分内容之后,你应该对C++语言有了一些认识,但是还谈不上真正理解C++。这就够了:那是本书余下部分的目的。
第1章向我们介绍了语言的基本元素:内置数据类型、变量、表达式、语句以及函数。它将介绍一个最小的、合法的C++程序,简要讨论编译程序的过程,介绍所谓的预处理器(preprocessor),以及对输入和输出的支持。它给出了多个简单但却完整的C++程序,鼓励读者亲自编译并执行这些程序。第2章介绍了C++通过类机制,为基于对象和面向对象的程序设计提供了支持,同时通过数组抽象的演化过程来说明这些设计思想。另外,它简要介绍了模板、名字空间、异常处理,以及标准库为一般容器类型和泛型程序设计提供的支持。这一章的进度比较快,有些读者可能会觉得难以接受。如果是这样,我们建议你跳过这一章,以后再回头来看。
C++的基础是各种设施,它们使用户能够通过定义新的数据类型来扩展语言本身,这些新类型可以具有与内置类型一样的灵活性和简单性。掌握这些设施的第一步是理解基本语言本身。第3章到第6章(第二篇)在这个层次上介绍了C++语言。
第3章介绍了C++语言预定义的内置和复合数据类型,以及C++标准库提供的string、complex、vector类数据类型。这些类型构成了所有程序的基石。第4章详细讨论了C++语言支持的表达式,比如算术、关系、赋值表达式。语句是C++程序中最小的独立单元,它是第5章的主题。C++标准库提供的容器类型是第6章的焦点。我们不是简单地列出所有可用的操作,而是通过一个文本查询系统的实现,来说明这些容器类型的设计和用法。
第7章到第12章(第3篇)集中在C++为基于过程化的程序设计提供的支持上。第7章介绍C++函数机制。函数封装了一组操作,它们通常形成一项单一的任务,如print()。(名字后面的括号表明它代表了一个函数。)关于程序域和变量生命期的概念、以及名字空间设施的讨论是第8章的主题。第9章扩展了第7章中引入的关于函数的讨论,介绍了函数的重载。函数重载允许多个函数实例(它们提供一个公共的操作)共享一个公共的名字(但是,要求不同的实现代码)。例如,我们可以定义一组print()函数来输出不同类型的数据。第10章介绍和说明函数模板的用法。函数模板为一组可能无限多个函数实例的自动生成提供一个规范描述(“处方”),这些函数实例的类型不同,但实现保持不变。
C++支持异常处理设施。一个异常表示一个没有预料的程序行为,比如所有可用的程序内存耗尽。异常出现的程序部分抛出一个异常棗即,使程序的其他部分可以访问到这个异常。程序中的某个函数必须捕获这个异常并做一些必要的动作。对于异常处理的讨论跨越了两章。第11章用一个简单的例子介绍了异常处理的基本语法和用法,该例子捕获和抛出一个类类型的异常。因为在我们的程序中,实际被处理的异常通常是一个面向对象类层次结构的类对象,所以,关于怎样抛出和处理异常的讨论一直继续到第19章,也就是在介绍面向对象程序设计之后。
第12章介绍标准库提供的泛型算法集合,看一看它们怎样和第6章的容器类型以及内置数组类型互相作用。这一章以一个使用泛型算法的程序设计作为开始。第6章引入的iterator(迭代器)在第12章被进一步讨论,因为它们为泛型算法与实际容器的绑定提供了粘合剂。这一章也引入并解释了函数对象的概念。函数对象使我们能够为泛型算法中用到的操作符(比如等于或小于操作符)提供替换语义。关于泛型算法在附录中有详细说明,并带有用法的示例。
第13章到第16章(第4篇)焦点集中在基于对象的程序设计上棗即,创建独立的抽象数据类型的类设施定义和用法。通过创建新的类型来描述问题域,C++允许程序员在写应用程序时可以不用关心各种乏味的簿记工作。应用程序的基本类型可以只被实现一次,而多次被重用,这使程序员能够将注意力集中在问题本身上,而不是实现细节上。封装数据的设施可以极大地简化应用程序的后续维护和改进工作。
第13章集中在一般的类机制上:怎样定义一个类、信息隐藏的概念(即,把类的公有接口同私有实现分离),以及怎样定义并封装一个类的对象实例。这一章还有关于类域、嵌套类、类作为名字空间成员的讨论。
第14章详细讨论C++为类对象的初始化、析构以及赋值而提供的特殊支持。为了支持这些特殊的行为,需要使用一些特殊的成员函数,分别是构造函数、析构函数和拷贝赋值操作符。这一章我们还将看一看按成员初始化和拷贝的主题(即指一个类对象被初始化为或者赋值为该类的另一个对象),以及为了有效地支持按成员初始化和拷贝而提出的命名返回值(named return value)扩展。
第15章将介绍类特有的操作符重载,首先给出一般的概念和设计考虑,然后介绍一些特殊的操作符,如赋值、下标、调用以及类特有的new和delete操作符。这一章还介绍了一个类的友元的概念(对一个类具有特殊的访问特权)以及友元的必要性。然后讨论用户定义的转换,包括底层的概念和用法的扩展实例。这一章还详细讨论了函数重载解析的规则,并带有代码示例说明。
类模板是第16章的主题。类模板是一个被用于创建一族类的规范描述(“处方”),这样的类包含一个或多个参数化的类型或值。例如,一个vector类可以对内含的元素类型进行参数化。一个buffer类,可以对内含的元素类型以及缓冲区的大小进行参数化。更复杂的用法,比如在分布式计算中,IPC接口、寻址接口、同步接口等,都可以被参数化。这一章讨论了怎样定义一个类模板、怎样创建一个类模板的特定类型的实例、怎样定义类模板的成员(成员函数、静态成员和嵌套类型),以及怎样用类模板来组织我们的程序。最后以一个扩展的类模板的例子作为结束。
面向对象的程序设计和C++的支持机制是第17、18、19和20章(第5篇)的主题。第17章介绍了C++对于面向对象程序设计主要要素的支持:继承和动态绑定。在面向对象的程序设计中,父/子关系(也被称为类型/子类型关系)被用来定义“共享共同行为的各个类”。一个类不是重新实现那些共享特性,而是继承了父类的数据和操作。子类或者子类型只针对它与父类不同的地方进行设计。 例如,我们可以定义一个父类Employee,以及两个子类型:TemporaryEmpl和Manager。这些子类型继承了Employee的全部行为。它们只实现自己特有的行为。
继承的第二个方面,被称为多态性,是指父类型具有“引用它的任何子类型”的能力。例如,一个Employee可以指向自己的类型,也可以指向TemporaryEmpl或者Manager。动态绑定是指“在运行时刻根据多态对象的实际类型来确定应该执行哪个操作”的解析能力。在C++中,这是通过虚拟函数机制来处理的。
第17章介绍了面向对象程序设计的基本特性。这一章说明了如何设计和实现一个Query类层次结构,用来支持第6章实现的文本查询系统。
第18章介绍更为复杂的继承层次结构,多继承和虚拟继承机制使得这样的层次结构成为可能。这一章利用多继承和虚拟继承,把第16章的模板类例子扩展成一个三层的类模板层次结构。
第19章介绍运行时刻类型识别(RTTI)设施。RTTI使得我们的程序在执行过程中可以查询一个多态类对象的类型。例如,我们可以询问一个Employee对象,它是否实际指向一个Manager类型。另外,第19章回顾了异常处理机制,讨论了标准库的异常类层次机构,并说明了如何定义和处理我们自己的异常类层次结构。这一章也深入讨论了在继承机制下的重载函数解析过程。
第20章详细说明了如何使用C++的iostream 输入/输出库。它通过例子说明了一般的数据输入和输出,说明了如何定义类特有的输入输出操作符实例、如何辨别和设置条件状态、如何对数据进行格式化。iostream库是一个用虚拟继承和多继承实现的类层次结构。
C++ Primer以一个附录作为结束,附录给出了每个泛型算法的简短讨论和程序例子。这些算法按字母排序,以便于参考。
最后,我们要说的是,无论谁写了一本书,他所省略掉的,往往与他所讲述的内容一样重要。C++语言的某些方面,比如构造函数的工作细节、在什么条件下编译器会创建内部临时对象、或者对于效率的一般性考虑,虽然这些方面对于编写实际的应用程序非常重要,但是不适合于一本入门级的语言书籍。在开始写作C++ Primer的第三版之前,Stan写的Inside the C++ Object Model (参见本前言最后所附的参考文献中的 [LIPPMAN96a] )包含了许多这方面的内容。当读者希望获得更详细的说明(特别是讨论基于对象和面向对象的程序设计)时,本书常常会引用“Inside the C++ Object Model”中的讨论。
本书故意省略了C++标准库中的某些部分,比如对本地化和算术运算库的支持。C++标准库非常广泛,要想介绍它的所有方面,则远远超出了本书的范围。在后面所附的参考文献中,某些书更详细地讨论了该库(见[MUSSER96] 和 [STROUSTRUP97])。我们相信,在这本书出版之后,一定会有更多的关于C++标准库各个方面的书被随之出版。
第三版的变化
第三版的变化分为四类:
1.涵盖了语言所增加的新特性:异常处理、运行时刻类型识别、名字空间、内置bool类型、新风格的类型强制转换。
2.涵盖了新的C++标准库,包括complex和string类型、auto_ptr和pair类型、顺序容器和关联容器类型(主要是list、vector、map、set容器),以及泛型算法。
3.对原来的文字作了调整,以反映出标准C++对原有语言特性的精炼、变化以及扩展。语言精炼的一个例子是,现在能够前向声明一个嵌套类型,这在以前是不允许的。语言变化的一个例子是,一个虚拟函数的派生类实例能够返回一个“基类实例的返回类型”的派生类。这种变化支持一个被称为clone 或factory的方法(关于clone()虚拟函数,见17.5.7节说明)。对原有语言特性进行扩展的一个例子是,现在可以显式地指定一个函数模板的一个或多个模板实参。(实际上,模板已经被大大地扩展了,差不多已经成为一个新特性!)
4.加强了对C++高级特性的对待和组织方式,尤其是对于模板、类以及面向对象程序设计。Stan从一个相对较小的C++提供者团体到一般的C++用户团体的转移,带来的一个影响是,他相信,越是深入地了解问题,则程序员越是能够高明地使用C++语言。因此,在第三版中,许多情况下,我们已经把焦点转移到如何更好地说明底层特性的概念,以及怎样最好地使用它们,并指出在适当的时候应该避免潜在的缺陷。