5第1章概述(Introduction)1967年,美国麻省理工大学人工智能实验室S.Papert为儿童设计了一种LOGO编程语言。他用LOGO语言启发孩子们的学习与思考,一些孩子用LOGO语言设计出了真正的程序,于是LOGO成为一种热门的计算机教学语言。同年,挪威奥斯陆的JohanDahl和KristenNygaard推出了Simula67语言。该语言第一次提出类的概念,能够把应用中的概念直接用编程语言描述,使其比其他语言编写的程序更具可读性,而且编译系统捕捉类型错误的能力十分强,保证了程序规模扩大之后,错误量不会非线性增长。两位专家对设计面向对象编程语言做了首次尝试。该语言曾配置在好几个大型计算机上,但由于编译实现不完善,导致运行效率低下,只能执行一些小型程序,所以像ALGOL语言一样,没能流行,但成为未来面世的面向对象编程语言的概念基础。1970年,AT&T的Bell实验室的D.Ritchie和K.Thompson共同发明了C语言。研制C语言的初衷是用它编写UNIX系统程序,因此,它实际上是UNIX的“副产品”。它充分结合了汇编语言和高级语言的优点,高效而灵活,又容易移植,所以大受程序设计师的青,成为计算机产业界的宠儿。为此,他们两位获得了1983年度的“图灵奖”。1971年,瑞士联邦技术学院N.Wirth教授发明了Pascal语言。Pascal语言语法严谨,层次分明,程序易写,具有很强的可读性,是第一个结构化的编程语言。它一出世就受到广泛欢迎,为此,他获得1984年度的“图灵奖”。20世纪70年代中期,BjarneStroustrup(读作:别央呢是嫁哦是救?)在剑桥大学计算机中心工作。他使用过Simula和ALGOL,实现过低级语言BCPL,接触过C。他对Simula的类体系感受颇深,对ALGOL的结构也颇有好感,深知运行效率的意义,所以,十分欣赏C语言。既要编程简单、正确可靠,又要运行高效、可移植,是BjarmeStroustrup的初。以C为背景,以Simula思想为基础,正好符合他的设想。1979年,BjarneStroustrup到了Bell实验室,开始从事将C改良为带类的C(Cwithclasses)的工作。1983年该语言被正式命名为C++。90年代,程序员开始慢慢从C中淡出,转入C++。此后,C++稳步发展,1998年ISO/ANSIC++标准正式制定,如今已是如日中天。鉴于C++对现代计算机产业的贡献,1995年《BYTE》杂志将BjarmeStroustrup列入“计算机工业20个最具影响力的人”。从计算机发明那一天开始,人们就在努力探索编程方法,完善编程语言。编程语言完全是为了适应人们对计算机应用要求的产物,它以描述问题、解决问题为目的。C++是一种编程灵活、运行高效的高级语言,它可进行多种方法编程,适用于商业处理、科学计算和系统应用等重要领域。1.3C++1.3.1袋C(CommentonC)从本质上说,C++是从C语言中继承而来的。C++的发展壮大,主要是因为程序设计方法的发展。程序设计方法的发展,主要是计算机应用范围的扩大和编程规模的扩大。早期的编程,其目的主要是解决某些科学计算问题。大部分问题中的数据量不多,数www.TopSage.com
www.TopSage.com
6第一部分基础编程(PartITheBasicProgramming)据种类不多,但要求精巧的数据结构(CH11.1.3),更强调计算和性能,因此算法的优劣举足轻重。编程主要是围绕如何提高计算过程的运行效率进行的。C语言以它高度的灵巧性和实现上的高效性比擅长于科学计算的FORTRAN更胜一筹,因为计算问题越来越复杂多样,难于用简单通用的数据类型来描述,而且它更需要在时间和空间上的合理运筹,以及算法上的高度技巧来完成。C语言以它的简捷和高效比严谨的Pascal更具工业化的意义。事实证明,时间和空间的合理运用以及高效的代码,对于许多小规模程序的运行要求来说是首要的,而且在小规模编程中,程序员可以依靠经验,避免一些语言的漏洞和缺陷(C语言被认为不够安全,有诸多语言漏洞和缺陷),而在大规模编程中,Pascal和C同样面临着编程方法或分析问题着眼点的根本问题。C语言之所以风靡一时,在于当时需要计算机解决的问题大多是小规模问题,一般通过单台计算机独立蛮算便可解决。随着计算机的发展,计算机硬件环境发生了根本的变化,运行任务不但可以在高性能的计算机上单挑独斗地来完成,还可以充分利用计算机网络,联手完成。人们开始着手解决大数据量的处理问题,也就是程序中需要处理大量复杂结构的数据。C程序员虽然经过艰苦的努力,设计出许多精巧的程序,但是在理解上却越来越困难,运行问题也越来越多。程序需要“保修(可维护性要求)”,需要“扩充(可扩展性要求)”,需要“加固(安全性要求)”。然而,这些精巧的程序由于内在结构的弱点一一数据结构与算法盘根错节,无法被可逆地拆解,很难分析“险情”和重新使用。C语言设计的重要目标之一就是简捷、高效。其虽然具有诸多优点,但也限制了自身对一些缺陷的克服。然而在当时,却受到喜欢玩编程技巧的程序员的欢迎。人们总是希望抢时间,好冒险,求实惠。这就好像乡村的人们宁愿骑摩托车而不愿驾驶小轿车,因为摩托车在高低不平和弯弯曲曲的道路上也能行驶。由于当时致力于解决的问题规模还不是很大,编程工作多以程序员个体“单挑”的形式来体现。虽然也曾经设计出了著名的UNIX操作系统,但正因为尝试了大规模编程,才发现其程序模块之间的协调性存在问题,程序的重用性也存在问题,程序的安全、健壮以及可维护性问题、可扩充性问题等都暴露了出来。这一切都归于解决问题的狭隘视角、语言的简陋和支持程序设计方法的贫乏。自然而然,设计计算机语言的专家要改革这一现状,提出程序设计语言应该具有数据类型的扩充能力。于是基于数据类型和面向数据类型的编程语言不断浮出水面。这些方法,是以程序员自已定义或设计数据类型的方式将复杂结构的数据进行系统的组织,统一的管理,以使程序组织合理,算法设计简单和易懂。C++便是其中之一,从商业化角度看,更是其中的夜夜者。在C的简捷、高效的基础上,C++添加了自定义数据类型的整套设施,以适应大规模编程的需要。因此,进入市场后,面向对象的编程方法也开始工业化了。1.3.2C继承者(InheritorofC)C++对C的继承是青出于蓝而胜于蓝,它既可以进行C语言鼎盛时期所流行的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计,并正在完善以模板为特点的泛型程序设计。C++对www.TopSage.com
www.TopSage.com
大网第1章概述(Introduction)于C,引领编程方法从根本上大幅地改进,使C实在不能与C++相提并论了,所以,冠之m以不同于C的名字一C++。然而,因为是对C的继承,也就承诺了对C的包容。新事物都是权衡利弊的产物,C++也必然在某些方面存在不足。C++对C的包容,也包括对程序设计方法的包容,这就决定了C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计,因而C++就适应的问题规模而论,大小由之。C++是一种混合型程序设计语言,“混合”体现在可以采用不同的程序设计方法,进行各种目的之编程。“混合”是因为沿革了C。从本质上说,当今的世界,既有许多规模不大,要求能经济地运行的编程任务,也有越来越多的大规模编程任务,因而要求编程语言通用、面广、多样和灵活。“混合”意味着绝不放弃计算机高效运行的实用性特征,而文致力于提高大规模程序的编程质量,提高程序设计语言的问题描述能力。1.3.3标准C++(StandardC++)C++大约有20年的历史了,因此,人们应该享有它的标准了,标准化带给人们诸多的好处。首先,语言的设计,是以某种标准作为蓝本的,标准C++语言当然是描述标准C++的蓝本:其次,因为有了C++标准,专家们在开发C++编译器时,可以避免大量的研究无序性和重复劳动,并且也为组织大规模的编译软件开发创造了前提条件:有了C++标准文档,语言设计者、程序员和用户三者就可以有一致的语言来互通:C++标准促进了程序员资源的合理利用,人们找到了共同遵循的准则,在程序员社区可以畅通地交流,编写的程序变得更有效,更通用,更易懂。有了C++标准,程序员所开发的软件产品具有更高的系统可移植性:标准化还大幅度地提高了程序质量,直接让用户受益:C++标准还在防止技术封锁、促进软件技术的交流、提高软件竞争力等方面起到了很好的作用:标准C++的软件产品,其使用完全理所当然地得到保障。所以当C++发展到一定规模的时候,无论是用户、程序员,还是C++语言的设计者,都在竭力推动标准化的工作。从C++标准制定,到正式使用C++标准,以C++标准来编程,直至使用标准C++编译器,有一段时间的缓冲。现在来说,时机应该是成熟了,因为各个计算机公司实现的新版C++编译器都至少符合C++标准,非标准的C++(PlainC++)教材和书刊杂志正在逐渐从市场上淡出。标准C++与程序员更紧密相关的是系统的可移植性。这意味着若用标准C++编程,就可以在不同的标准C++编译器上,得到能在不同计算机系统中运行出同样结果的机器程序。使用标准C++,也意味着程序员可以充分享用C++的资源—标准库,从而带来更多的快速和方便,提高抽象编程的程度。所以,学习C++,理所当然地要学习标准C++。在我国,个人计算机配置的操作系统以Windows居多,比较容易获得的标准C++工具就是Borland公司的C++Builder6.0或以上版本,或者微软公司的VisualC++.NET或以上版本。若在Linux系统上,比较容易获得的标准C++工具就是G++3.0和BorlandC++Kylix3.0以上版本。另外,通用的C++编译器当数G++3.0了,它既有Windows版本,又有Linux版本。www.TopSage.com
www.TopSage.com
8第一部分基础编程(PartITheBasicProgramming)1.4C++编程流程(C++ProgrammingFlow)1.4.1编程过程(ProgrammingProcedure)学习程序设计,首先要搞清程序开发的过程,否则,无法以成功的运行来验证编程技能的提高。用编程语言编写完了程序,之后就要翻译成机器代码,以便让计算机运行获得结果。翻译的方式一般有两种,一种是解释型,也就是边读程序边翻译,翻译成机器代码后就执行。另一种是编译型,它是先整篇翻译成机器代码,保存在可执行程序文件中,然后启动该程序文件,运行获得结果。程序设计语言发展到现在,无论编译型还是解释型,一般都附带提供一个集成开发环境(IntegratedDevelopmentEnvironment,IDE)。也就是说,程序员可以在该环境中,编辑程序代码,逐个编译源文件,装配和链接全部源文件及其资源文件,直至调试运行。甚至软件包装和做成软件产品都可以一体化。在解释型环境(如VB)中,编辑代码后,可以保存程序文件,可以直接运行获得结果。没有编译和链接的中间环节,方便编程开发。但由于程序运行不能离开解释器现场,需要不断与之交互,所以,效率上便落了下风,对于规模化的大程序,低性能表现得更加明显,所以真正的计算任务和中大型软件开开始发一般都不用解释型环境开发。C++语言的程序因为要体现高性能,所以都是编译型的。但其开发环境,为了方便测试,将调试环境做成解释型的。即开发过程中,以解释型的逐条语句执行方式来进行调试,以编译型的脱离开发环境而启动运行的方式来生成程序最终的执行代码。集成开发环境(IDE),功能齐全,调试功能很强,程序编好后,可以立刻在环境中调试以获得初步测试结果,然后,可以方便地做成beta版形式,拿到实际环境中进一步测试,最后做成软件发行版。初学C++编程,是在C++的IDE中实践编程技术,学习创建程序项目的过程,学习不同程序的组织方式,学习调试程序的手段,以简单函数、模块以及文件组织为实验材料,以基本输入输出为程序运行结果验证窗口,以基本跟踪方法为调试手段,采用控制台应用程序的开发模式,学习解决问题的下手方法,学习简单的算法和数据结构。这一切,都是实践环节,所以必须了解程序设计的开发步骤,让计算机在编程操作中先工作起来。一般的编程操作流程为:编辑(edit)一编译(compile)一X链接(link或make或build)—调试(debug),该过程循环往复,结束直至完成,如图1-1所示。程序员编辑的程序,也称源程序,或称源代码(sourcecode),目图1-1编程操作流程www.TopSage.com
www.TopSage.com
9第1章概述(Introduction)简称代码(code),存放在文本形式的以.cpp(在Windows环境中)作为文件扩展名的文件中。在比较少的情形下,机器指令集代码也称源代码。程序被编译(compile)后,会生成目标代码(objectcode),存放在目标文件中,在Windows中的C++编译器通常将目标文件以.obj作为文件扩展名。目标代码即机器代码,是计算机能够识别的指令集合。但是,目标指令(也称目标代码)还不能在具体的计算机上运行,因为目标代码只是一个个独立的程序段,程序段之间还没有彼此呼应,程序段中用到的C++库代码和其他资源还没有挂上,需要相互衔接成适应一定操作系统环境的可执行程序整体。为了把成组的程序段转换为可执行程序,必须进行链接(link),链接的过程就是将目标代码整合(或称转换)成可执行文件,可执行文件通常以.exe为文件扩展名。C++程序在编译后,通过同时链接若于个目标文件与若于个库文件而创建可执行程序。库文件是系统提供的程序链接资源,它一般是以版本为文件单位,带有一个特殊的后缀,不同公司的产品有不同的后缀,例如,C++BorlandC++Builder6.0的库文件的后缀是.bpl和.1ib。标准C++提供C++标准库,用户库是由软件开发商或程序员提供的。自标文件与库文件链接的结果,是生成计算机可执行的程序。1.4.2最小样板程序(MinimumSampleProgram)例如,C++编译器能理解的有标准输出的最小程序为:#include<iostream>intmain()(std::cout<<"hello World.ln";}当然,程序不但要使计算机能理解,而且也要让人能理解。所以程序一方面要符合语言的语法,另一方面也要让程序体现出其逻辑结构。因此,上述程序最好写成有结构形式的代码,如下所示:#include<iostream>int main()fstd::cout<<"helloworld.ln";1程序中iostream是C++为特定环境编制的标准输入/输出流类的标准库头文件,也就是说,这个头文件提供了输入/输出设施。#include则是对编译器发出的操作指令,它指示编译器在编译之前,先将尖括号中的文件内容在本程序中原地展开。而头文件的内容,则声明从现在开始标准输入/输出的流操作可用,并在链接的作用下,将编译后的输入/输出指令(在本程序中是后面的std::cout<<"helloWorld\n";)转化成对应的输入/输出硬件设备的操作,从而使输入/输出语句“直接见效”。提供这样的编程方式,能够直截了当地表达计算机内的数据流动,直观地验证程序运行的结果正确与否。C++程序的入口点总是intmainO,操作系统启动可执行程序文件时,便装载文件到内存,并从main开始执行程序。main表示一个过程或者函数的名字,在C++中,过程和函数可以看作是同一个概念。int表示整数(integer)数据类型,位于main的前面,表示mainwww.TopSage.com
www.TopSage.com