C++ 程序设计语言(特别版)

Bjarne Stroustrup

前言

去编程就是去理解。

------ Kristen Nyggard

我觉得用C++ 编程序比以往更令人感到愉快。在过去这些年里,C++ 在支持设计和编程方面取得了令人振奋的进步,针对其使用的大量新技术已经被开发出来了。当然,C++ 并不就是好玩。常规的实际程序员在几乎所有种类和规模的开发项目上,在生产率、可维护性、灵活性和质量方面都取得了显著的进步。到今天为止,C++ 已经应验了我当初对它的期望中的绝大部分,还在许多我原来根本没有梦想过的工作中取得了成功。

本书介绍的是标准C++以及由C++ 所支持的关键性编程技术和设计技术。与本书第一版所介绍的那个C++ 版本相比,标准C++ 是一个经过了更仔细推敲的更强大得多的语言。各种新的语言特征,如名字空间、异常、模板,以及运行时类型识别,使人能以比过去更直接的方式使用许多技术,标准库使程序员能够从比基本语言高得多的层面上起步。

本书第二版中大约有三分之一的内容来自第一版。这个第三版则是重写了比例更大的篇幅的结果。它提供的许多东西是大部分有经验的程序员也需要的,与此同时,本书也比它的以前版本更容易供新手入门。C++ 使用的爆炸性增长和作为其结果的海量经验积累使这些成为可能。

一个功能广泛的标准库定义使我能以一种与以前不同的方式介绍C++ 的各种概念。与过去一样,本书对C++ 的介绍与任何特定的实现都没有关系;与过去一样,教材式的各章还是采用“自下而上”的方式,使每种结构都是在定义之后才使用。无论如何,使用一个设计良好的库远比理解其实现细节容易得多。由于这些情况,在假定读者已经理解了标准库的内部工作原理之前,就可以利用它提供许多更实际更有趣的例子。标准库本身也是程序设计实例和设计技术的丰富源泉。

本书将介绍每种主要的C++ 语言特征和这个标准库,它是围绕着语言和库功能组织起来的。当然,各种特征都将在使用它们的上下文中介绍。也就是说,这里所关注的是将语言作为一种设计和编程的工具,而不是在于语言本身。本书将展示那些使C++ 卓有成效的关键性技术,讲述为掌握它们所需要的那些基本概念。除了专门阐释技术细节的那些地方之外,其他实例都取自系统软件领域。另一本伴随的书《带标注的C++ 语言标准》(The Annotated C++ Language Standard),将给出完整的语言定义,所附标注能使它更容易理解。

本书的基本目标就是帮助读者理解C++ 所提供的功能将如何支持关键性的程序设计技术。这里的目标是使读者能远远超越简单地复制实例并使之能够运行,或者模仿来自其他语言的程序设计风格。只有对隐藏在语言背后的思想有了一个很好的理解之后,才能真正掌握这个语言。如果有一些具体实现的文档的辅佐,这里所提供的信息就足以对付具有挑战性的真实世界中的重要项目。我的希望是,本书能帮助读者取得新的洞察力,使他们成为更好的程序员和设计师。

致谢

除了第一和第二版的致谢一节中所提到的那些人之外,我还要感谢Matt AusternHans BoehmDon CailwellLawrence CrowlAlan FeuerAndrew ForrestDavid GayTim FriffinPeter JuhlBrian KernighanAndrew KoenigMike MowbrayRob MurrayLee NackmanJoseph NewcomerAlex StepanovDavid VandevoordePeter WeinbergerChris Van Wyk,他们对第三版各章的初稿提出了许多评论意见。没有他们的帮助和建议,这本书一定会更难理解,包含更多的错误,没有这么完全,当然也可能稍微短一点。

我还要感谢C++ 标准化委员会的志愿者们,是他们完成了规模宏大的建设性工作,才使C++ 具有它今天这个样子。要罗列出每个人就会有一点不公平,但一个也不提就更不公平,所以我想特别提出Mike BallDag BrückSean CorfieldTed GoldsteinKim KnuttilaAndrew KoenigJosé LajoieDmitry LenkovNathan MyersMartin O'RiordanTom PlumJonathan ShopiroJerry SchwarzAlex StepanovMike Vilot,他们中的每个都在C++及其标准库的某些方面直接与我合作过。

在这本书第一次印出之后,许多人给我发来电子邮件,提出更正和建议。我已经在原书的框架里响应了他们的建议,使后来印出的书大为改善。将本书翻译到许多语言的译者也提供了许多澄清性的意见。作为对这些读者的回应,我增加了附录DE。让我借这个机会感谢他们之中特别有帮助的几位:Dave AbrahamsMatt AusternJan BielawwskiJanina Mincer DaszkiewiczAndrew KoenigDietmar KühlNicolai JosuttisNathan MyersPaul E. SevincAndy Tenne-SencShoichi UchidaPing-Fai(Mike) YangDennis Yelle

Bjarne Stroustrup

Murry Hill,新泽西

――――――――――――――――――――――――――――――――――――

 

第二版前言

路总要继续走。

------ Bilbo Baggins

正如在本书的第一版所允诺的,C++ 为满足其用户的需要正在不断地演化。这一演化过程得助于许多有着极大的背景差异,在范围广泛的应用领域中工作的用户们的实际经验的指导。在第一版出版后的六年中,C++ 的用户社团扩大了何止百倍,人们学到了许多东西,发现了许多新技术并通过了实践的检验。这些技术中的一些也在这一版中有所反应。

在过去六年里所完成的许多语言扩充,其基本宗旨就是将C++ 提升成为一个服务于一般性的数据抽象和面向对象程序设计的语言,特别是提升为一个写高质量的用户定义类型库的工具。一个“高质量的库”是指这样的库,它以一个或几个方便、安全且高效的类的形式,给用户提供了一个概念。在这个上下文中,安全意味着这个类在库的使用者与它的供方之间构成了一个特殊的类型安全的界面;高效意味着与手工写出的C代码相比,这种库的使用不会给用户强加明显的运行时间上或空间上的额外开销。

本书介绍的是完整的C++ 语言。从第1章到第10章是一个教材式的导引,第11章到第13章展现的是一个有关设计和软件开发问题的讨论,最后包含了完整的C++ 参考手册。自然,在原来版本之后新加入的特征和变化已成为这个展示的有机组成部分。这些特征包括:经过精化后的重载解析规则和存储管理功能,以及访问控制机制、类型安全的连接、conststatic成员函数、抽象类、多重继承、模板和异常处理。

C++ 是一个通用的程序设计语言,其核心应用领域是最广泛意义上的系统程序设计。此外,C++ 还被成功地用到许多无法贴上上述标签的应用领域中。从最摩登的小型计算机到最大的超级计算机上,以及几乎所有操作系统上都有C++ 的实现。因此,本书描述的是C++ 语言本身,并不想去解释任何特殊的实现、程序设计环境或者库。

本书中给出的许多类的实例虽然都很有用,但也还是应该归到“玩具”一类。与在完整的精益求精的程序中做解释相比,这里所采用的解说风格能更清晰地呈现那些具有普遍意义的原理和极其有用的技术,在实际例子中它们很容易被细节所淹没。这里给出的大部分有用的类,如链接表、数组、字符串、矩阵、图形类、关联数组类等等,在广泛可用的各种商品的和非商品资源中,都有可用的“防弹”和/或“金盘”版本。那些“具有工业强度”的类和库中的许多东西,实际上不过是在这里可以找到的玩具版本的直接或间接后裔。

与本书的第一版相比,这一版特别注重关心教育方面的问题。当然,这里的叙述仍然是针对有经验的程序员,并努力不去轻视他们的智慧和经验。有关设计问题的讨论有了很大的扩充,作为对读者在语言特征及其直接应用之外的要求的一种回应。技术细节和精确性也有所增强。这里的参考手册特别表现了在这个方向上许多年的工作。我的目标是提供一本具有足够深度的书籍,使大部分程序员能在多次阅读中都有所收获。换句话说,这本书给出的是C++ 语言,它的基本原理,以及使用时所需要的关键性技术。欢迎欣赏!

致谢

除了在第一版前言中致谢一节里所提到人们之外,我还要感谢Al AhoSteve BuroffJim CoplienTed GoldsteinTony HansenLorraine JuhlBrian KernighanAndrew KoenigBill LeggettWarren MontgomeryMike MowbrayRob MurryJonathan ShopiroMike VilotPeter Weinberger,他们对第二版的初稿提出了许多意见。许多人对C++1985年到1991年的开发有很大影响,我只能提出其中几个:Andrew KoenigBrian KernighanDoug McIlroyJonathan Shopiro。还要感谢参考手册初稿“外部评阅”的许多参与者,以及在X3J16的整个第一年里一直在其中受苦的人们。

Bjarne Stroustrup

Murry Hill,新泽西

――――――――――――――――――――――――――――――――――――

 

第一版前言

语言使我们思维敏锐,

也限制了思考的范围。

------ B.L. Whorf

C++ 是一种通用的程序设计语言,其设计就是为了使认真的程序员工作得更愉快。除了一些小细节之外,C++ C程序设计语言的一个超集。C++ 提供了C所提供的各种功能,还为定义新类型提供了灵活而有效的功能。程序员可以通过定义新类型,使这些类型与应用中的概念紧密对应,从而把一个应用划分成许多容易管理的片段。这种程序设计技术通常被称为数据抽象。某些用户定义类型的对象包含着类型信息。这种对象就可以方便而安全地用在那种对象类型无法在编译时确定的上下文中。使用这种类型的对象的程序通常被称为是基于对象的。如果用得好,这些技术可以产生出更短,更容易理解,而且也更容易管理的程序。

C++ 里的最关键概念是。一个类就是一个用户定义类型。类提供了对数据的隐藏,数据的初始化保证,对于用户定义类型的隐式类型转换,动态类型判别,用户控制的存储管理,以及重载运算符的机制等。在类型检查和表述模块性方面,C++提供了比C好得多的功能。它还包含了许多并不直接与类相关的进步,包括符号常量,函数的在线替换,默认函数参数,重载函数名,自由空间管理运算符,以及引用类型等等。C++ 保持了C高效处理硬件基本对象(位、字节、字、地址等)的能力。这就使用户定义类型能够在相当高的效率水平上实现。

C++ 及其标准库也是为了可移植性。当前的实现能够在大多数支持C的系统上运行。C的库也能用于C++ 程序,而且大部分支持C程序设计的工具也同样能用于C++

本书的基本目标就是帮助认真的程序员学习这个语言,并将它用于那些非平凡的项目。书中提供了有关C++ 的完整描述,许多完整的例子,以及更多的程序片段。

致谢

如果没有许多朋友和同事持之以恒的使用、建议和建设性的批评,C++ 绝不会像它现在这样成熟。特别的,Tom CargillJim CoplienStu FeldmanSandy FraserSteve JohnsonBrian KernighanBart LocanthiDoug McIlroyDennis RechieLarry RoslerJerry SchwarzJon Shopiro对语言发展提供了重要的思想。Dave Presotto写出了流I/O库的当前实现。

此外,还有成百的人们对C++ 及其编译器的开发做出了贡献:他们给我提出改进的建议,描述他们所遇到的问题,告诉我编译中的错误等。我只能提出其中的很少几位:Gary BishopAbdrew HumeTom KarzesVictor MilenkovicRob MurryLeonie RoseBrian SchmultGary Walker

许多人在这本书的撰写过程中为我提供了帮助,特别值得提出的是Jon BentleyLaura EavesBrian KernighanTed KowalskiSteve MahaneyJon Shopiro,以及参加198572627日俄亥俄州哥伦布贝尔实验室C++ 课程的人们。

Bjarne Stroustrup

Murry Hill,新泽西

――――――――――――――――――――――――――――――――――

Bjarne StroustrupC++的设计师和最早的实现者,也是《C++ 程序设计语言》(第一版1985,第二版1991,第三版1997),《带标注的C++参考手册》和《C++语言的设计与演化》的作者。丹麦Aarhus大学和英格兰牛津大学毕业。Stroustrup博士现在是AT&T大规模程序设计研究部的负责人,AT&T特别成员,AT&T贝尔实验室特别成员,以及ACM特别成员。他的研究兴趣包括分布式系统、操作系统、模拟、设计和程序设计。他也是Addison-WesleyC++ In-Depth Series的编辑。