以前翻译的一本C++的书,还不错

ANSI/ISO C++ Professional Programmer's Handbook

Contents


1

简介

by Danny Kalev

面向对象的程序设计可以回朔到60年代:类,继承和虚拟成员函数作为 Simula67的一个完整部分,一种主 要用来写事件驱动仿真的程序语言。当Smalltalk第一次在1972年再次出现时它提供了一种纯粹的面向对象 的程序设计环境。事实上,Smalltalk 定义了面向对象的程序设计。这种程序设计的风格在当时是如此的创 新和具有革命性使得它花了10年才使自己成为软件工业的标准。无庸置疑地,80年代初期C++的出现为这次 革命作了主要的贡献。

C++的起源

1979年,Bell (现在的 AT&T)实验室 Labs的一位年轻工程师, Bjarne Stroustrup,开始了扩展C的 实验,为了使C成为实现大规模工程的更好的工具。在当时一个工程平均由数万行代码组成(LOClines of code )


注意: 今天微软的Windows 2000 (以前的 NT 5.0) 由多于三千万行代码组成。


当工程超过100,000 行代码时,C的缺点变的十分明显让人无法接受。在其他事情中,有效的团队开发基于一种在自己的工作中引用他人成果以简化自己工作的能力——一种很难在C中完成的事情。

带类的C

通过在C中增加类,新的合成语言——“C with classes”——能提供更好的对封装和信息隐藏的支持。提供了在其内部实现(更可能改变的部分)和他的外部接口之间的明显的分离。一个类对象有通过其构造器确定的确定的状态,并且它还将数据和处理数据的方法捆绑的一起。

进入C++

到了1983, 许多改变和扩展已经被加到带类的C中。在那个时期“C++”这个名字被提出了。于是从那时到 现在,++后缀变成类面向对象的同义词。(Bjarne Stroustrup 如果注册++这个商标,他将大赚一笔。) 也是在那个时期C++首次在AT&T Labs之外被应用。用户的数量每几个月增加一倍——也包括语言的编译 器和扩展工具。

80年代后期:开放导致的泛滥

19851989, C++经历了主要的发展。保护成员,保护继承,模板和稍微有点争议的多继承加到语言中。很明显C++需要标准。

ANSI委员会标准的建立

1989, American National Standards Institution (ANSI)委员会的C++的标准建立了。 委员会的官方名字是X3J16,之后变成了J16。一般的,标准化委员会不会从空开始起草标准;他们宁愿采纳一份事实上存在的参考,然后使用它作为基础。ANSI C 委员会使用The C Programming LanguageKernighan Ritchie)作为起点。同样的ANSI C++ 委员会使用Annotated C++ Reference ManualARM作者Ellis Stroustrup)作为起基础文档。ARM 提供了一个清晰详细的委员会工作的起点。委员会的政策不是要突击建立一份在一两年后就过时的草案。相反的,政策是允许来自使用C++的团体的需求来改变它。虽然如此,委员会也发起可扩展的关于语言的修正和改变,比如runtime type information (RTTI执行期类型信息)和新的运算符。

成熟

到那时为止,上十万人使用C++C++编译器在每一个平台上实现。新的C++-基于frameworks,象MFCOWL已出现了。委员会不得不面对来自几个方面的压力。一些组织提倡一些从别的面向对象语言借用来的新特性和扩展,同时另一些团体以可能的有效方式要求保持标准。另外,C++还必须保持和C的兼容性,包括对8种不同风格的支持:完整类型申明,讨厌的指针语法,结构,共用体,全局函数和许多其他的不是严格按面向对象程序设计步骤的特性。

国际性的标准

C++ 的标准是所有国家标准化团体共同努力的结果。这不同于C的标准化。C标准化最初被ANSI 作为一个美国标准公布,然后被国际标准化组织ISO)添加了一些扩展(主要是国际化的问题)后作为一个国际标准采用。C++的国际化投入保证了这是一个在世界范围内广泛承认的标准,虽然在利益方面有一些复杂的关系(at the price of somewhat more complicated procedures)。因此,委员会的会议实际上是ANSI工作组和ISO工作组的联合会议。职务上,ANSI工作组作为ISO的顾问而工作。所以,在每一个技术问题上都有两种建议:ANSI的建议、用来指出ANSI的推荐,和后来的ISO的建议,来作出实际的 决定。一些重要的改变是为了符合ISO批准的标准,包括增加一种内建类型wchar_tiostream库的模板化, string的模板化,和locale library的介绍。这些都是为了封装基于文化的差别。

委员会的草案和公众的评论

委员会最初的工作是产生一份草案,作为Committee Draft (CD)发表。为了这个目的,委员会一年中在世界的不同地方召开三次为期一个周的会议。 就象来自ISO的注释,第一份CD收到了许多不赞成的意见。委员会 决定了这些技术上的问题并且在第二版中标上为这些地方标上注释。第二份CDISO批准了;然而仍然有5个 反对意见,并伴随着注释。经过ISO的投票,CD向公众公布。公众评论的过程开始了来自全世界的C++程序员对待审定的CD的评论以及对其矛盾和冗长之处的指出。

标准的锁定和最终化(Feature Freeze and Finalization

199611月批准第二版CD之后,委员会的主要任务是答复那5个反对票以及伴随其的注解,然后将其变为赞同票。最后的文件是Final Draft International StandardFDIS,国际标准最终草案)。199711月在 Morristown, New Jersey 举行的会议上FDIS被标准化委员会一致通过。1998年经过一些微小的变化之后,ISO批准了FDIS,使其成为一个国际化的标准。按ISO的惯例在标准发布后,5年内将不会被修改,除了对错误 的修改。若发现错误后,你可以向委员会提交一份关于你的发现的Defect Report

不同于其他面向对象语言的C++

C++ 在许多方面和其他面向对象语言不同。例如,C++不是一种root-based语言,它也不是在虚拟机上运行的。这些不同显著的扩大了C++的应用范围。

对以前系统的向后兼容性

以前的C代码能被容易转化为新的C++代码,这是C++的主要优点。从CC++的移植不会迫使你丢弃任何优秀 的C代码。许多商业化的frameworks,甚至C++自己的标准库中的一些组件是由包装在面向接口的传统的C组成 的。

性能

解释语言允许简单的代码输入,但可是代价是重要的性能开销。另一方面 C++使用它从 C继承来得编译和链 接模型。C++设计者的一个目标就是尽可能的保持它的高效;编译-连接模型可以代码的生成和优化非常有效 。另外一个影响性能的因素是使用垃圾收集器。这个特性是唾手可得而且垃圾收集器可以阻止一些常见的语 法错误;然而,有垃圾收集器的语言在那些限制十分严格的时间限制(time-critical) 程序开发环境中是 无法使用的。由于这个原因,C++没有一个垃圾收集器。

面向对象化和其他有用的范例(Paradigms

出面向对象的程序设计之外, C++支持其他有用的程序设计风格,包括过程化的程序设计,基于对象的程序 设计,泛型程序设计——使C++成了一种多范例(multi-paradigm),多用途(general-purpose)的程序设计语言。

过程化的程序设计

过程化的程序设计今天并不很流行。然而,有很充分的理由使C++在今天仍支持这种风格。

C程序员过度到C++程序员

C程序员到C++的第一部不是要被迫抛弃他的所有的专长。许多原始和基础的C++概念是从C继承来的,包括内建运算符和基本类型,指针动态内存分配的概念,头文件,预处理等等。在短时期内,向C++转型的C程序员可以继续工作。

两种语言混合的环境

C++ C 代码可以一起工作。在确定的条件下,这种混合是协调和有效的。

自动产生代码

许多软件工具和代码生成器可以产生作为应用程序中间舞台的C代码。例如,大部分关系数据库的SQL查询 被翻译成C代码,然后在被编译、连接。当生成的代码不是被程序员使用时,强迫这些生成器产生 C++代码 (虽然一些已经那么做了)不需要该很多地方。此外,许多早期的C++编译器并不是真真意义上的C++编译器;他们更象是翻译器,因为他们将C++代码翻译成C代码,然后在编译、连接。事实上,任何有效的C++程序可以直 接翻译成纯粹的C代码。

面向对象的程序设计

这是被广泛使用的C++编程风格。这本书的目的就是为生成有效、可靠的、可重用的、易维护的面向对象的 代码给予程序员有用的指导和规则。但是没有通用的OO的真谛;OO的定义在学校、语言、用户之间变化。然而 ,一个关于这一通用概念的共识——一个封装、信息隐藏、多态、动态绑定和继承的联合体。高级 面向对象技术主要由泛型程序设计和多继承组成。一些概念将在后续章节中深入讨论。

泛型程序设计

泛型程序设计在可重用能力方面开始了超越面向对象的程序设计的第一步。C++的两个重要特性,模板和运 算符重载是泛型程序设计的基础。STL,泛型算法和容器的集合,可能是泛型给人印象最深的形式。

本书的目标

本书瞄准那些为了提高他们设计和编程熟练度的有丰富经验的C++开发者。它揭露事实和技术,并且为高级 的、适应标准的、有效率的使用 C++提供一个知识库。另外,本书也解释在语言高层特性之下的机制,并且解 释C++设计和演化之下的体系。

读者对象

读者对象是想通过获得新的设计技术和设计模式以增加他们的熟练程度的中级、高级C++开发者。在增加许 多新的特性到这种语言的基础上,标准化委员会声明不赞成一些特性和库组件。在这本书中,想开发长久的 ,适用于未来的C++软件的读者可以发现一个广泛的不赞成的特性和推荐作为替换选项的列表。

本书的结构

第二章, “标准简报:ANSI/ISO C++最新的附件,提供一些 在C++标准中使用的关键术语,和那 些是在本书中广泛地使用的。在这之后,将讲述最近的C++的改变和扩展。最后,第二章将给出在标准中列出 的反对的特性的总揽,并且给出符合标准的他们的替换。

第三章, "运算符重载," 探索了好处以及运算符重载可能带来的问题。它讨论了应用与运算符重载 的限制,以及解释了如何转化运算符。

第四章,“特殊的成员函数:默认构造器,拷贝构造器,销毁器,赋值运算符,解释了特殊成员函 数的语法和他们在类设计中的角色。它也示范了一些有效使用特殊成员函数的技术和指导方针。

第五章, "面向对象的编程和设计,"提供一个通过 C++支持的多样的程序设计风格的纵览,重点 是面向对象设计和程序设计的原理。

第六章, "异常处理," 先讲述了传统的错误处理的方法和其缺点,然后引出了标准的错误处理。提 供了一个历史上的异常处理设计的摘要,然后讨论异常的关联处理的性能问题。

第七章, "运行时类型识别,"讨论了RTTI(运行时类型识别)的三个组件:typeid,dynamic_cast和类的type_info。另外,解释了什么时候必须使用RTTI。 最后,讨论了RTTI的性能开销。

第八章, "命名空间,"阐明语言的命名空间增加部分后面的基本原理和命名空间解决的问题。然后示 范了实际中命名空间如何使用,以及命名空间和其他特性的相互影响。

第九章, "模板," 讨论了设计的多样化和实现模板,包括类模板,函数模板和需要专门关注的模板 问题(比如指向成员的指针,模板类的虚拟成员函数,和显式的实例化)。

第十章, "STL和泛型程序设计," 是标准模板库(Standard Template Library STL)和一般泛型程 序设计的介绍。它讨论了泛型程序设计的法则,重点是作为泛型程序设计的规范frameworkSTL。这一章也介 绍STL组件的使用:容器、算法(algorithms)、迭代子(algorithms)、分配运算符、适配器(adapters) 、绑定者(binders)、和函数对象。对使用最广泛的STL组件,std::vectorstd::string,作深入的探索。

第十一章, "内存管理," 解释了C++的对象模型。讨论了三种数据存储类型:静态、自动、自由存储。这一章也深入探讨了了运算符new delete的语法,和他们的底层实现。另外,示范了高级内存管理技术的用法,和指导你避免一般的与内存有关的错误。

第十二章, "优化你的代码," 专注与代码的优化。这章提供了写出更有效代码的有用的指导的技巧,并且它向为了使空间级小和加速运行时速度的更有作为的最优化技术取的效果。

第十三章, "C语言的兼容性问题,"示范了如何移植C代码到C++代码,特别是过程化程序设计到面向 对象程序设计。它列出了C++C字集和ISO C的区别。最后,深入探讨了C++对象在内存中的底层表示和对象和 C 结构的兼容性。

第十四章, "总结和未来的方向," 结束了本书。本章讲述了贯穿与过去二十年C++设计和发展中的法则和指导方针,并且将C++与少数的成功的其他程序设计语言的发展。然后,列举了进入标准所有特性。之后,讨论了未来可能的扩展,包括自动化垃圾收集,持久对象和并发性。其他假定的并讨论的未来的扩展有:动态连接库、基于规则的程序设计(rule-based programming)和可扩展的成员函数。


Contents

© Copyright 1999, Macmillan Computer Publishing. All rights reserved.

翻译:Sttony,2001.9.29

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值