C++语言的设计和演化

978-7-115-49711-6
作者: [美]本贾尼·斯特劳斯特卢普 ( Bjarne Stroustrup )
译者: 裘宗燕
编辑: 吴晋瑜
分类: C++

图书目录:

详情

本书是C++的设计者Bjarne Stroustrup关于C++ 语言的最主要著作之一(另一本是《C++程序设计语言》)。在这本书中,作者全面论述了C++ 的历史和发展,C++中各种重要机制的本质、意义和设计背景,这些机制的基本用途和使用方法,讨论了C++ 所适合的应用领域和未来发展前景。本书在帮助人们深入理解C++ 语言方面的地位无可替代,值得每个关心、学习和使用C++ 语言的专业工作者、科研人员、教师和学生阅读。在这本书中,作者还从实践的角度出发,讨论了许多与程序设计语言、系统程序设计、面向对象的技术和方法、软件系统的设计和实现技术等有关的问题,值得每一个关心这些领域及相关问题的计算机工作者和学生们阅读参考。

图书摘要

版权信息

书名:C++语言的设计和演化

ISBN:978-7-115-49711-6

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

著    [美]本贾尼·斯特劳斯特卢普 ( Bjarne Stroustrup )

译    裘宗燕

责任编辑 吴晋瑜

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315


Authorized translation from the English language edition, entitled The Design and Evolution of C++, ISBN: 978-0-2015-4330-8 by Bjarne Stroustrup, published by Pearson Education, Inc. Copyright © 1994 Pearson Education, Inc.

All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from Pearson Education, Inc.

CHINESE SIMPLIFIED language edition published by POSTS AND TELECOMMUNICATIONS PRESS, Copyright © 2018.

本书中文简体版由Pearson Education,Inc授权人民邮电出版社出版。未经出版者书面许可,不得以任何方式或任何手段复制和抄袭本书内容。

本书封面贴有Pearson Education(培生教育出版集团)激光防伪标签,无标签者不得销售。

版权所有,侵权必究。


本书是C++的设计者Bjarne Stroustrup关于C++语言的最主要著作之一(另一本是《C++程序设计语言》)。在这本书中,作者全面论述了C++ 的历史和发展,C++中各种重要机制的本质、意义和设计背景,这些机制的基本用途和使用方法,讨论了C++所适合的应用领域和未来发展前景。本书在帮助人们深入理解C++ 语言方面的地位无可替代,值得每个关心、学习和使用C++ 语言的专业工作者、科研人员、教师和学生阅读。在这本书中,作者还从实践的角度出发,讨论了许多与程序设计语言、系统程序设计、面向对象的技术和方法、软件系统的设计和实现技术等有关的问题,值得每一个关心这些领域及相关问题的计算机工作者和学生们阅读参考。


这是一本独特的书,是由C++语言的设计师本人写就的,描述C++语言的发展历史、设计理念及技术细节的著作。在计算机发展历史上,这种从多方面、多角度描述一种主流语言各个方面的综合性著作,至今我还只看到这一本。阅读本书,不仅可以了解有关C++语言的许多重要技术问题和细节,还可以进一步理解各种C++特征的设计出发点,设计过程中所考虑的方方面面问题,以及语言成形过程中的各种权衡和选择。每个学习和使用C++语言的人,一定能由此加深对自己所用工具的认识,进一步理解应该如何用好这个语言。此外,还能看到作者对于复杂系统程序设计的许多观点和想法。如果一个人想深入理解C++ 语言,想使C++ 成为自己得心应手的工具,想在复杂的系统程序设计领域中做出有价值的工作,想了解面向对象程序设计语言各方面的一般性问题,想了解程序设计语言的发展现状、问题和前景,本书都是最值得阅读的书籍之一。

C++语言的设计目标是提供一种新的系统开发工具,希望能在一些方面比当时的各种工具语言有实质性的进步。今天看,C++最重要的作用就是使那时的阳春白雪(数据抽象、面向对象的理论和技术等)变成了普通系统开发人员可以触及、可以接受使用、可以从中获益的东西。这件事在计算科学技术发展的历史记录上必定会留下明显的痕迹。本书从一个最直接参予者的角度,记述了C++语言的起源和发展,记录了它怎样成长为今天的这个语言,怎样使语言研究的成果变成了程序员手中的现实武器。

从来都没有一种完美的程序设计语言。C++ 语言由于其出身(出自C语言),由于其发展过程中各种历史和现实因素的影响,也带着许多瑕疵和不和谐,尤其是在作为C++ 基础的C语言的低级成分与面向数据抽象的高级机制之间。对于一个目标是支持范围广泛的、复杂系统实现的语言来说,这类问题也很难避免。为了系统的效率和资源的有效利用,人们希望有更直接的控制手段(低级机制);而为能将复杂的功能组织成人们易于理解和把握的系统,又需要有高级的机制和结构。在使用一个同时提供了这两方面机制的语言时,应该如何合理而有效地利用它们,使之能互为补充而不是互相冲突,本书中许多地方讨论到这些问题,也提出了许多建议。这些,对于正确合理地使用C++语言都是极其重要的。

C++ 并不是每个人都喜欢的语言(没有任何语言可能做到这一点),但不抱畸见的人都会承认,C++ 语言取得了极大成功。C++ 语言的工作开始于一个人(本书作者)的某种很合理、很直观的简单想法(为复杂的系统程序设计提供一种更好的工具),由于一个人始终不渝的努力,一小批人的积极参与,在一大批人(遍及世界的系统开发人员)的热心关注、评论和监督下,最终造就出了一项重要的工作。这个工作过程本身非常耐人寻味,它也是在现代信息环境(主要是互联网络)下,开展全球范围的科学技术研究的一个最早演练。在这个成功中,商业的考虑、宣传和炒作从来没有起过任何实质性作用,起作用的仍然是理性的思维、严肃的科学态度、无休止的踏踏实实的实际工作。这些,与今天在信息科学技术领域中常见的浮躁情绪和过分的利益追求形成了鲜明对比。许多事实给了我们一种警示:时尚转眼就可能变成无人理睬的烂泥,只是博人眼球的东西很快就会被忽视,炒作最凶的东西往往也消失得最快,而真正有价值的成果往往起源于人们最基本的需求和向往。

作为C++ 语言的创造者,作者对于自己的作品自然是珍爱有加。针对某些对C++ 语言的批评,本书中也有一些针锋相对的比较尖锐的观点。但通观全书,作者的论点和意见还是比较客观的,并没有什么过于情绪化的东西。在前瞻性讨论中,作者提出了许多预见。经过这五六年时间,其中一些已经变成了现实,也有些,特别有效的开发环境,还在发展之中。这些可能也说明了语言本身的一些性质:C++是一种比较复杂的语言,做好支持它的工具绝不是一件容易的事情,在这些方面还有许多发展余地。

作者在讨论C++ 的设计和发展的过程中,还提出了许多人文科学领域的问题,提出了他在从事科学技术工作中的人文思考,这些认识和观点也是C++ 成长为今天这样一个语言的基础。作者的这些想法也可以供我们参考。

今天,作为一种通用的系统程序设计语言,C++ 已经得到了广泛的认可。许多个人和企业将C++ 作为软件系统的开发工具,许多计算机专业课程用它作为工具语言。近十年来,国外的一些计算机教育工作者也一直在探索将C++ 作为CS1(计算机科学的第一门课程)的工作语言的可行性,国内学习和使用C++ 的人也越来越多。在这种情况下,由C++语言设计师Bjarne Stroustup本人撰写的有关C++ 的两部重要著作,本书和《C++程序设计语言》,都在中国出版,这当然是非常有意义的事情。为此我非常感谢相关出版社的管理和编辑人员(相信许多计算机工作者也会如此),感谢他们在国内出版界更多关注热门计算机图书的浪潮中,愿意付诸努力,出版一些深刻的、影响长远的重要著作。我祝愿这种工作能获得丰厚的回报,对于整个社会,也包括出版社自身。

作为译者,我希望作为自己的这个中译本能给学习C++ 语言、用这个语言从事教学、从事程序设计工作和复杂系统程序设计的人们提供一点帮助,使这本有关C++ 语言的最重要著作中阐释的事实和思想能够被更多人所了解。虽然我始终将这些铭记在心,但译文中仍难免出现差错和疏漏,在此也恳请有见识的读者不吝赐教。

裘宗燕 

2001年6月于北大

2012年版注记:本书的中文版2002年由机械工业出版社出版。承蒙那里朋友的理解和支持,以及科学出版集团科海新世纪书局的帮助,本书得以再次出版。本版保持了原版的基本文字,但也根据情况和读者意见做了全面的修改和润色,并保留了原版的译者序,特此说明。

2020年版注记:感谢人民邮电出版社,使得本书得以重新出版,满足国内读者的长期需求。这次出版前,译者仔细检查了全书,更正了一些错误,修改了不少叙述和说法,以能更好满足读者的需要。原书译者序保留,特此说明。


一个人,如果不耕作,就必须写作。

——Martin A. Hansen

ACM关于程序设计语言历史的HOLP-2会议要我写一篇关于C++ 历史的文章。这看起来是个很合理的想法,还带着点荣誉性质,于是我就开始写了。为了对C++的成长有一个更全面、更公平的观点,我向一些朋友咨询了他们对C++的早期历史的印象。这就使得关于这个工作的小道消息不胫而走。有关故事逐渐变了味,有一天,我忽然接到一个朋友的来函,问我在哪里可以买到我关于C++ 设计的新书。这封电子邮件就是本书的真正起源。

在传统上,关于程序设计和程序设计语言的书都是在解释某种语言究竟是什么,还有就是如何去使用它。但无论如何,有许多人也很想知道某个语言为什么会具有它现在的这个样子,以及它是怎样成为这个样子的。本书就是想针对C++ 语言,给出对后面这两个问题的解释。在这里要解释C++ 怎样从它的初始设计演化到今天的这个语言,要描述造就了C++ 的各种关键性的问题、设计目标、语言思想和各种约束条件,以及这些东西又是如何随着时间的推移而变化的。

当然,C++ 语言和造就它的设计思想、编程思想自身不会演化,真正演化的是C++ 用户们对于实际问题的理解,以及他们对于能够帮助解决这些问题的工具的理解。因此,本书也将追溯人们用C++ 去处理的各种关键性问题,以及实际处理那些问题的人们的认识,这些都对C++ 的发展产生了重要影响。

C++ 仍然是一个年轻的语言,许多用户对这里将要讨论的一些问题还不知晓。这里所描述的各种决策的进一步推论,可能还需要一些年才能变得更清晰起来。本书要展示的是我个人关于C++ 如何出现、它是什么以及它应该是什么的观点。我希望这些东西能帮助人们理解怎样才能最好地使用C++,理解C++ 的正在继续进行的演化进程。

书中特别要强调的是整体的设计目标、现实的约束以及造就出C++ 的那些人们。有关各种语言特征的关键性设计决策的讨论被放到了相应的历史环境里。这里追溯了C++ 的演化过程,从C with Classes开始,经过Release 1.0和2.0,直到当前ANSI/ISO的标准化工作,讨论了使用、关注、商业行为、编译器、工具、环境和库的爆炸性增长,还讨论了C++ 与C、Simula之间关系的许多细节。对于C++ 与其他语言的关系只做了简短讨论。对主要语言功能的设计,例如类、继承、抽象类、重载、存储管理、模板、异常处理、运行时类型信息和名字空间等,都在一定细节程度上进行了讨论。

本书的根本目的,就是想帮助C++ 程序员更好地认识他们所用的语言,该语言的背景和基本概念;希望能激励他们去试验那些对他们而言全新的C++ 使用方式。本书也可供有经验的程序员和程序设计语言的学生阅读,有可能帮助他们确定使用C++ 是不是一件值得做的事情。

我非常感谢Steve Clamage、Tony Hansen、Lorraine Juhl、Peter Juhl、Brian Kernighan、Lee Knight、Doug Lea、Doug McIlroy、Barbara Moo、Jens Palsberg、Steve Rumsby和Christopher Skelly。感谢他们完整地阅读了本书的手稿,他们建设性的指教使本书的内容和组织都发生了重要变化。Steve Buroff、Martin Carroll、Sean Corfield、Tom Hagelskjoer、Rick Hollinbeck、Dennis Mancl和Stan Lippmann通过对一些章节的评论提供了帮助。还要感谢Archie Lachner在我还没有想到这本书之前就提出了对本书的要求。

自然,我还应该感谢那些帮助创造出C++ 语言的人们。从某种意义上说,本书就是献给他们的礼物,他们中一部分人的名字可以在各个章节和索引中找到。如果要我点出一些个人来,那就必然是Brian Kernighan、Andrew Koenig、Doug McIlroy和Jonathan Shopiro。他们中的每一个都在过去十多年间一直支持和鼓励我,都是提供各种想法的源泉。还要感谢Kristen Nygaard和Dennis Ritchie作为Simula和C的设计师,C++ 从它们那里借用了一些关键性的成分。经过这些年,我已经逐渐认识到,他们不仅是才华横溢的讲究实际的语言设计师,而且也是真正的绅士和绝对亲切的人。

Bjarne Stroustrup

Murray Hill, New Jersey


本书由异步社区出品,社区(https://www.epubit.com/)为您提供相关资源和后续服务。

作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。

当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,单击“提交勘误”,输入勘误信息,单击“提交”按钮即可。本书的作译者和编辑会对您提交的勘误进行审核,确认并接受后,将赠予您异步社区的100积分(积分可用于在异步社区兑换优惠券、样书或奖品)。

我们的联系邮箱是contact@epubit.com.cn。

如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。

如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区在线提交投稿(直接访问www.epubit.com/selfpublish/submission即可)。

如果您来自学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。

如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权益的保护,也是我们持续为广大读者提供有价值的内容的动力之源。

“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT技术图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT技术图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。

“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社近30年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、AI、测试、前端、网络技术等。

异步社区

微信服务号


写作是仅有的一种只有通过写才能习得的艺术。

——佚名

本书的主题——怎样读这本书——C++的时间表——C++与其他程序设计语言——参考文献

C++语言的设计就是希望为系统程序设计提供Simula的程序组织功能,同时又提供C语言的效率和灵活性。当时希望在有了这些想法之后的半年之内就能把这种语言用于实际项目。最终,成功实现了。

在那个时候,1979年中期,这个目标的朴实性或是荒谬性都还没有被认识清楚。之所以说这个目标是朴实的,是因为它并不涉及任何创新。然而无论从时间的长短还是对效率和灵活性的苛求看,这个目标都又显得荒谬。这些年里也确实出现了一些的创新,而效率和灵活性得到维持,没做什么妥协。这些年里,随着时间推移,C++的目标进一步精化,经过仔细推敲,变得更清晰了。今天使用的C++非常直接地反映了它的初始目标。

本书的宗旨就是想把这些目标见诸于文字,追溯其演化过程,描述C++如何从许多人为建立一种语言而做的努力中逐渐浮现出来,并按照这些目标为其用户服务。为能做到这一点,我将试着在历史事实(例如名字、地点和事件)与语言设计、实现和使用的技术事项之间寻找一种平衡。列出每个小事件并不是我的目的,但也需要关注一些对C++的定义产生了实际影响,或者可能影响其未来发展和使用的重要事件、思想和趋势。

在描述这些事件时,我将试着按当时发生的情况去描述它们,而不是按我或者其他人可能更喜欢它们发生的样子。只要合理,我都用取自文献的引文来说明有关的目标、原理和特征,就像在它们出现的时候那样。我也试着不对事件表现出某种事后聪明;反之,我总把回顾性的注述和有关某决策所蕴涵的东西的注述单独写出,并明确标明这些属于回顾。简单说,我非常厌恶修正主义的历史学,想尽量避免它。例如,当我提到“我那时就发现Pascal的类型系统比没有更坏——它是一种枷衣,产生的问题比解决的更多。它迫使我扭曲自己的设计,以适应一个面向实现的人造物。”这也就是说,我认为在那个时候这是事实,而且是一个对C++的演化有重要影响的事实。这种对Pascal的苛刻评价是否公平,或者今天(在十几年之后)我是否还会做出同样评价,与此并无干系。我如果删掉这个事实(比如说为了不伤害Pascal迷的感情,或为免除自己的羞愧,或为避免争论),或者修改它(提供一个更完全和调整后的观点),那就是包装了C++的历史。

我试着提及那些对C++的设计和演化做出了贡献的人,也试着特别提出他们的贡献以及事情发生的时间。这样做在某种意义上说是很冒险的。因为我没有完美的记忆,很可能会忽略了某些贡献,我在此表示歉意。我一定要提一下做出与C++有关的某个决策的人的名字。不可避免,这里提出的有可能并不都是第一个遇到某特定问题的人,或者第一个想出某种解决方案的人。这当然很不幸,但含含糊糊或者干脆避免提起人名将更糟糕。请毫不犹豫地给我提供信息,这样做可能有助于澄清某些疑点。

在描述历史事件时总存在一个问题:我的描述是否客观。我尽可能试着去矫正自己不可避免的倾向性,设法获得我没有参与的各种事件的信息,与涉足有关事件的人交谈,并请一些参与了C++演化过程的人们读这本书。他们的名字可以在前言的最后找到。此外,在《程序设计语言的历史》(HOPL-2,History of Programming Languages)会议论文 [Stroustrup,1993] 中包含了取自这本书的核心历史事件,它经过了广泛审阅,被认为并不包含不适当的倾向性。

本书第一部分大致是按时间顺序审视C++的设计、演化、使用和标准化过程。我选择这种组织方式,是因为在前面一些年里,主要的设计决策可以排成一个整洁且有逻辑的序列,映射到一个时间表里。第1~3章描述了C++的起源,以及它从C with Classes到Release 1.0的演化。第4章描述在这期间以及后来指导C++成长的一些原则。第5章提供了一个1.0之后的历史年表。第6章描述了ANSI/ISO标准化的努力。第7章和第8章讨论了应用、工具和库。最后,第9章给出了一个回顾和一些面向未来的思考。

第二部分描述的是Release 1.0之后C++的发展。这个语言成长起来了,但还是在Release 1.0前后建造起来的框架之内。这个框架包括了一集所需特征,如模板和异常处理,还有指导着它们的设计的一组规则。在Release 1.0之后,年代排列对C++的发展就不那么重要了,在1.0之后的那些扩充,即使按年代排列的情况与实际有所不同,C++的定义在实质上还会是目前这个样子。因此,解决各种问题、提供各种特征的实际顺序,只有历史研究的价值了。严格按时间顺序进行描述会干扰思想的逻辑流程,所以第二部分是围绕着重要语言特征组织的。第二部分的各章都是独立的,可以按任意顺序阅读:第10章,存储管理;第11章,重载;第12章,多重继承;第13章,类概念的精炼;第14章,强制;第15章,模板;第16章,异常处理;第17章,名字空间;第18章,C语言预处理器。

不同的人,对一本有关程序设计语言的设计和演化的书所抱的期望大相径庭。特别的,对于应该以怎样的细节程度讨论这个题目,任意两个人的意见很可能都不相同。我收到的有关我HOPL-2论文不同版本的每份评审意见(大大超过10份)的形式都是“这篇文章太长……请在论题X、Y和Z方面增加一些信息”。更糟的是,大约三分之一的意见里有这样的见解:“请删掉那些有关哲学/信仰的废话,给我们提供真正的技术细节。”另外三分之一的见解则是:“让那些无趣的细节饶了我吧,请增加有关你的设计哲学方面的信息。”

为了摆脱这种两难局面,我实际上在一本书里写了另一本书。如果你对各种细节不感兴趣,那么请首先跳过所有的小节(以x.y.z形式编号的节,其中x是章编号、y是节编号),而后再去读那些看起来有兴趣的节。你也可以按顺序读这本书,从第一页开始一直读到结尾。但在这样做时,你就有可能陷进去,被某些细节缠住。这样说并不意味着细节不重要。正相反,如果只考虑原则和普遍性,根本就不可能真正理解一个程序设计语言。具体实例是最基本的东西。但无论如何,在查看各种细节时,如果没有能将它们匹配其中的整体画面,人也很容易深深地陷入迷途。

为进一步提供一些帮助,在第二部分里,我将主要讨论集中在新特征和公认的高级特征方面,这也使第一部分能够集中于基础方面。几乎所有关于C++演化的非技术性信息都可以在第一部分找到,对“哲学讨论”缺乏耐心的人可以跳过第4章到第9章,直接转到第二部分去看有关语言特征的技术细节。

我设想某些人会将本书作为参考文献使用,也有许多人可能只读一些独立的章而不管前面那些章。为了使这种使用也可行,我已经把许多章做成对有经验的C++程序员而言是自足的,并通过交叉引用和索引项目(本译本未录,可参考其他中文译本)使读者能更自由。

请注意,我并没有试图在这里定义C++的各种特征,而只是陈述了足够多的细节,提供了关于这些特征缘何而来的自足的描述。我也不想在这里教C++编程或者设计,如果要找一本教科书,请看[2nd]。

下面的C++时间表可能帮助你看清这个故事将把你带到哪个地方:

1979年5月开始C with Classes的工作
10月第一个C with Classes实现投入使用
1980年4月第一篇有关C with Classes的贝尔实验室内部报告[Stroustrup,1980]
1982年1月第一篇有关C with Classes的外部论文[Stroustrup,1982]
1983年8月第一个C++实现投入使用
12月C++命名
1984年1月第一本C++手册
1985年2月第一次C++外部发布(Release E)
10月Cfront Release 1.0(第一个商业发布)
10月The C++ Programming Language[Stroustrup,1986]
1986年8月有关“什么是”的文章 [Stroustrup,1986b]
9月第一次OOPSLA会议(集中于Smalltalk的OO宣传开始)
11月第一个商业的C++ PC移植(Cfront 1.1,Glockenspiel)
1987年2月Cfront Release 1.2
11月第一次USENIX C++会议(圣菲,新墨西哥州)
12月第一个GNU C++发布(1.13)
1988年1月第一个Oregon Software C++发布
6月第一个Zortech C++发布
10月第一次USENIX C++实现者工作会议(Estes Park,科罗拉多州)
1989年6月Cfront Release 2.0
12月ANSI X3J16组织会议(华盛顿,DC)
1990年5月第一个Borland C++发布
3月第一次 ANSI X3J16技术会议(Somerset,新泽西州)
5月The Annotated C++ Reference Manual[ARM]
7月模板被接受(西雅图,华盛顿州)
11月异常被接受(Polo Alto,加利福尼亚州)
1991年6月The C++ Programming Language(第2版)[2nd]
6月第一次ISO WG21会议(Lund,瑞典)
10月Cfront Release 3.0(包括模板)
1992年2月第一个DEC C++发布(包括模板和异常)
3月第一个Microsoft C++发布
5月第一个IBM C++发布
1993年3月运行时类型识别被接受(Portland,俄勒冈州)
7月名字空间被接受(慕尼黑,德国)
1994年8月ANSI/ISO委员会草案登记
1997年7月The C++ Programming Language(第3版)
10月ISO标准通过表决被接受
1998年11月ISO标准被批准

本书是为C++用户而写的,也就是说,为那些程序员和设计师而写。我试图(无论你相信与否)在给出一种有关C++语言、它的功能和它的演化过程的用户观点时,尽量避免那些真正晦涩的深奥论题。有关语言的纯粹技术性讨论,只有在它们确实阐释了某些对用户有重要影响的问题时,才在这里展开。有关模板中的名字检索(15.10节)和临时量生存期的讨论都是这方面的例子。

程序设计语言的专家们、语言律师们以及实现者们可能在本书中发现许多珍闻,但本书的目标更多的是想展现出一幅大范围的图景,而不是精确详尽的点点细节。如果你希望的是精确技术细节的话,C++的定义可以从The Annotated C++ Reference Manual [ARM]、The C++ Programming Language(第2版)[2nd] 以及ANSI/ISO标准化委员会的工作文件中找到。当然,如果没有对语言用途的一种认识,一个语言的定义细节是根本无从详尽理解的。这个语言(无论其细节还是全部)的存在,就是想有助于程序的构造。我写这本书的意图也就是希望提供一种洞见,能对这方面的努力有所帮助。

几个审稿人都要求我做一些C++语言与其他语言的比较。关于这件事,我已经决定不做了。在此我要重申自己长期且强烈持有的一个观点:语言的比较很少是有意义的,更少是公平的。对重要的语言做出一个很好的比较,需要付出许多精力,实际上大大超出了大部分人所愿意的付出,超出了他们所具有的在广泛应用领域中的经验。为做好这件事,还需要严格维持一种超然的不偏不倚的观点和一种平和的理性。我没有时间,而且作为C++的设计者,我的不偏不倚将永远不能得到足够的信任。

我还为自己反复看到的,在企图做语言之间的公允比较时所发生的一种现象感到忧虑。作者们常常很努力地希望能不偏不倚,但却毫无希望地偏向于关注某个特定的应用领域、某种风格的程序设计或者程序员中的某种文化。更坏的是,当某种语言明显地比另外的语言更广为人知时,在看法上一种微妙转移就会发生了:这个知名语言的瑕疵将被认为不那么重要了,简单的迂回处理方法被给了出来;而其他语言中类似的瑕疵却被认定是根本性的。常见情况是,做比较或者提出指责的人,根本就不知道那些不那么有名的语言里常用的迂回解决方法,因为在他们更熟悉的语言里这些方法行不通。

与此类似,有关知名语言的信息总倾向于是最新的,而对那些不那么有名的语言,作者依靠的则常常是几年以前的信息。对那些值得去做比较的语言,拿语言X 3年前定义的样子与语言Y最近的试验性实现的情况去比较,这样做既不公平,也无法提供有价值的信息。因此我把对C++之外其他语言的见解限制在泛义上和极其特殊的看法上。这是一本有关C++的书,讨论它的设计,以及促成它的演化的各种因素。这里并不试图拿C++的特征与可以在其他语言里找到的东西做对照或比较。

为了把C++融进历史的大环境中,这里有一个关于许多语言第一次出现的图表,在讨论C++时常常会与这些语言不期而遇。

这个图表并不想做得尽善尽美,除了那些对C++产生了重要影响的方面。特别的,这个图对于Simula类观念的影响强调得很不够;Ada [Ichbiah,1979] 和CLU [Liskov,1979] 也受到了Simula [Birtwistle,1979] 的一些影响;而Ada 9X [Taft,1992]、Beta [Madsen,1993]、Eiffel [Meyer,1988] 和Modula-3 [Nelson,1991] 受到了它的很大影响。C++对其他语言的影响也搁在一旁,没有提。图中的实线表明的是在语言结构方面的影响;点线表示在一些特征上的影响。再多加一些线,说明每个语言间的各种关系,将会使这个图变得太难看,而不可能使其更有用。语言的时间指明了第一个能用的实现出现的时间。例如,Algol 68 [Woodward,1974] 标出的是1977,而不是1968。

我从对于我的HOLP-2文章的极其发散的评论里——还有其他许多来源——得到了一个结论:对于一个程序设计语言实际上是什么,它被认定的主要用途是什么,都不存在某种统一意见。程序设计语言是一种指挥机器的工具?一种程序员之间交流的方式?一种表述高层设计的媒介?一种算法的记法?一种表述观念间关系的方式?一种试验工具?一种控制计算机化设备的途径?我的观点是,一个通用程序设计语言必须同时是所有这些东西,这样才能服务于它缤纷繁杂的用户集合。但也有唯一的一种东西,语言绝不能是——那将使它无法生存——它不能仅仅是一些“精巧”特征的汇集。

在这里观点的不同,实际上反映了有关计算机科学是什么,以及语言应该如何设计等方面的许多不同看法。计算机科学应该是数学的一个分支?或者工程的?或者建筑学的?或者艺术的?或者生物学的?或者社会学的?或者哲学的?换个说法,它是否从所有这些领域中借用了某些技术或者方法?我认为正是这样。

这也就意味着,语言的设计已经脱离了“纯粹的”和更抽象的学科,例如数学和哲学。为了更好地为其用户服务,一种通用程序设计语言必须是折中主义的,需要考虑到许多实践性的和社会性的因素。特别的,每种语言的设计都是为了解决一个特定问题集合里的问题,在某个特定时期,依据某个特定人群对问题的理解。由此产生了初始的设计。而后它逐渐成长,去满足新的要求,反映对问题以及对解决它们的工具和技术的新理解。这个观点是实际的,然而也不是无原则的。我始终不渝的信念是,所有成功的语言都是逐渐成长起来的,而不是仅根据某个第一原则设计出来的。原则是第一个设计的基础,也指导着语言的进一步演化。但无论如何,即使原则本身也同样是会发展的。

[2nd] see [Stroustrup,1991].

[Agha,1986] Gul Agha: An Overview of Actor languages. ACM SIGPLAN Notices. October 1986.

[Aho,1986] Alfred Aho, Ravi Sethi, and Jeffrey D. Ullman: Compilers: Principles, Techniques, and Tools. Addison-Wesley, Reading, MA. 1986. ISBN  0-201-10088-6.

[ARM] see [Ellis, 1990].

[Babcisky, 1984] Karel Babcisky: Simula Performance Assessment. Proc. IFIP WG2.4 Conference on System Implementation Languages:Experience and Assessment. Canterbury, Kent, UK. September 1984.

[Barton,1994] John J. Barton and Lee R. Nackman: Scientific and Engineering C++: An Introduction with Advanced Techniques and Examples. Addison-Wesley, Reading, MA. 1994. ISBN 0-201-53393-6.

[Birtwistle, 1979] Graham Birtwistle, Ole-Johan Dahl, Bjӧrn Myrhaug, and Kristen Nygaard: SIMULA BEGIN. Studentlitteratur, Lund, Sweden. 1979. ISBN 91-44-06212-5.

[Boehm, 1993] Hans-J. Boehm: Space Efficient Conservative Garbage Collection. Proc. ACM SIGPLAN’93 Conference on Programming Language Design and Implementation. ACM SIGPLAN Notices. June 1993.

[Booch, 1990] Grady Booch and Michael M. Vilot: The Design of the C++ Booch Components. Proc.OOPSLA’90. October 1990.

[Booch, 1991] Grady Booch: Object-Oriented Design. Benjamin Cummings, Redwood City, CA. 1991. ISBN 0-8053-0091-0.

[Booch, 1993] Grady Booch: Object-oriented Analysis and Design with Applications, 2nd edition. Benjamin Cummings, Redwood City,CA. 1993. ISBN 0-8053-5340-2.

[Booch, 1993b] Grady Booch and Michael M. Vilot: Simplify the C++ Booch Components. The C++ Report. June 1993.

[Budge, 1992] Ken Budge, J.S. Perry, and A.C. Robinson: High-Performance Scientific Computation using C++. Proc. USENIX C++ Conference.Portland, OR. August 1992.

[Buhr, 1992] Peter A. Buhr and Glen Ditchfield: Adding Concurrency to a Programming Language. Proc. USENIX C++ Conference.Portland, OR. August 1992.

[Call,1987] Lisa A. Call, et al.: CLAM - An Open System for Graphical User Interfaces. Proc. USENIX C++ Conference. Santa Fe, NM. November 1987.

[Cameron, 1992] Don Cameron, et al.: A Portable Implementation of C++ Exception Handling. Proc. USENIX C++ Conference. Portland,OR. August 1992.

[Campbell, 1987] Roy Campbell, et al.: The Design of a Multiprocessor Operating System. Proc. USENIX C++ Conference. Santa Fe, NM.November 1987.

[Cattell, 1991] Rich G.G. Cattell: Object Data Management: Object-Oriented and Extended Relational Database Systems. Addison-Wesley,Reading, MA. 1991. ISBN 0-201-53092-9.

[Cargill, 1991] Tom A. Cargill: The Case Against Multiple Inheritance in C++. USENIX Computer Systems. Vol 4, no 1, 1991.

[Carroll, 1991] Martin Carroll: Using Multiple Inheritance to Implement Abstract Data Types. The C++ Report. April 1991.

[Carroll, 1993] Martin Carroll: Design of the USL Standard Components. The C++ Report. June 1993.

[Chandy, 1993]  K. Mani Chandy and Carl Kesselman: Compositional C++:Compositional Parallel Programming. Proc. Fourth Workshop on Parallel Computing and Compilers. Springer-Verlag. 1993.

[Cristian, 1989] Flaviu Cristian: Exception Handling. Dependability of Resilient Computers, T. Andersen, editor. BSP Professional Books, Blackwell Scientific Publications, 1989.

[Cox,1986] Brad Cox: Object-Oriented Programming: An Evolutionary Approach. Addison-Wesley, Reading, MA. 1986.

[Dahl,1988] Ole-Johan Dahl: Personal communication.

[Dearle, 1990] Fergal Dearle: Designing Portable Applications Frameworks for C++. Proc. USENIX C++ Conference. San Francisco, CA. April 1990.

[Dorward, 1990] Sean M. Dorward, et al.: Adding New Code to a Running Program. Proc. USENIX C++ Conference. San Francisco, CA. April 1990.

[Eick, 1991] Stephen G. Eick: SIMLIB - An Object-Oriented C++ Library for Interactive Simulation of Circuit-Switched Networks. Proc. Simulation Technology Conference. Orlando, FL. October 1991.

[Ellis,1990] Margaret A. Ellis and Bjarne Stroustrup: The Annotated C++ Reference Manual. Addison-Wesley, Reading, MA. 1990.ISBN 0-201-51459-1.

[Faust, 1990] John E. Faust and Henry M. Levy: The Performance of an Object-Oriented Threads Package. Proc. ACM joint ECOOP and OOPSLA Conference. Ottawa, Canada. October 1990.

[Fontana, 1991] Mary Fontana and Martin Neath: Checked Out and Long Overdue:Experiences in the Design of a C++ Class Library. Proc.USENIX C++ Conference. Washington, DC. April 1991.

[Forslund, 1990] David W. Forslund, et al.: Experiences in Writing Distributed Particle Simulation Code in C++. Proc. USENIX C++ Conference.San Francisco, CA. April 1990.

[Gautron, 1992] Philippe Gautron: An Assertion Mechanism based on Exceptions. Proc. USENIX C++ Conference. Portland, OR. August 1992.

[Gehani, 1988] Narain H. Gehani and William D. Roome: Concurrent C++:Concurrent Programming With Class(es). Software—Practice & Experience. Vol 18, no 12, 1988.

[Goldberg, 1983] Adele Goldberg and David Robson: Smalltalk-80, The Language and its Implementation. Addison-Wesley, Reading, MA.1983. ISBN 0-201-11371-6.

[Goodenough, 1975] John Goodenough: Exception Handling: Issues and a Proposed Notation. Communications of the ACM. December 1975.

[Gorlen,1987] Keith E. Gorlen: An Object-Oriented Class Library for C++ Programs. Proc. USENIX C++ Conference. Santa Fe, NM.November 1987.

[Gorlen,1990] Keith E. Gorlen, Sanford M. Orlow, and Perry S. Plexico: Data Abstraction and Object-Oriented Programming in C++.Wiley. West Sussex. England. 1990. ISBN 0-471-92346-X.

[Hübel,1992] Peter Hübel and J.T. Thorsen: An Implementation of a Persistent Store for C++. Computer Science Department. Aarhus University, Denmark. December 1992.

[Ichbiah,1979] Jean D. Ichbiah, et al.: Rationale for the Design of the ADA Programming Language. SIGPLAN Notices Vol 14, no 6,June 1979 Part B.

[Ingalls,1986] Daniel H.H. Ingalls: A Simple Technique for Handlingh Multiple Polymorphism. Proc. ACM OOPSLA Conference. Portland,OR. November 1986.

[Interrante,1990] John A. Interrante and Mark A. Linton: Runtime Access to Type Information. Proc. USENIX C++ Conference. San Francisco 1990.

[Johnson, 1992] Steve C. Johnson: Personal communication.

[Johnson, 1989] Ralph E. Johnson: The Importance of Being Abstract. The C++ Report. March 1989.

[Keffer, 1992] Thomas Keffer: Why C++ Will Replace Fortran. C++ Supplement to Dr. Dobbs Journal. December 1992.

[Keffer, 1993] Thomas Keffer: The Design and Architecture of Tools.h++.The C++ Report. June 1993.

[Kernighan, 1976] Brian Kernighan and P.J. Plauger: Software Tools. Addison-Wesley, Reading, MA. 1976. ISBN 0-201-03669.

[Kernighan,1978] Brian Kernighan and Dennis Ritchie: The C Programming Language. Prentice-Hall, Englewood Cliffs, NJ. 1978. ISBN 0-13-110163-3.

[Kernighan, 1981] Brian Kernighan: Why Pascal is not my Favorite Programming Language. AT&T Bell Labs Computer Science Technical Report No 100. July 1981.

[Kernighan, 1984] Brian Kernighan and Rob Pike: The UNIX Programming Environment. Prentice-Hall, Englewood Cliffs, NJ. 1984. ISBN 0-13-937699-2.

[Kernighan, 1988] Brian Kernighan and Dennis Ritchie: The C Programming Language (second edition). Prentice-Hall, Englewood Cliffs, NJ. 1988. ISBN 0-13-110362-8.

[Kiczales,1992] Gregor Kiczales, Jim des Rivieres, and Daniel G. Bobrow: The Art of the Metaobject Protocol. The MIT Press. Cambridge, Massachusetts. 1991. ISBN 0-262-11158-6.

[Koenig, 1988] Andrew Koenig: Associative arrays in C++. Proc. USENIX Conference. San Francisco, CA. June 1988.

[Koenig, 1989] Andrew Koenig and Bjarne Stroustrup: C++: As close to C as possible - but no closer. The C++ Report. July 1989.

[Koenig,1989b] Andrew Koenig and Bjarne Stroustrup: Exception Handling for C++. Proc. “C++ at Work” Conference. November 1989.

[Koenig,1990] Andrew Koenig and Bjarne Stroustrup: Exception Handling for C++ (revised). Proc. USENIX C++ Conference. San Francisco,CA. April 1990. Also, Journal of Object-Oriented Programming.July 1990.

[Koenig, 1991] Andrew Koenig: Applicators, Manipulators, and Function Objects. C++ Journal, vol. 1, #1. Summer 1990.

[Koenig,1992] Andrew Koenig: Space Efficient Trees in C++. Proc. USENIX C++ Conference. Portland, OR. August 1992.

[Krogdahl,1984] Stein Krogdahl: An Efficient Implementation of Simula Classes with Multiple Prefixing. Research Report No 83. June 1984.University of Oslo, Institute of Informatics.

[Lea, 1990] Doug Lea and Marshall P. Cline: The Behavior of C++ Classes. Proc. ACM SOOPPA Conference. September 1990.

[Lea, 1991] Doug Lea: Personal Communication.

[Lea, 1993] Doug Lea: The GNU C++ Library. The C++ Report. June 1993.

[Lenkov,1989] Dmitry Lenkov: C++ Standardization Proposal. #X3J11/89-016.

[Lenkov, 1991] Dmitry Lenkov, Michey Mehta, and Shankar Unni: Type Identification in C++. Proc. USENIX C++ Conference. Washington,DC. April 1991.

[Linton,1987] Mark A. Linton and Paul R. Calder: The Design and Implementation of InterViews. Proc. USENIX C++ Conference. Santa Fe, NM. November 1987.

[Lippman, 1988] Stan Lippman and Bjarne Stroustrup: Pointers to Class Members in C++. Proc. USENIX C++ Conference. Denver, CO.October 1988.

[Liskov,1979] Barbara Liskov, et al.: CLU Reference manual. MIT/LCS/TR-225. October 1979.

[Liskov,1987] Barbara Liskov: Data Abstraction and Hierarchy. Addendum to Proceedings of OOPSLA’87. October 1987.

[Madsen, 1993] Ole Lehrmann Madsen, et al.: Object-Oriented Programming in the Beta Programming Language. Addison-Wesley, Reading,MA. 1993. ISBN 0-201-62430.

[McCluskey, 1992] Glen McCluskey: An Environment for Template Instantiation. The C++ Report. February 1992.

[Meyer,1988] Bertrand Meyer: Object-Oriented Software Construction.Prentice-Hall, Englewood Cliffs, NJ. 1988. ISBN 0-13-629049.

[Miller, 1988] William M. Miller: Exception Handling without Language Extensions. Proc. USENIX C++ Conference. Denver CO.October 1988.

[Mitchell, 1979] James G. Mitchell, et.al.: Mesa Language Manual. XEROX PARC, Palo Alto, CA. CSL-79-3. April 1979.

[Murray, 1992] Rob Murray: A Statically Typed Abstract Representation for C++ Programs. Proc. USENIX C++ Conference. Portland,OR. August 1992.

[Nelson, 1991] Nelson, G. (editor): Systems Programming with Modula-3. Prentice-Hall, Englewood Cliffs, NJ. 1991. ISBN 0-13-590464-1.

[Rose, 1984] Leonie V. Rose and Bjarne Stroustrup: Complex Arithmetic in C++. Internal AT&T Bell Labs Technical Memorandum. January 1984. Reprinted in AT&T C++ Translator Release Notes.November 1985.

[Parrington, 1990] Graham D. Parrington: Reliable Distributed Programming in C++. Proc. USENIX C++ Conference. San Francisco, CA.April 1990.

[Reiser, 1992] John F. Reiser: Static Initializers: Reducing the Value-Added Tax on Programs. Proc. USENIX C++ Conference. Portland,OR. August 1992.

[Richards, 1980] Martin Richards and Colin Whitby-Strevens: BCPL - the language and its compiler. Cambridge University Press, Cambridge,England. 1980. ISBN 0-521-21965-5.

[Rovner,1986] Paul Rovner: Extending Modula-2 to Build Large, Integrated Systems. IEEE Software Vol 3, No 6, November 1986.

[Russo, 1988] Vincent F. Russo and Simon M. Kaplan: A C++ Interpreter for Scheme. Proc. USENIX C++ Conference. Denver, CO. October 1988.

[Russo, 1990] Vincent F. Russo, Peter W. Madany, and Roy H. Campbell: C++ and Operating Systems Performance: A Case Study.Proc. USENIX C++ Conference.  San Francisco, CA. April 1990.

[Sakkinen,1992] Markku Sakkinen: A Critique of the Inheritance Principles of C++. USENIX Computer Systems, vol 5, no 1, Winter 1992.

[Sethi, 1980] Ravi Sethi: A case study in specifying the semantics of a programming language. Seventh Annual ACM Symposium on Principles of Programming Languages. January 1980.

[Sethi, 1981] Ravi Sethi: Uniform Syntax for Type Expressions and Declarators. Software - Practice and Experience, Vol 11. 1981.

[Sethi, 1989] Ravi Sethi: Programming Languages - Concepts and Constructs. Addison-Wesley, Reading, MA. 1989. ISBN 0-201-10365-6.

[Shopiro, 1985] Jonathan E. Shopiro: Strings and Lists for C++. AT&T Bell Labs Internal Technical Memorandum. July 1985.

[Shopiro, 1987] Jonathan E. Shopiro: Extending the C++ Task System for Real-Time Control. Proc. USENIX C++ Conference. Santa Fe,NM. November 1987.

[Shopiro,1989] Jonathan E. Shopiro: An Example of Multiple Inheritance in C++: A Model of the Iostream Library. ACM SIGPLAN Notices. December 1989.

[Schwarz,1989] Jerry Schwarz: Iostreams Examples. AT&T C++ Translator Release Notes. June 1989.

[Snyder, 1986] Alan Snyder: Encapsulation and Inheritance in Object-Oriented Programming Languages. Proc. OOPSLA’86. September 1986.

[Stal,1993] Michael Stal and Uwe Steinmüller: Generic Dynamic Arrays. The C++ Report. October 1993.

[Stepanov,1993] Alexander Stepanov and David R. Musser: Algorithm-Oriented Genric Software Library Development. HP Laboratories Technical Report HPL-92-65. November 1993.

[Stroustrup,1978] Bjarne Stroustrup: On Unifying Module Interfaces. ACM Operating Systems Review Vol 12 No 1. January 1978.

[Stroustrup,1979] Bjarne Stroustrup: Communication and Control in Distributed Computer Systems. Ph.D. thesis, Cambridge University, 1979.

[Stroustrup,1979b] Bjarne Stroustrup: An Inter-Module Communication System for a Distributed Computer System. Proc. 1st International Conf. on Distributed Computing Systems. October 1979.

[Stroustrup,1980] Bjarne Stroustrup: Classes: An Abstract Data Type Facility for the C Language. Bell Laboratories Computer Science Technical Report CSTR-84. April 1980. Revised, August 1981.Revised yet again and published as [Stroustrup, 1982].

[Stroustrup, 1980b] Bjarne Stroustrup: A Set of C Classes for Co-routine Style Programming. Bell Laboratories Computer Science Technical Report CSTR-90. November 1980.

[Stroustrup,1981] Bjarne Stroustrup: Long Return: A Technique for Improving The Efficiency of Inter-Module Communication. Software Practice and Experience. January 1981.

[Stroustrup,1981b] Bjarne Stroustrup: Extensions of the C Language Type Concept. Bell Labs Internal Memorandum. January 1981.

[Stroustrup,1982] Bjarne Stroustrup: Classes: An Abstract Data Type Facility for the C Language. ACM SIGPLAN Notices. January 1982. Revised version of [Stroustrup, 1980].

[Stroustrup,1982b] Bjarne Stroustrup: Adding Classes to C: An Exercise in Language Evolution. Bell Laboratories Computer Science internal document. April 1982. Software: Practice & Experience, Vol 13. 1983.

[Stroustrup,1984] Bjarne Stroustrup: The C++ Reference Manual. AT&T Bell Labs Computer Science Technical Report No 108. January 1984. Revised, November 1984.

[Stroustrup,1984b] Bjame Stroustrup: Operator Overloading in C++. Proc. IFIP WG2.4 Conference on System Implementation Languages: Experience & Assessment. September 1984.

[Stroustrup,1984c] Bjarne Stroustrup: Data Abstraction in C. Bell Labs Technical Journal. Vol 63, No 8. October 1984.

[Stroustrup,1985] Bjarne Stroustrup: An Extensible I/O Facility for C++. Proc. Summer 1985 USENIX Conference. June 1985.

[Stroustrup,1986] Bjarne Stroustrup: The C++ Programming Language. Addison-Wesley, Reading, MA. 1986. ISBN 0-201-12078-X.

[Stroustrup,1986b] Bjarne Stroustrup: What is Object-Oriented Programming? Proc. 14th ASU Conference. August 1986. Revised version in Proc. ECOOP’87, May 1987, Springer Verlag Lecture Notes in Computer Science Vol 276. Revised version in IEEE Software Magazine. May 1988.

[Stroustrup,1986c] Bjarne Stroustrup: An Overview of C++. ACM SIGPLAN Notices. October 1986.

[Stroustrup,1987] Bjarne Stroustrup: Multiple Inheritance for C++. Proc. EUUG Spring Conference, May 1987. Also, USENIX Computer Systems, Vol 2 No 4. Fall 1989.

[Stroustrup,1987b] Bjarne Stroustrup and Jonathan Shopiro: A Set of C classes for Co-Routine Style Programming. Proc. USENIX C++ Conference. Santa Fe, NM. November 1987.

[Stroustrup,1987c] Bjarne Stroustrup: The Evolution of C++: 1985-1987. Proc. USENIX C++ Conference. Santa Fe, NM. November 1987.

[Stroustrup,1987d] Bjarne Stroustrup: Possible Directions for C++. Proc. USENIX C++ Conference. Santa Fe, NM. November 1987.

[Stroustrup,1988] Bjarne Stroustrup: Type-safe Linkage for C++. USENIX Computer Systems, Vol 1 No 4. Fall 1988.

[Stroustrup,1988b] Bjarne Stroustrup: Parameterized Types for C++. Proc. USENIX C++ Conference, Denver, CO. October 1988. Also, USENIX Computer Systems, Vol 2 No 1. Winter 1989.

[Stroustrup,1989] Bjarne Stroustrup: Standardizing C++. The C++ Report. Vol 1 No 1. January 1989.

[Stroustrup,1989b] Bjarne Stroustrup: The Evolution of C++: 1985-1989. USENIX Computer Systems, Vol 2 No 3. Summer 1989. Revised version of [Stroustrup, 1987c].

[Stroustrup,1990] Bjarne Stroustrup: On Language Wars. Hotline on Object-Oriented Technology. Vol 1, No 3. January 1990.

[Stroustrup,1990b] Bjarne Stroustrup: Sixteen Ways to Stack a Cat. The C++ Report. October 1990.

[Stroustrup,1991] Bjarne Stroustrup: The C++ Programming Language (2nd edition). Addison-Wesley, Reading, MA. 1991. ISBN 0-201-53992-6.

[Stroustrup,1992] Bjarne Stroustrup and Dmitri Lenkov: Run-Time Type Identification for C++. The C++ Report. March 1992. Revised version:Proc. USENIX C++ Conference. Portland, OR. August 1992.

[Stroustrup,1992b] Bjarne Stroustrup: How to Write a C++ Language Extension Proposal. The C++ Report. May 1992.

[Stroustrup,1993] Bjarne Stroustrup: The History of C++: 1979-1991. Proc. ACM History of Programming Languages Conference (HOPL-2). April 1993. ACM SIGPLAN Notices. March 1993.

[Taft, 1992] S. Tucker Taft: Ada 9X: A Technical Summary. CACM. November 1992.

[Tiemann, 1987] Michael Tiemann:“Wrappers:Solving the RPC problem in GNU C++. Proc. USENIX C++ Conference. Denver, CO. October 1988.

[Tiemann, 1990] Michael Tiemann: An Exception Handling Implementation for C++. Proc. USENIX C++ Conference. San Francisco, CA. April 1990.

[Weinand, 1988] Andre Weinand, et al.: ET++ - An Object-Oriented Application Framework in C++. Proc.OOPSLA’88. September 1988.

[Wikstrӧm, 1987] Åke Wikstrӧm:Functional Programming in Standard ML.Prentice-Hall, Englewood Cliffs, NJ. 1987. ISBN 0-13-331968-7.

[Waldo,1991] Jim Waldo: Controversy: The Case for Multiple Inheritance in C++. USENIX Computer Systems, vol 4, no 2, Spring 1991.

[Waldo, 1993] Jim Waldo (editor): The Evolution of C++. A USENIX Association book. The MIT Press, Cambridge, MA. 1993. ISBN 0-262-73107-X.

[Wilkes, 1979] M.V. Wilkes and R.M. Needham: The Cambridge CAP Computer and its Operating System. North-Holland, New York. 1979. ISBN 0-444-00357-6.

[Woodward, 1974] P.M. Woodward and S.G. Bond: Algol 68-R Users Guide. Her Majesty’s Stationery Office, London. 1974. ISBN 0-11-771600-6.


相关图书

CMake构建实战:项目开发卷
CMake构建实战:项目开发卷
代码审计——C/C++实践
代码审计——C/C++实践
C++ Templates(第2版)中文版
C++ Templates(第2版)中文版
C/C++代码调试的艺术(第2版)
C/C++代码调试的艺术(第2版)
计算机图形学编程(使用OpenGL和C++)(第2版)
计算机图形学编程(使用OpenGL和C++)(第2版)
Qt 6 C++开发指南
Qt 6 C++开发指南

相关文章

相关课程