C++初学者指南第一篇C++基础如果说有一种语言定义了当今编程的实质,那么它就是C++。它是高性能软件开发的杰出语言。它的语法已经成为专业编程语言的标准,并且它的设计思想在计算界引起深刻的反响。Java和C#语言都是从C++继承而来的。简而言之,要成为专业的编程人员就意味着要深刻理解C++。它是现代编程的基础。本篇旨在介绍C++,包括它的历史,它的设计思想,以及几个最重要的特性。学习一门编程语言最困难的事情就是所有的元素都不是单独孤立存在的。相反,构成语言的各个部分是相互协作,一起工作的。这种相关性使得我们很难讨论C++的一个方面而不去考虑其它方面。为了克服这个困难,本篇对几个C++特性进行了简单的介绍,包括C++程序的通用形式,一些基本的控制语句,以及运算符。本篇不会涉及过多的细节,更注重C++程序中通用的概念。必备技能1.1C++历史简介C++是从C语言发展而来的。这一点不难理解,因为C++是构筑的C语言的基础之上的。然而,C++是C语言的超集。C++扩展并增强了C语言,支持面向对象的编程(这点在本篇的后面会进行描述)。C++同时对C语言做了改进,包括扩展了例行程序库集。然而大部分的C++特性是直接从C继承而来的。因此,为了充分理解和欣赏C++,我们必须深入了解C语言是如何运作的。C:现代编程时代的开始C语言的发明定义了现代编程时代的开始。它的影响不应该被低估,因为它从根本上改变了人们考虑和实现程序的方法。它的设计思想和语法已经影响到了每一个主流的编程语言。C语言是计算发展的主要的,革命性的推动力之一。C语言由DennisRitchie在DECPDP-11电脑上,在UNIX操作系统下发明并实现的。C语言是从一种古老的叫做BCPL的语言发展而来。BCPL是由MartinRichards开发的。BCPL语言对由KenThompson发明的B语言产生着深刻的影响,而B语言最终在20世纪70年代发展成C语言。在C语言发明之前,计算机语言被设计出来或者是为了进行学术计算,或者是为官方的委员们所使用。而C却不同。它是一群真实的程序员设计、实现并开发出来的。它反映了这些人完成编程工作的方法。它的特性是这群实际使用这个语言的人们反复推敲,打磨,测试的结果。因此,C语言吸引了众多的拥护者,并迅速成为全世界编程人员的选择。C语言的发展经历了20世纪60年代的结构化编程的革命。在此之前,大型程序是难以书写的,因为程序的逻辑趋向于退化成“意大利面条式的代码”,充斥着难以理解的,混乱的转跳,函数调用和返回。结构化编程通过增加很好的控制语句,带有局部变量的子程序段和其它的一些改进解决了这个问题。结构化编程使得编写巨大的程序成为了可能。尽管还有别的结构化的编程语言,例如Pascal,C却是第一个功能强大,富于表达,能书写出优美代码的结构化语言。它语法简单易用,并且它的设计思想是程序员掌控一切,而不是语言本身掌控一切,这就使得C语言很快拥有了众多的拥护者。我们现在来看这点可能有点难以理解,但是C当时确实为编程者带来了他们渴望已久的新鲜空气。因此,C语言很快就在20世纪80年代变成了使用最广泛的结构化编程语言。我们需要C++经过前文的描述,你可能会问,那为什么还要发明C++呢?既然C是很优秀的编程语言,我们为什么还需要别的编程语言呢?这个问题的答案非常复杂。纵观编程技术的发展历史,程序复杂度的增加驱使我们需要更好的方式来管理我们的程序。C++就应运而生了。为了更好地理解增长的程序复杂度与计算机编程语言发展之间的关系,我们需要简单回顾一下计算机编程技术发展的历史。当计算机刚被发明出来的时候,人们使用计算机前面的面板,通过拨动开关来发送二进制的机器指令。这种方式在计算机程序只有几百行的时候还可以工作。随着计算机程序的增大,人们发明了汇编语言,通过使用符号代替机器指令,以便程序员可以处理更大的,更复杂的程序。第一个被广泛使用的计算机语言是FORTRAN。FORTRAN语言在起初给人的印象是非常深刻的,当时几乎没有语言能实现编写整洁,易于理解的程序。20世纪60年代,结构化编程诞生了,这正是诸如C语言一样的语言所鼓励的编程方法。通过结构化的编程方法,很轻松的编写大型程序第一次成为了可能。然而,即使是使用结构化的编程方法,一旦一个项目到达了一定的规模,其复杂度也就超过了程序员所能管理的范围。在20世纪70年代,很多项目几乎都处于这种境地。为了解决这种问题,出现了一种新的编程方法:面向对象编程。通过使用面向对象编程,程序员可以处理更大的,更复杂的程序。而C语言是不支持这种面向对象编程方法的。于是,人们对面向对象的C的渴望就直接导致了C++的诞生。可见,自从计算机发明以来,编程的方式已经发生了巨大的变化。最后一点,尽管C是世界上最受欢迎的专业编程语言之一,也有复杂的程序是C不能完成的。一旦一个程序的规模达到了一定的大小,其复杂度就会增加,以至于很难从整体上对其进行把握。C++的目的就是突破这种障碍,帮助编程人员理解并管理更大,更复杂的程序。C++的诞生C++由BjarneStroustrup于1979年在位于新泽西州MurrayHill的贝尔实验室成功发明。起初它的名字叫“带有类的C”,后来在1983年更名为C++。Stroustrup在C的基础上构建了C++,因此C++包括C的所有特性和优点。它还继承了C的理念:程序员而不是程序掌控一切。有一点必须明确,Stroustrup并没有创建一个全新的编程语言。相反,它增强了已经高度成功的语言。大多数Stroustrup为C增加的特性都是为了支持面向对象的编程。从本质上来讲,C++就是支持面向对象的C。通过在C的基础上构建C++,就实现了到面向对象编程的平滑过渡。C程序员不必重新学习一门新的语言,只需要学习那些新增的特性,就能收获面向对象编程带来的好处。在设计C++语言的时候,Stroustrup清楚地知道在增加支持面向对象编程的特性时,保持原有C的特性,包括C的高效,灵活和C的设计理念是非常重要的。幸运的是,他的目标实现了。C++在提供了面向对象的编程优点同时,还保留了C的灵活。尽管发明C++的初衷是为了辅助管理那些大型的程序,但它绝不仅限于此。实际上,C++的面向对象特性可以被有效地引用到实际上任何程序中。C++可以广泛地被用来开发诸如编辑器,数据库,个人文件系统,网络工具,通信程序等,这些都非常常见。由于C++保留了C的高效性,大量的高性能系统软件都是用C++开发的。同样,C++也经常被用来开发windows程序。C++的发展C++被发明后,经过了三次大的修订,每次修订都对语言自身做了增加和改动。第一次和第二修订分别是在1985年和1990年。第三次修订发生在C++标准化的过程中。几年前(现在来看,应该是十几年前了),人们开始进行C++的标准化工作。那时,建立了由美国国家标准研究所(ANSI)和国际标准组织(ISO)合作的标准化组织组。建议标准的第一次草案是在1994年1月25日完成的。在这份草案中,ANSI/ISO联合委员会保留了Stroustrup当初定义的特性,并增加了一些新的特性。总的来说,这份最初的草案反映了当时C++的情况。在此之后不久,发生了一件事情,促使了联合委员会大大地扩展了该标准:由AlexanderStepanov提出的标准模板库的创建。标准模板库是一套我们可以用之处理数据的通用程序的集合。通用模板库很强大,也很简洁优雅。但是它很巨大。在第一次草案之后,委员会曾经投票来决议是否在标准C++中增加标准模板库。标准模板库的增加使得C++大大超出了起初定义的范围。对标准模板库和其它一些特性的增加使得C++标准化的步伐减慢了许多。完全可以说C++的标准化工作比人们期望的时间要长许多。在整个过程中,C++中加入了许多新的特性,并做了许多小的改动。实际上,由该联合委员会制定的C++比Stroustrup当初设计的C++要复杂很多。最终的草案在1997年12月14日通过,ANSI/ISO标准C++在1998年成为现实。这就是人们通常说的标准C++。本书描述的都是标准的C++。本书描述的C++是所有主流C++编译器,包括微软的visualC++都支持的C++。因此本书中的代码和信息是完全可移植的。必备技能1.2:C++与Java和C#的关系除了C++之外,还有两个重要的现代编程语言:Java和C#。Java是有SunMicrosystems公司开发的,而C#则是由微软公司开发的。由于人们有时会对C++与Java和C#的关系产生一些混淆,这里有必要对此介绍一下。C++是Java和C#之父。尽管Java和C#都是在C++的基础上对语言的特性进行了一些增加,删除和改动,但是总体上来说它们三者的语法是几乎相同的。进一步来说,C++所采用的对象模型和Java,C#的都是相似的。最后,三者给人的总体感觉也是非常相近的。这就意味着,一旦学会了C++,就能很轻易地学习Java和C#。反之亦然,如果你懂Java或者C#学习C++也是很简单的。这就是为什么Java,C#和C++都是用相同的语法和对象模型了,这也是大量有经验的C++程序员能顺地过渡到是Java或者C#的原因。它们之间的区别在于各自设计针对的计算环境不同。C++是针对指定类型的CPU和操作系统而设计的高性能的语言。例如:如果你想写在windows操作系统下,因特尔奔腾系列的CPU上运行的程序,那么C++是最好的选择。专家答疑问:Java和C#都实现了跨平台和可移植的编程,C++为什么不能了?答:Java和C#之所以能实现跨平台,可移植的编程,而C++不能是因为它们的编译器生成的目标代码不同。就C++而言,编译器的输出是机器代码,这是CPU可以直接执行的。因此它是紧密和指定的CPU以及操作系统相关的。如果想让C++程序在不同的系统上运行,则需要针对该目标系统进行代码的重新编译。为了让C++程序可以在不同的环境上运行,就需要生成不同的可执行版本。Java和C#是通过把代码编译成伪码,一种中间语言。就Java而言,这种伪码是在运行时系统上运行的,这就是Java虚拟机。对C#而言,这就是CLR(公共语言运行时)。因此,Java语言的程序可以在任何有java虚拟机的环境下运行,C#的程序可以在任何实现了CLR的环境下运行。因为Java和C#的运行时系统处于程序和CPU之间,和C++相比,这就引起了多余的开销。这就是为什么,对等情况下,C++程序比Java和C#程序运行快的原因了。Java和C#的开发是为了满足互联网上在线程序的统一编程需求。(C#的设计也是用来简化软件构件的开发)。互联网上连接的是许多不同的CPU和操作系统。因此跨平台和可移植性就成了最重要的着眼点。第一个着眼于这个问题的语言就是Java。Java语言编写的程序可以在很多不同的环境下运行。因此,Java程序可以在互联网上自由运行。然而这样做的代价就是牺牲了效率,Java程序的执行要比C++程序慢许多。同样的事情也发生在C#身上。最终分析,如果你想开发高性能软件,就是用C++。如果你想开发高度可移植的软件,就是用Java或者C#。最后一点:请记住,C++,java和C#是用来解决不同问题的。这里并没有那个语言好,那个语言不好的问题,而是那个语言更适合用来完成我们手头工作的问题。练习:1.C++语言是从什么语言发展而来的?2.C++语言产生的主要原因是什么?3.C++语言是Java和C#语言之父,对吗?答案:1.C++是从C语言发展而来的。2.程序复杂性的不断增加是产生C++语言的主要原因。3.正确。必备技能1.3:面向对象的编程C++的中心是围绕着面向对象的编程。正如前面介绍的那样,面向对象的编程是促进C++产生的主要因素。正是因为这一点,在学习编写简单的C++程序之前,理解面向对象编程的基本思想是非常重要的。面向对象的编程很好地利用了结构化编程的思想,并增加了一些新的概念,能够更好地组织程序。通常情况下,有两种方式来组织程序:以代码为中心或者以数据为中心。通过结构化的编程技术,程序通常是以代码为中心