C++精髓与特点

上传人:wan****g1 文档编号:146720651 上传时间:2022-08-31 格式:DOCX 页数:11 大小:31.88KB
收藏 版权申诉 举报 下载
C++精髓与特点_第1页
第1页 / 共11页
C++精髓与特点_第2页
第2页 / 共11页
C++精髓与特点_第3页
第3页 / 共11页
资源描述:

《C++精髓与特点》由会员分享,可在线阅读,更多相关《C++精髓与特点(11页珍藏版)》请在装配图网上搜索。

1、再论C+精髓与特点1. C卄语言基本概述1.1C语言与C+的历史C+是从C语言演变而来的,而C语言又是从两个编程语言BCPL和B演变而来的BCPL是MartinRichards于1967年开发的,用于编写操作系统软件和编译器。KenThompson在他的B语言(1970年在贝尔实验室)。DCPL和B都是“无类型”语言,每个数据项在内存中占一个“字”(word)长、如果要将数据项作为整数或实数处理,编程的工作量会很大。C语言是从D语言演变而成的,由贝尔实验室的DennisRitchie开发,最初于1972年在DECPDP11计算机上实现。C语言使用了BCPL和B的许多重要概念,同时增加了数据类型

2、和其他特性。C语言最初作为UNIX操作系统的开发语言而闻名于世。如今,大多数操作系统都是用C/C+写成的。二十多年来,C语言已经遍布在大多数计算机上。C语言是硬件无关的,只要仔细设计。就可以编写能移植列大多数计算机上的C语言程序。到20世纪70年代未期,C语言演变成现在所谓的“传统C”、“经典CPP或“Kernighan/RitchieC。1978年PrenticeHall公司出版了Kernighan和Ritchie合作的著作TheCProgrmmmingLanguage,引起了人们对C语言的广泛关注(见参考文献Ke78)。C语言在各种不同类型计算机(有时称为硬件平台)上的普及导致了许多变形。

3、它们虽然相似,但通常互不兼容。对需要为不同平台编写可移植程序的开发人员.这是个严重问题,显然需要有个标准的C语言版本。1983年,美国国家计算机与信息处理标准委员会(x3)成立了X3JII技术分会,目的是提供无歧义性且与机器无关的语言定义。1989年推出了这种语言标准。AN5I与国际标准化组织(ISO)合作在全球范围内将C语言标淮化,1990年推出了联合标准文档.称为ANSI/IS09899:1990。这个文档可以从ANSI获得副本。1988年推出的Kernighan和Ritchie著作的第二版体现了该版本(称为ANSIC),这也是目前全世界使用的版本。1.1.1可移植性提示由于c语言是标准化

4、、硬件无关、广为使用的语言,因此用C语言编写的应用程序通常只要稍作修改或不经修改即可在多种不同的计算机系统中运行。C+是C语言的扩展,是20世纪80年代初由贝尔实验室的Bjarnestroustrup开发的。C+的许多特性是从c语言中派生的,但更重要的是,它提供了面向对象编程(object-orientedprogramming)的功能。软件业正在酝酿一场革命,最终日标是更快、更正确、更经济地建立软件,新的、更强大的软件需求迫在眉睫。对象(object)实际上是模拟实际项目的可复用软件组件(component)。软件开发人员发现,利用模块化、面t向对象的设计和实现方法与过去结构化编程方法相比较

5、,可以使软件开发小组的生产率更高。面向对象编程的优势在于更容易理解、纠正和修改。许多面向对象的语言也纷纷涌现,包括最著名的由Xerox的PaloAlto研究中心(PARC)开发的smalltalk。Smalltalk是纯粹的面向对象的语言,其所有的编程元素都是“对象”。C+则是一种“混合型语言“,可以用C语言方式、面向对象方式或兼用两种方式进行编程。1.2 面向对象程序设计的基本思想1.2.1抽象在面向对象中的作用什么是抽象?一般地讲,抽象是通过从特定的实例中抽取共同的性质以形成一般化的概念的过程。抽象是对某个系统的简化的描述,即强调了该系统中的某些特性,而忽略了一部分细节。对系统进行抽象的描

6、述称为对它的规范说明,对抽象的解释称为它的实现。抽象是具有层次的,可分高层次抽象和低层次抽象两大类。高层次抽象将其低层次抽象作为它的一种实现。面向对象的原理有4个:数据抽象,行为共享,进化和确定性,它概括了面向对象计算的本质。1)数据抽象为程序员提供了一种对数据和为操作这些数据所需要的算法的抽象。具有的模块化和信息隐藏是相互独立的又是密切相关的。2)行为共享支持行为共享是面向对象程序设计的第二个原理。行为是数据抽象引进的概念,行为是由实体的外部接口进行定义的,行为共享是指许多实体具有相同的接口,这将增加系统的灵活性。3)进化是面向对象的第三个原理。它考虑到实际中的需求会很快地发生变化,面向对象

7、的方法要支持进化过程就是要适应可能发生的不断变化,这就是需求进化。进化的另一个方面是进化式的问题求解,这种观点是从开始到最终结果是以一种增量的方法逐步地对问题进行求解的,特别是对于最终目标不能很好定义的问题,这种方法更具有吸引力。过化的问题将涉及到一个系统从开始直到后续的维护这一整个生命期。4)确定性是用于描述一个系统确定的行为。一个确定的系统应该确保其中每个行为项都有一个确切的解释,系统不会因不能响应某一行为而失败。2. C+语言成功的所在2.1为什么C+会成功C+能够如此成功,部分原因是它的目标不只是为了将C语言转变成00P语言(虽然这是最初的目的),而且还为了解决当今程序员,特别是那些在

8、C语言中已经大量投资的程序员所面临的许多问题。人们已经对00P语言有了这样传统的看法:程序员应当抛弃所知道的每件事情并且从一组新概念和新文法重新开始,他应当相信,最好丢掉所有来自过程语言的老行装。从长远角度看,这是对的。但从短期角度看,这些行装还是有价值的。最有价值的可能不是那些已存在的代码库(给出合适的工具,可以转变它),而是已存在的头脑库。作为一个职业C程序员,如果让他丢掉他知道的关于C的每一件事,以适应新的语言,那么,几个月内,他将毫无成果,直到他的头脑适应了这一新范例为止。如果他能调整已有的C知识,并在这个基础上扩展,那么他就可以继续保持高效率,带着已有的知识,进入面向对象程序设计的世

9、界。因为每个人有他自己的程序设计模型,所以这个转变是很混乱的。因此,C+成功的原因是经济上的:转变到00P需要代价,而转变到C+所花的代价较小。C+的目的是提高效率。效率取决于很多东西,而语言是为了尽可能地帮助使用者,尽可能不用武断的规则或特殊的性能妨碍使用者。C+成功是因为它立足于实际:尽可能地为程序员提供最大便利。2.2.1 采用渐进的学习方式与学习新语言有关的问题是效率的问题。所有公司都不可避免地因软件工程师学习新语言而突然降低了效率。c+是对c的扩充,而不是新的文法和新的程序设计模型。程序员学习和理解这些性能,逐渐应用并继续创建有用的代码。这是c+成功的最重要的原因之一。另外,已有的C

10、代码在C+中仍然是有用的,但因为C+编译器更严格,所以,重新编译这些代码时,常常会发现隐藏的错误。2.2.2 运行效率有时,以程序执行速度换取程序员的效率是值得的。假如一个金融模型仅在短期内有用,那么快速创建这个模型比所写程序能更快速执行重要。很多应用程序都要求有一定的运行效率,所以C+在更高运行效率时总是犯错。C程序员非常重视运行效率,这让他们认为这个语言不太庞大,也不太慢。产生的代码运行效率不够时,程序员可以用C+的一些性能做一些调整。C+不仅有与C相同的基本控制能力(和C+程序中直接写汇编语言的能力),非正式的证据指出,面向对象的C+程序的速度与用C写的程序速度相差在土10%之内,而且常

11、常更接近。用00P方法设计的程序可能比C的对应版本更有效。2.2.3 系统更容易表达和理解为适合于某问题而设计的类当然能更好地表达这个问题。这意味着写代码时,程序员是在用问题空间的术语描述问题的解(例如“把锁链放在箱子里”),而不是用计算机的术语,也就是解空间的术语,描述问题的解(例如“设置芯片的一位即合上继电器”)。程序员所涉及的是较高层的概念,一行代码能做更多的事情。易于表达所带来的另一个好处是易于维护。据报道,在程序的整个生命周期中,维护占了花费的很大部分。如果程序容易理解,那么它就更容易维护,还能减少创建和维护文档的花费。2.2.4“库”使你事半功倍创建程序的最快方法是使用已经写好的代

12、码:库。C+的主要目标是让程序员能更容易地使用库,这是通过将库转换为新数据类型(类)来完成的。引入一个库,就是向该语言增加一个新类型。编译器负责这个库如何使用,保证适当的初始化和清除,保证函数被正确地调用,因此程序员的精力可以集中在他想要这个库做什么,而不是如何做上。因为程序的各部分之间名字是隔离的,所以程序员想用多少库就用多少库,不会有像c语言那样的名字冲突。模板的源代码重用一些重要的类型要求修改源代码以便有效地重用。模板可以自动完成对代码的修改,因而是重用库代码特别有用的工具。用模板设计的类型很容易与其他类型一起工作。因为模板对程序员隐藏了这类代码重用的复杂性,所以特别好用。2.2.5大程

13、序设计许多传统语言对程序的规模和复杂性有自身的限制。例如,BASIC对于某些类型的问题能很快解决,但是如果这个程序有几页纸长,或者超出该语言的正常解题范围,那么它可能永远算不出结果。C语言同样有这样的限制,例如当程序超过50000行时,名字冲突就开始成为问题。简言之,程序员用光了函数和变量名。另一个特别糟糕的问题是如果C语言中存在一些小漏洞错误藏在大程序中,要找出它们是极其困难的。没有清楚的文字告诉程序员,什么时候他的语言会失效,即便有,他也会忽视它们。他不说“我的BASIC程序太大,我必须用C重写”,而是试图硬塞进另外几行,增加额外的性能。所以额外的花费就悄悄增加了。设计C+的目的是为了辅助

14、大程序设计,也就是说,去掉小程序和大程序之间复杂性的分界。当程序员写hello-world类实用程序时,他确实不需要用00P、模板、名字空间和异常处理,但当他需要的时候,这些性能就有用了。而且,编译器在排除错误方面,对于小程序和大程序一样有效。2.2 减少程序设计问题的复杂性在00P中,方法学是一个有许多实践的领域。因此,在程序员考虑采用某一方法之前,了解该方法将要解决的问题是很重要的。对于C+,有一点是确实的:它本身就是希望减少程序表达的复杂性。从而不必用更复杂方法学。对于用过程语言的简单方法所不能处理的大型问题,在C+中用一些简单的方法就足够了。认识到“方法学”一词含义太广是很重要的。实际

15、上,设计和编写程序时,无论做什么都在使用一种方法。只不过因为它是程序员自己的方法而没有意识到。但是,它是程序员编程中的一个过程。如果过程是有效的,只需要用c+做很小的调整。如果程序员对他的效率和调整程序的方法不满意,他可以考虑采用一种更正式的方法。2.2.1复杂性为了分析复杂性,先假设:程序设计制定原则来对付复杂性。原则以两种方式出现,每种方式都被单独检查。1) 内部原则体现在程序自身的结构中,机灵而有见解的程序员可以通过程序设计语言的表达方式了解这种内部原则。2) 外部原则体现在程序的源信息中,一般被描述为“设计文档”(不要与产品文档混淆)。我认为,这两种形式的原则互相不一致:一个是程序的本

16、质,是为了让程序能工作而产生演化的,另一个是程序的分析,为了将来理解和维护程序而产生的。创建和维护都是程序生命期的基本组成部分。有用的程序设计方法把两者综合为最合适的方式,而不偏向任何一方。2.2.2内部原则程序设计的演化(C+只是其中的一步)从程序设计模型强加于内部开始,也就是允许程序员为内存位置和机器指令取别名。命名子程序的创建和支持子程序库的连接技术在50年代向前飞跃发展,并且孕育出了两个语言,它们在当时产生了巨大冲击,这就是为科学工作者使用的F0RTRAN(FORmula-TRANslation)和为商业者使用的C0B0L(COmmonBusiness-OrientedLanguage

17、)。纯计算机科学中很成功的语言是Lisp(List-Processing),而面向数学的语言应当是APL(AProgrammingLanguage)。然而,最终考虑两个因素:复杂性的管理和维护。即这种语言首先是为某一领域开发的,而程序员又不愿花很长时间来熟悉这门语言,其结果只能使程序越来越长,使手头的问题屈服于语言。界限是模糊的:谁能说什么时候您的语言会使您失望呢?这不是马上就出现的。问题的解开始变长,并且对于程序员更具挑战性。为了知道语言大概的限制,你得更聪明,这种聪明变成了一种标准,也就是“为了使该语言工作而努力”。这似乎是人类的操作方式,而不是遇到缺陷就抱怨,并且不再称它为缺陷。最终,程

18、序设计问题对于求解和维护变得太困难了,即求得的解太昂贵了。人们最终明白了,程序的复杂性超出了我们能够处理的程度。尽管一大类程序设计要求开发期间去做大部分工作并创建要求最小维护的解(或者简单地丢掉这个解,或者用不同的解替换它),但这只是问题的一部分。一般情况是,我们把软件看作是为人们提供服务的工具。如果用户的需要变化C+编程思想了,服务就必须随着变化。这样,当第一版本开始运行时,项目并没有结束。项目是一个不断进化的生命体。程序的更新变成了一般程序设计问题的一个部分。2.2.3外部原则为了更新和改善程序,需要更新思考问题的方法。它不只是“我们如何让程序工作”,而是“我们如何让程序工作并且使它容易改

19、变”。这里就有一个新问题:当我们只是试图让程序工作时,我们可以假设开发组是稳定的(总之,我们可以希望这样),但是,如果我们正在考虑程序的整个生命期,就必须假设开发组成员会改变。这意味着,新组员必须以某种方式学习原程序的要点,并与老组员互相通讯(也许通过对话)。这样,该程序就需要某种形式的设计文档。因为只想让程序工作,文档并不是必需的,所以还没有像由程序设计语言强加于程序那样的、强加于创建文档的规则。这样,如果要求文档满足特定的需要,就必须对文档强加外部原则。文档是否“工作”,这很难确定(并且需要在程序一生中验证),因此,对外部原则“最好”形式的争论.比对“最好”程序设计语言的争论更激烈。决定外

20、部原则时,头脑中的重要问题是“我准备解决什么问题”。问题的根本就是上面所说的“我们如何让它工作和使它容易改变”。然而,这个问题常常有多种解释:它变成了“我如何才能与FoobleBlah文档规范说明一致,以使政府会为此给我拨款”。这样,外部原则的目的是为了建立文档,而不是为了设计好的、可维护的程序。文档竟然变得比程序本身更重要了。被问到未来一般和特殊的计算的方向时,我会从这样的问题开始:哪种解花费较少?假设这个解满足需要,价格的不同足以使程序员放弃他当前做事情的习惯方式吗?如果他的方法包括存储在项目分析和设计过程中所创建的每个文档,并且包括当项目进化时维护这些文档,那么当项目更新时,他的系统将花

21、费很大,但是它能使新组员容易理解(假设没有那么多的使人害怕阅读的文档)。这样创建和维护方法的花费会和它打算替代方法的花费一样多。外部结构系列的另一个极端是最小化方法。为完成设计而进行足够的分析,然后丢掉它们,使得程序员不再花时间和钱去维护它;为开始编码而做足够的设计,然后丢掉这个设计,使得程序员不再花时间和钱去维护这些文档;然后使得代码是一流的和清晰的,代码中只需要最少的注释。为了使新组员快速参与项目,代码连同注释就足够了。因为在所有这些乏味的文档上,新组员只需花费很少的时间(总之,没有人真地理解它们),所以他能较快地参与工作。即便不维护文档,丢掉文档也不是最好的办法,因为这毕竟是程序员所做的

22、有效工作。某些形式的文档通常是必须的。3. C+语言的特点3.1对象:特性+行为第一个面向对象的程序设计语言是60年代开发的Simula-67。其目的是为了解决模拟问题。典型的模拟问题是银行出纳业务,包括出纳部门、顾客、业务、货币的单位等大量的“对象”。把那些在程序执行期间除了状态之外其他方面都一样的对象归在一起,构成对象的“类”,这就是“类”一词的来源。类描述了一组有相同特性(数据元素)和相同行为(函数)的对象。类实际上就是数据类型,例如,浮点数也有一组特性和行为。区别在于程序员定义类是为了与具体问题相适应,而不是被迫使用已存在的数据类型。这些已存在的数据类型的设计动机仅仅是为了描述机器的存

23、储单元。程序员可以通过增添他所需要的新数据类型来扩展这个程序设计语言。该程序设计系统欢迎创建、关注新的类,对它们进行与内部类型一样的类型检查。这种方法并不限于去模拟具体问题。尽管不是所有的人都同意,但大部分人相信,任何程序都模拟所设计系统。00P技术能很容易地将大量问题归纳成为一个简单的解,这一发现产生了大量的00P语言,其中最著名的是SmalltalkC+之前最成功的00P语言。抽象数据类型的创建是面向对象程序设计中的一个基本概念。抽象数据类型几乎能像内部类型一样准确工作。程序员可以创建类型的变量(在面向对象程序设计中称为“对象”或“实例”)并操纵这些变量(称为发送“消息”或“请求”,对象根

24、据发来的消息知道需要做什么事情)。3.2继承:类型关系类型不仅仅说明一组对象上的约束,还说明与其他类型之间的关系。两个类型可以有共同的特性和行为,但是,一个类型可能包括比另一个类型更多的特性,也可以处理更多的消息(或对消息进行不同的处理)。继承表示了基本类型和派生类型之间的相似性。一个基本类型具有所有由它派生出来的类型所共有的特性和行为。程序员创建一个基本类型以描述系统中一些对象的思想核心。由这个基本类型派生出其他类型,表达了认识该核心的不同途径。例如,垃圾再生机要对垃圾进行分类。这里基本类型是“垃圾”,每件垃圾有重量、价值等等,并且可以被破碎、融化或分解。这样,可以派生出更特殊的垃圾类型,它

25、们可以有另外的特性(瓶子有颜色)或行为(铝可以被压碎,钢可以被磁化)。另外,有些行为可以不同(纸的价值取决于它的种类和状态)。程序员可以用继承建立类的层次结构,在该层次结构中用类型术语来表述他需要解决的问题。第二个例子是经典的形体问题,可以用于计算机辅助设计系统或游戏模拟中。这里基本类型是“形体”,每个形体有大小、颜色、位置等。每个形体能被绘制、擦除、移动、着色等。由此,可以派生出特殊类型的形体:圆、正方形、三角形等,它们中的每一个都有另外的特性和行为,例如,某些形体可以翻转。有些行为可以不同(计算形体的面积)。类型层次结构既体现了形体间的类似,又体现了它们之间的区别。3.3 多态性当处理类型

26、层次结构时,程序员常常希望不把对象看作是某一特殊类型的成员,而把它看作基本类型成员,这样就可以编写不依赖于特殊类型的代码。在形体例子中,函数可以对一般形体进行操作,而不关心它们是圆、正方形还是三角形。所有的形体都能被绘制、擦除和移动,所以这些函数能简单地发送消息给一个形体对象,而不考虑这个对象如何处理这个消息。这样,新添类型不影响原来的代码,这是扩展面向对象程序以处理新情况的最普通的方法。例如,可以派生出形体的一个新的子类,称为五边形,而不必修改那些处理一般形体的函数。通过派生新子类,很容易扩展程序,这个能力很重要,因为它极大地减少了软件维护的花费。(所谓“软件危机”正是由软件的实际花费远远超

27、出人们的想象而产生的。)如果试图把派生类型的对象看作它们的基本类型(圆看作形体,自行车看作车辆,鸬鹚看作鸟),就有一个问题:如果一个函数告诉一个一般形体去绘制它自己,或者告诉一个一般的车辆去行驶,或者告诉一只一般的鸟去飞,则编译器在编译时就不能确切地知道应当执行哪段代码。同样的问题是,消息发送时,程序员并不想知道将执行哪段代码。绘图函数能等同地应用于圆、正方形三角形,对象根据它的特殊类型来执行合适的代码。如果增加一个新的子类,不用修改函数调用,就可以执行不同的代码。编译器不能确切地知道执行哪段代码,那么它应该怎么办呢?在面向对象的程序设计中,答案是巧妙的。编译器并不做传统意义上的函数调用。由非

28、oop编译器产生的函数调用会引起与被调用代码的“早捆绑”,对于这一术语,读者可能还没有听说过,因为从来没有想到过它。早捆绑意味着编译器对特定的函数名产生调用,而连接器确定调用执行代码的绝对地址。对于ooP,在程序运行之前,编译器不确定执行代码的地址,所以,当消息发送给一般对象时,需要采用其他的方案。为了解决这一问题,面向对象语言采用“晚捆绑”的思想。当给对象发送消息时,在程序运行之前不去确定被调用的代码。编译器保证这个被调用的函数存在,并完成参数和返回值的类型检查,但是它不知道将执行的准确代码。为了实现晚捆绑,编译器在真正调用的地方插入一段特殊的二进制代码。通过使用存放在对象自身中的信息,这段

29、代码在运行时计算被调用函数的地址。这样,每个对象就能根据一个指针的内容有不同的行为。当一个对象接收到消息时,它根据这个消息判断应当做什么。程序员可以用关键字Virtual表明他希望某个函数有晚捆绑的灵活性,而并不需要懂得vIrtual的使用机制。没有它,就不能用C+做面向对象的程序设计。Virtual函数(虚函数)表示允许在相同家族中的类有不同的行为。这些不同是引起多态行为的原因。4.典型例子题目:根据半径计算圆的周长和面积/根据半径计算圆的周长和面积#includeconstfloatPI=3.1416;声明常量(只读变量)PI为3.1416floatfCir_L(float);/声明自定义

30、函数fCir_L()的原型floatfCir_S(float);声明自定义函数fCir_S()的原型以下是main()函数main()floatr,l,s;/声明3个变量coutr;/键盘输入l=fCir_L(r);/计算圆的周长,赋值给变量ls=fCir_S(r);/计算圆的面积,赋值给变量scoutl=l;/显示计算结果coutns=0.0)/如果参数大于0,则计算圆的周长z=2*PI*x;return(z);/返回函数值/定义计算圆的面积的函数fCir_S()floatfCir_S(floatx)floatz=-1.0;/声明局部变量if(x=0.0)/如果参数大于0,则计算圆的面积z=PI*x*x;return(z);/返回函数值输出结果:输入数字:15R=151=94,248s=706.86Pressanjleytocontinue第11页共11页

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!