C++程序设计中国高等院校计算机基础教育课程体系规划教材谭浩强编著总目录第1篇基本知识第1章C++的初步知识第2章数据类型与表达式第2篇面向过程的程序设计第3章程序设计初步第4章函数与预处理第5章数组第6章指针第7章自定义数据类型第3篇基于对象的程序设计第8章类和对象第9章关于类和对象的进一步讨论第10章运算符重载第4篇面向对象的程序设计第11章继承与派生第12章多态性与虚函数第13章输入输出流第14章C++工具第1章C++的初步知识第2章数据类型与表达式第1篇基本知识第1章C++的初步知识*1.1从C到C++*1.2最简单的C++程序1.3C++程序的构成和书写形式1.4C++程序的编写和实现1.5关于C++上机实践*1.1从C到C++计算机诞生初期,人们要使用计算机必须用机器语言或汇编语言编写程序。世界上第一种计算机高级语言诞生于1954年,它是FORTRAN语言。先后出现了多种计算机高级语言。其中使用最广泛、影响最大的当推BASIC语言和C语言。BASIC语言是1964年在FORTRAN语言的基础上简化而成的,它是为初学者设计的小型高级语言。C语言是1972年由美国贝尔实验室的D.M.Ritchie研制成功的。它不是为初学者设计的,而是为计算机专业人员设计的。大多数系统软件和许多应用软件都是用C语言编写的。但是随着软件规模的增大,用C语言编写程序渐渐显得有些吃力了。C++是由AT&TBell(贝尔)实验室的BjarneStroustrup博士及其同事于20世纪80年代初在C语言的基础上开发成功的。C++保留了C语言原有的所有优点,增加了面向对象的机制。C++是由C发展而来的,与C兼容。用C语言写的程序基本上可以不加修改地用于C++。从C++的名字可以看出它是C的超集。C++既可用于面向过程的结构化程序设计,又可用于面向对象的程序设计,是一种功能强大的混合型的程序设计语言。C++对C的―增强‖,表现在两个方面:(1)在原来面向过程的机制基础上,对C语言的功能做了不少扩充。(2)增加了面向对象的机制。面向对象程序设计,是针对开发较大规模的程序而提出来的,目的是提高软件开发的效率。不要把面向对象和面向过程对立起来,面向对象和面向过程不是矛盾的,而是各有用途、互为补充的。学习C++,既要会利用C++进行面向过程的结构化程序设计,也要会利用C++进行面向对象的程序设计。本书既介绍C++在面向过程程序设计中的应用,也介绍C++在面向对象程序设计中的应用。*1.2最简单的C++程序例1.1输出一行字符:―ThisisaC++program.‖。程序如下:#includeiostream//包含头文件iostreamusingnamespacestd;//使用命名空间stdintmain(){cout″ThisisaC++program.″;return0;}在运行时会在屏幕上输出以下一行信息:ThisisaC++program.用main代表―主函数‖的名字。每一个C++程序都必须有一个main函数。main前面的int的作用是声明函数的类型为整型。程序第6行的作用是向操作系统返回一个零值。如果程序不能正常执行,则会自动向操作系统返回一个非零值,一般为-1。函数体是由大括号{}括起来的。本例中主函数内只有一个以cout开头的语句。注意C++所有语句最后都应当有一个分号。再看程序的第1行―#includeiostream‖,这不是C++的语句,而是C++的一个预处理命令,它以―#‖开头以与C++语句相区别,行的末尾没有分号。#includeiostream是一个―包含命令‖,它的作用是将文件iostream的内容包含到该命令所在的程序文件中,代替该命令行。文件iostream的作用是向程序提供输入或输出时所需要的一些信息。iostream是i-o-stream3个词的组合,从它的形式就可以知道它代表―输入输出流‖的意思,由于这类文件都放在程序单元的开头,所以称为―头文件‖(headfile)。在程序进行编译时,先对所有的预处理命令进行处理,将头文件的具体内容代替#include命令行,然后再对该程序单元进行整体编译。程序的第2行―usingnamespacestd;‖的意思是―使用命名空间std‖。C++标准库中的类和函数是在命名空间std中声明的,因此程序中如果需要用到C++标准库(此时就需要用#include命令行),就需要用―usingnamespacestd;‖作声明,表示要用到命名空间std中的内容。在初学C++时,对本程序中的第1,2行可以不必深究,只需知道:如果程序有输入或输出时,必须使用―#includeiostream‖命令以提供必要的信息,同时要用―usingnamespacestd;‖,使程序能够使用这些信息,否则程序编译时将出错。例1.2求a和b两个数之和。可以写出以下程序://求两数之和(本行是注释行)#includeiostream//预处理命令usingnamespacestd;//使用命名空间stdintmain()//主函数首部{//函数体开始inta,b,sum;//定义变量cinab;//输入语句sum=a+b;//赋值语句cout″a+b=″sumendl;//输出语句return0;//如程序正常结束,向操作系统返回一个零值}//函数结束本程序的作用是求两个整数a和b之和sum。第1行―//求两数之和‖是一个注释行,C++规定在一行中如果出现―//‖,则从它开始到本行末尾之间的全部内容都作为注释。如果在运行时从键盘输入123456↙则输出为a+b=579例1.3给两个数x和y,求两数中的大者。在本例中包含两个函数。#includeiostream//预处理命令usingnamespacestd;intmax(intx,inty)//定义max函数,函数值为整型,形式参数x,y为整型{//max函数体开始intz;//变量声明,定义本函数中用到的变量z为整型if(xy)z=x;//if语句,如果xy,则将x的值赋给zelsez=y;//否则,将y的值赋给zreturn(z);//将z的值返回,通过max带回调用处}//max函数结束intmain()//主函数{//主函数体开始inta,b,m;//变量声明cinab;//输入变量a和b的值m=max(a,b);//调用max函数,将得到的值赋给mcout″max=″m′\\n′;//输出大数m的值return0;//如程序正常结束,向操作系统返回一个零值}//主函数结束本程序包括两个函数:主函数main和被调用的函数max。程序运行情况如下:1825↙(输入18和25给a和b)max=25(输出m的值)注意输入的两个数据间用一个或多个空格间隔,不能以逗号或其他符号间隔。在上面的程序中,max函数出现在main函数之前,因此在main函数中调用max函数时,编译系统能识别max是已定义的函数名。如果把两个函数的位臵对换一下,即先写main函数,后写max函数,这时在编译main函数遇到max时,编译系统无法知道max代表什么含义,因而无法编译,按出错处理。为了解决这个问题,在主函数中需要对被调用函数作声明。上面的程序可以改写如下:#includeiostreamusingnamespacestd;intmain(){intmax(intx,inty);//对max函数作声明inta,b,c;cinab;c=max(a,b);//调用max函数cout″max=″cendl;return0;}intmax(intx,inty)//定义max函数{intz;if(xy)z=x;elsez=y;return(z);}只要在被调用函数的首部的末尾加一个分号,就成为对该函数的函数声明。函数声明的位臵应当在函数调用之前。下面举一个包含类(class)和对象(object)的C++程序,目的是使读者初步了解C++是怎样体现面向对象程序设计方法的。例1.4包含类的C++程序。#includeiostream//预处理命令usingnamespacestd;classStudent//声明一个类,类名为Student{private://以下为类中的私有部分intnum;//私有变量numintscore;//私有变量scorepublic://以下为类中的公用部分voidsetdata()//定义公用函数setdata{cinnum;//输入num的值cinscore;//输入score的值}voiddisplay()//定义公用函数display{cout″num=″numendl;//输出num的值cout″score=″scoreendl;//输出score的值};};//类的声明结束Studentstud1,stud2;//定义stud1和stud2为Student类的变量,称为对象intmain()//主函数首部{stud1.setdata();//调用对象stud1的setdata函数stud2.setdata();//调用对象stud2的setdata函数stud1.display();//调用对象stud1的display函数stud2.display();//调用对象stud2的display函数return0;}在一个类中包含两种成员:数据和函数,分别称为数据成员和成员函数。在C++中把一组数据和有权调用这些数据的函数封装在一起,组成一种称为―类(class)‖的数据结构。在上面的程序中,数据成员num,score和成员函数setdata,display组成了一个名为Student的―类‖类型。成员函数是用来对数据成员进行操作的。也就是说,一个类是由一批数据以及对其操作的函数组成的。类可以体现数据的封装性和信息隐蔽。在上面的程序中,在声明Student类时,把类中的数据和函数分为两大类:private(私有的)和public(公用的)。把全部数据(num,score)指定为私有的,把全部函数(setdata,display)指定为公用的。在大多数情况下,会把所有数据指定为私有,以实现信息隐蔽。具有―类‖类型特征的变量称为―对象‖(object)。程序中第18~24行是主函数。程序运行情况如下:100198.5↙(输入学生1的学号和成绩)100276.5↙(输入学生2的学号和成绩)num=1001(输出学生1的学号)score=98.5(输出学生1的成绩)num=1002(输出学生2的学号)score=76.5(输出学生2的成绩)1.3C++程序的构成和书写形式C++程序的结构和书写格式归纳如下:(1)一个C++程序可以由一个程序单位或多个程序单位构成。每一个程序单位作为一个文件。在程序编译时,编译系统分别对各个文件进行编译,因此,一个文件是一个编译单元。(2)在一个程序单位中,可以包括以下几个部分:①预处理命令。上节4个程序中都包括#include命令。②全局声明部分(在函数外的声明部分)。在这部分中包括对用户自己定义的数据类型的声明和程序中所用到的变量的定义。③函数。函数是实现操作的部分,因此函数是程序中必须有的和最基本的组成部分。每一个程序必须包括一个或多个函数,其中必须有一个(而且只能有一个)主函数(main函数)。但是并不要求每一个程序文件都必须具有以上3个部分,可以缺少某些部分(包括函数)。(3)一个函数由两部分组成:①函数首部,即函数的第一行。包括函数名、函数类型、函数属性、函数参数(形参)名、参数类型。一个函数名后面必须跟一对圆括号,函数参数可以缺省,如intmain()。②函数体,即函数首部下面的大括号内的部分。如果在一个函数中有多个大括号,则最外层的一对{}为函数体的范围。函数体一般包括:•局部声明部分(在函数内的声明部分)。包括对本函数中所用到的类型、函数的声明和变量的定义。