资源描述
1C+面向对象程序设计2o 教材n C+程序设计谭浩强 清华大学出版社n C+面向对象程序设计谭浩强 清华大学出版社3教学内容第1篇 基 本 知 识第1章 C+的初步知识第2章 数据类型与表达式第2篇 面向过程的程序设计第3章 程序设计初步第4章 函数与预处理第5章 数组第6章 指针第7章 自定义数据类型4第3篇 基于对象的程序设计第8章 类和对象第9章 关于类和对象的进一步讨论第10章 运算符重载第4篇 面向对象的程序设计第11章 继承与派生第12章 多态性与虚函数第13章 输入输出流第14章 C+工具5第1章 C+的初步知识第2章 数据类型与表达式第1篇基 本 知 识6第1章 C+的初步知识1.1 从C到C+1.2 最简单的C+程序1.3 C+程序的构成和书写形式1.4 C+程序的编写和实现1.5 关于C+上机实践7计算机程序(Computer Program)p计算机的工作是用程序(Program)来控制的p程序是指令(Instruction)的集合p指令是计算机可以识别的命令1.1 从C到C+8计算机程序语言的发展:(1)机器语言:由计算机硬件系统可以识别的二进制指令组成的语言称为机器语言。计算机发展的初期,软件工程师们只能用机器语言来编写程序。这一阶段,在人类的自然语言和计算机编程语言之间存在着巨大的鸿沟。(2)汇编语言:将机器指令映射为一些可以被人读懂的助记符(Symbol),如ADD、SUB等此时编程语言与人类语言间的鸿沟略有缩小,但仍与人类的思维相差甚远。因为它的抽象程度太低,程序员需要考虑大量的机器细节。9(3)高级语言屏蔽了机器的细节,提高了语言的抽象层次,程序中可以采用具有一定涵义的数据命名和容易理解的执行语句。这使得在书写程序时可以联系到程序所描述的具体事物。10世界上第一种计算机高级语言诞生于1954年,它是FORTRAN语言。先后出现了多种计算机高级语言。其中使用最广泛、影响最大的当推BASIC语言和C语言。BASIC语言是1964年在FORTRAN语言的基础上简化而成的,它是为初学者设计的小型高级语言。C语言是1972年由美国贝尔实验室研制成功的。它不是为初学者设计的,是为了编写UNIX操作系统的。大多数系统软件和许多应用软件都是用C语言编写的。11C语言的主要特点是:1、C语言是一种结构化的程序设计语言,语言本身简洁、使用灵活方便。既适用于设计和编写大的系统程序,又适用于编写小的控制程序,也适用科学计算。2、它既有高级语言的特点,又具有汇编语言的特点。运算符丰富,除了提供对数据的算术逻辑运算外,还提供了二进制的位运算。并且也提供了灵活的数据结构。用C语言编写的程序表述灵活方便,功能强大。用C语言开发的程序,其结构性好,目标程序质量高,程序执行效率高。123、程序的可移植性好。用C语言在某一种型号的计算机上开发的程序,基本上可以不作修改,而直接移植到其它型号的计算机上运行。4、程序的语法结构不够严密,程序设计的自由度大。这对于比较精通C语言的程序设计者来说,可以设计出高质量的非常通用的程序。但对于初学者来说,要能比较熟练运用C语言来编写程序,并不是一件容易的事情。与其它高级语言相比而言,调试程序比较困难。往往是编好程序输入计算机后,编译时容易通过,而在执行时还会出错。13随着C语言应用的推广,C语言存在的一些缺陷或不足也开始流露出来,并受到大家的关注。如:C语言对数据类型检查的机制比较弱;缺少支持代码重用的结构;随着软件工程规模的扩大,难以适应开发特大型的程度等等(由于C语言等高级语言是面向过程的,最初用于科学计算)。14C+是由AT&T Bell(贝尔)实验室于20世纪80年代初在C语言的基础上开发成功的。C+保留了C语言原有的所有优点,增加了面向对象的机制。C+是由C发展而来的,与C兼容。用C语言写的程序基本上可以不加修改地用于C+。从C+的名字可以看出它是C的超集。C+既可用于面向过程的结构化程序设计,又可用于面向对象的程序设计,是一种功能强大的混合型的程序设计语言。15C+对C的“增强”,表现在两个方面: (1) 在原来面向过程的机制基础上,对C语言的功能做了不少扩充。(2) 增加了面向对象的机制。面向对象程序设计,是针对开发较大规模的程序而提出来的,目的是提高软件开发的效率。不要把面向对象和面向过程对立起来,面向对象和面向过程不是矛盾的,而是各有用途、互为补充的。学习C+,既要会利用C+进行面向过程的结构化程序设计,也要会利用C+进行面向对象的程序设计。16例1.1 输出一行字符: “This is a C+ program.”。程序如下: #include /包含头文件iostream, /用cout输出时需要用using namespace std; /使用命名空间stdint main( )coutThis is a C+ program.;/ 上面用C+的方法输出一行return 0;1.2 最简单的C+程序主函数(类型主函数(类型intint,返回值),返回值)函数体函数体预处理命令预处理命令在运行时会在屏幕上输出以下一行信息:This is a C+ program.17(1)用main代表“主函数”的名字。每一个C+程序都必须有一个 main 函数。main前面的int的作用是声明函数的类型为整型。程序第6行的作用是向操作系统返回一个零值。如果程序不能正常执行,则会自动向操作系统返回一个非零值,一般为-1。(2)函数体是由大括号 括起来的。本例中主函数内只有一个以cout开头的语句。注意C+所有语句最后都应当有一个分号。18(3)第1行“#include ”,这不是C+的语句,而是C+的一个预处理命令,它以“#”开头以与C+语句相区别,行的末尾没有分号。#include 是一个“包含命令”,它的作用是将文件内容插入到该命令所在的程序文件中,由于iostream这类文件都放在程序单元的开头,所以称为“头文件”(head file)。在程序进行编译时,先对所有的预处理命令进行处理,将头文件的具体内容代替 #include命令行,然后再对该程序单元进行整体编译。19(4)程序的第2行“using namespace std; ” 的意思是“使用命名空间std”C+标准库中的类和函数是在命名空间std中声明的,因此程序中如果需要用到C+标准库就需要用“using namespace std; ”作声明,表示要用到命名空间std中的内容。20(5)C+程序中可以用/*/做注释,可以用/做注释。前者可以做多行注释,后者只做单行注释。21例1.2 求a和b两个数之和。可以写出以下程序: / 求两数之和 (本行是注释行)#include /预处理命令using namespace std; /使用命名空间stdint main( ) /主函数首部 /函数体开始 int a,b,sum; /定义变量 cinab; /输入语句 sum=a+b; /赋值语句couta+b=sumendl; /输出语句return 0; /如程序正常结束,向操作系统返回一个零值 /函数结束22本程序的作用是求两个整数a和b之和sum。第1行“/求两数之和”是一个注释行,C+规定在一行中如果出现“/”,则从它开始到本行末尾之间的全部内容都作为注释。如果在运行时从键盘输入 123 456则输出为a+b=57923例1.3 给两个数x和y,求两数中的大者。在本例中包含两个函数。#include /预处理命令using namespace std;int max(int x,int y) /定义max函数,函数值为整型,形式参数 /x,y为整型 /max函数体开始 int z; /变量声明,定义本函数中用到的变量/z为整型 if(xy) z=x; /if语句,如果xy,则将x的值赋给zelse z=y; /否则,将y的值赋给z return(z); /将z的值返回,通过max带回调用处 /max函数结束int main( ) /主函数24 /主函数体开始 int a,b,m; /变量声明 cinab; /输入变量a和b的值 m=max(a,b); /调用max函数,将得到的值赋给mcoutmax=mn; /输出大数m的值return 0; /如程序正常结束,向操作系统返回一个零值 /主函数结束本程序包括两个函数:主函数main和被调用的函数max。程序运行情况如下: 18 25 (输入18和25给a和b)max=25 (输出m的值) 注意输入的两个数据间用一个或多个空格间隔,不能以逗号或其他符号间隔。25在上面的程序中,max函数出现在main函数之前,因此在main函数中调用max函数时,编译系统能识别max是已定义的函数名。如果把两个函数的位置对换一下,即先写main函数,后写max函数,这时在编译main函数遇到max时,编译系统无法知道max代表什么含义,因而无法编译,按出错处理。为了解决这个问题,在主函数中需要对被调用函数作声明。上面的程序可以改写如下:#include using namespace std;int main( ) int max(int x,int y); /对max函数作声明 int a,b,c; cinab; c=max(a,b); /调用max函数26 coutmax=cy) z=x; else z=y; return(z);只要在被调用函数的首部的末尾加一个分号,就成为对该函数的函数声明。函数声明的位置应当在函数调用之前。27C+程序的结构和书写格式归纳如下: (1) 一个C+程序可以由一个程序单位或多个程序单位构成。每一个程序单位作为一个文件。在程序编译时,编译系统分别对各个文件进行编译,因此,一个文件是一个编译单元。(2) 在一个程序单位中,可以包括以下几个部分: 预处理命令。上节4个程序中都包括#include命令。 全局声明部分(在函数外的声明部分)。在这部分中包括对用户自己定义的数据类型的声明和程序中所用到的变量的定义。1.3 C+程序的构成和书写形式28 函数。函数是实现操作的部分,因此函数是程序中必须有的和最基本的组成部分。每一个程序必须包括一个或多个函数,其中必须有一个(而且只能有一个)主函数(main函数)。但是并不要求每一个程序文件都必须具有以上3个部分,可以缺少某些部分(包括函数)。(3) 一个函数由两部分组成: 函数首部,即函数的第一行。包括函数名、函数类型、函数属性、函数参数(形参)名、参数类型。一个函数名后面必须跟一对圆括号, 函数参数可以缺省,如int main( )。29 函数体,即函数首部下面的大括号内的部分。如果在一个函数中有多个大括号,则最外层的一对 为函数体的范围。函数体一般包括:局部声明部分 (在函数内的声明部分)。包括对本函数中所用到的类型、函数的声明和变量的定义。对数据的声明既可以放在函数之外(其作用范围是全局的),也可以放在函数内(其作用范围是局部的,只在本函数内有效)。执行部分。由若干个执行语句组成,用来进行有关的操作,以实现函数的功能。30(4) 语句包括两类。一类是声明语句,另一类是执行语句。 C+对每一种语句赋予一种特定的功能。语句是实现操作的基本成分,显然,没有语句的函数是没有意义的。C+语句必须以分号结束。(5) 一个C+程序总是从main函数开始执行的,而不论main函数在整个程序中的位置如何。31(6)C+程序书写格式自由,一行内可以写几个语句, 一个语句可以分写在多行上。C+程序没有行号,也不像FORTRAN或COBOL那样严格规定书写格式(语句必须从某一列开始书写)。(7) 一个好的、有使用价值的源程序都应当加上必要的注释,以增加程序的可读性。C+还保留了C语言的注释形式,可以用“/*/”对C+程序中的任何部分作注释。在“/*”和“*/”之间的全部内容作为注释。用“/”作注释时,有效范围只有一行,即本行有效,不能跨行。而用“/*/”作注释时有效范围为多行。只要在开始处有一个“/*”,在最后一行结束处有一个“*/”即可。因此,一般习惯是: 内容较少的简单注释常用“/”,内容较长的常用“/*/ ”。32一个程序从编写到最后得到运行结果要经历以下一些步骤。1. 用C+语言编写程序用高级语言编写的程序称为“源程序”(source program)。C+的源程序是以.cpp作为后缀的。2. 对源程序进行编译为了使计算机能执行高级语言源程序,必须先用一种称为“编译器(complier)”的软件(也称编译程序或编译系统),把源程序翻译成二进制形式的“目标程序(object program)”。1.4 C+程序的编写和实现33目标程序一般以.obj或.o作为后缀。编译的作用是对源程序进行词法检查和语法检查。编译时对文件中的全部内容进行检查,编译结束后会显示出所有的编译出错信息。一般编译系统给出的出错信息分为两种,一种是错误(error);一种是警告(warning) 。3. 将目标文件连接在改正所有的错误并全部通过编译后,得到一个或多个目标文件。此时要用系统提供的“连接程序(linker)”将一个程序的所有目标程序和系统的库文件以及系统提供的其他信息连接起来,最终形成一个可执行的二进制文件,它的后缀是.exe,是可以直接执行的。34C+编译过程编译过程源程序源程序(文本文件)(文本文件)*.CPP目标文件目标文件(二进制文件)(二进制文件)*.OBJ可执行文件可执行文件(二进制文件)(二进制文件)*.EXE库文件库文件(各种函数)(各种函数)在在Vitual C+系统中,可直接从源程序编译连接至可执行系统中,可直接从源程序编译连接至可执行程序,但依然要生成程序,但依然要生成*.OBJ及及*.EXE这两个文件。这两个文件。F7编译编译连接连接compilelink354. 运行程序 运行最终形成的可执行的二进制文件(.exe文件),得到运行结果。5. 分析运行结果如果运行结果不正确,应检查程序或算法是否有问题。3637在了解了C+语言的初步知识后,读者最好尽快在计算机上编译和运行C+程序,以加深对C+程序的认识,并初步掌握C+的上机操作。可以使用不同的C+编译系统,在不同的环境下编译和运行一个C+程序。1.5 关于C+上机实践38Visual C+6.0o 集成化开发环境(Integrated Development Environment,IDE)n 源程序编辑、编译系统、调试等39VC+ 6.040输入例1.1源代码41编译42执行结果43删除cout语句的分号,编译出错44小结o 1.1 从C到C+o 1.2 最简单的C+程序o 1.3 C+程序的构成和书写形式o 1.4 C+程序的编写和实现o 1.5 关于C+上机实践
展开阅读全文