资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,C+,面向对象,程序设计,1,C+,面向对象程序设计,教材,:C+,参考大全,学时,:40(,理论,)+24(,实践,),考试,:70%(,笔试,)+30%(,平时,),2,第一章,C+,编程基础,一、程序语言的发展,1,、机器语言(用二进制代码表示),2,、汇编语言(用符号表示),3,、高级语言(类似自然语言),3,第一章,C+,编程基础,二、,C+,与,C,的联系,1,、,C+,是在,C,的基础上发展而来,,是带类的,C,语言。,2,、,C,语言支持结构化程序设计,,C+,语言支持面向对象程序设计。,4,3,、结构化程序设计的思想:,功能分解,并逐 步求精。,面向对象程序设计的本质:,把数据和处理数据的过程 看成一个整体,对象。,第一章,C+,编程基础,5,第一章,C+,编程基础,三、,C+,中几个重要概念,1,、程序:数据,+,操作,2,、数据类型:不同的数据组织方式,得到不同的数据类型,3,、表达式:操作符,+,操作数,4,、语句控制:数据操作的流程,6,第一章,C+,编程基础,四、开发一个,C+,程序的四个步骤:,1,、编辑(产生源文件,扩展名为,CPP,),2,、编译(产生目标文件,扩展名为,OBJ,),3,、,连接(产生执行文件,扩展名为,EXE,),4,、运行,7,第一章,C+,编程基础,五、集成开发环境(,IDE,),1,、定义:,集文字处理、编译、连接、项目管理、程序排误等多功能为一体的软件开发工具,。,2,、常见的集成开发环境:,Borland C+,Visual C+,8,第一章,C+,编程基础,六、程序风格,1,、良好的编程风格,不仅有利于,自己对程序的调 试,而且会大,大增加程序的可复用机会。,9,第一章,C+,编程基础,2,、注释,(,1,)定义:为增加程序的可读性而在,程序中附加的说明性文字。,(,2,)形式,:,以符号,/,打头,只占一行。,C+,特有的注释形式。,包含在符号,/,与,/,之间,可占多行。,继承,C,的注释形式。,10,第一章,C+,编程基础,六、程序风格,3,、命名(为常量、变量、函数取名),(,1,)名字必须符合标识符的规范。,(,2,)标识符:由字母、数字、下划线组成,,而且 只能以字母、下划线打头。,(,3,)名字不能是保留字(系统有固定用途,的标识符)。,(,4,)字母的大小写有区别。,(,5,)名字最好能表达一定的含义。,11,第一章,C+,编程基础,4,、编排,编排时使用缩进、空行、空格,使程序更清晰。,12,第一章,C+,编程基础,七、简单性原则,1,、可以用一句话说清楚的,不要用一页,纸 去说明,可以用一个简单的语句完,成的功能,不要用许多语句来完成。,2,、不要写太长的函数,可以用函数调用,来缩短函数的定义。,3,、不要写太长的语句,可以用多条语句,来代替一条语句。,13,第一章,C+,编程基础,4,、如果文件太长,将它分成几个小文件。,5,、不要用太多的嵌套,可以考用,switch,语句或者引入新的函数来解决问题。,6,、定义类时,一个文件放一个类的定义。,14,第一章,C+,编程基础,八、一致性原则,1,、变量的命名应该有意义。,2,、在程序中加上适当的注释。,3,、利用缩进使程序清晰。,4,、相关的内容组织在一起。,5,、能简单,则简单。,15,第二章 基本,C+,程序结构,例,1,:,#include,void main(),cout,”,同学们,你们好,!,”,;,程序功能,:,在屏幕上显示输出,同学们,你们好,!,说明一,说明二,说明三,说明四,说明五,说明六,16,第二章 基本,C+,程序结构,一、编译预处理命令,#include,1,、,#,:预处理命令的标志。,2,、,#include,:包含命令;,把一个文本文件的内容插入到该命令处。,3,、,命令参数;,给出要插入文件的文件名。,返回,17,第二章 基本,C+,程序结构,二、头文件:以,h,为扩展名的文本文件,如果程序文件中引用到的函数、变量、,常量、对象、数据类型等是由别的文件,提供的,则必须在程序文件的开始部分,用,#include,命令把有关的头文件包含进来。,返回,18,第二章 基本,C+,程序结构,三、函数(具有特定功能的程序模块),1,、定义格式:,返回类型 函数名(形式参数表),函数体,void main()cout,”,同学们,你们好,!,”,;,返回,19,第二章 基本,C+,程序结构,(,1,)类型修饰符:函数返回值的类型。,(,2,)函数名:非保留字的标识符。,(,3,)形式参数表:由一系列用逗号隔,开的参数组成。,(,4,)函数体:包含在一对,中的语句序列。,20,第二章 基本,C+,程序结构,2,、主函数(,main,函数),每个程序中至少要有一个函数,这个不可缺少,的函数就是主函数,约定主函数名为:,main,(,1,)程序由一个或多个函数组成。,(,2,)如果程序中只有一个函数,则,一定是,main,函数。,(,3,)如果程序中有多个函数,则有,且仅有一个为,main,函数。,21,第二章 基本,C+,程序结构,(,4,),main,函数是程序的入口,程序是从,main,函数开始执行的。,(,5,),main,函数的返回值,void:,无返回值。,int:,有,返回值。,(,0,表示程序正常结束,非,0,表示程序非正常结束),22,第二章 基本,C+,程序结构,四、,C+,语句,基本语句:以分号;作为结束标志。,复合语句:包含在,中的基本语句序列。,返回,23,第二章 基本,C+,程序结构,五、常量,数据的一种重要表现形式,常量的值,不可改变,1,、整型常量(整型常数)如:,123,2,、实型常量(实型常数)如:,1.23,3,、字符常量(用,括起的一个,字符)如:,a,24,第二章 基本,C+,程序结构,4,、字符串常量(用,”,括起的,字符序列),如:,”,student,”,5,、枚举,常量,注:除字符串常量中引号内的字符以及,注释外,其它字符必须是半角字符。,尤其注意不要误用中文标点。,返回,25,第二章 基本,C+,程序结构,六、,cout,和数据的显示输出,1,、,cout,:,连接显示器的输出流对象。,2,、,:输出操作符(插入操作符),26,第二章 基本,C+,程序结构,3,、显示输出语句的格式:,cout,表达式,【,表达式,】,;,注:,【】,中内容可有可无,,若有,可重复多次。,如:,cout100;,屏幕输出,100,cout100200100+200;,屏幕输出,100200300,返回,27,第二章 基本,C+,程序结构,4,、插入空格:(空格符为,),如:,cout 100,200100+200,;,屏幕输出,:100 200 300,28,第二章 基本,C+,程序结构,5,、换行输出,换行符号:,n,换行控制符:,endl,如:,cout 100n200;,cout 100endlradius;,circum=2,*,PI,*,radius;,cout,”,circum=,”,circum;,说明一,说明二,说明三,32,第二章 基本,C+,程序结构,程序功能:,根据从键盘输入的半径,计算并输出,圆的周长。,如:键盘输入,2.0,,则屏幕输出:,circum=12.56,返回,33,第二章 基本,C+,程序结构,一、变量,数据的一种重要表现形式,变量的值,可以改变。,1,、变量必须先定义后使用。,定义格式:,变量类型 变量名;,如:,int age;,返回,34,第二章 基本,C+,程序结构,2,、变量赋值和初始化,如:,int age;,age=20;/,变量赋值,int age=20;/,变量初始化,35,第二章 基本,C+,程序结构,3,、常值变量,在一般变量定义前加上保留字,const,如:,const float PI=3.14;,注:常值变量定义时必须初始化,且值,不可改变。常值变量名通常大写。,36,第二章 基本,C+,程序结构,1,、定义:由操作符和操作数按照一定,的语法规则组 成的符号序列。,如:,2,*,PI,*,radius /,算术表达式,circum=2,*,PI,*,radius /,赋值表达式,注:最简单的表达式:,常量,变量,函数调用。,二、表达式,返回,37,第二章 基本,C+,程序结构,2,、优先级和结合性:,优先级:不同操作符出现在同一表达式中,,谁先运算的级别。,如:,a+bc /,优先级高于,+,结合性:同等优先级的操作符出现在同一表,达式中,谁先运算的规定。,如:,a+b-c /,从左到右,38,第二章 基本,C+,程序结构,3,、表达式语句:,表达式后加,;,如:,circum=2,*,PI,*,radius;,4,、,C+,表达式的写法:,(,1,)所有字符写在同一水平线上。,(,2,)乘号:,除号:,/,(,3,)算术运算符不可省略。,39,第二章 基本,C+,程序结构,5,、表达式的值,(,1,)算术表达式,算术运算符:,+,,,-,,,,,/,,,%,%,(取模操作符):,求两整数相除后所得的余数。,如:,22%7=1,40,第二章 基本,C+,程序结构,若两操作数都为整数,则计算结果为整数。,如:,345/10=34,若两操作数有一个为实数,则计算结果,为实数。,如:,345.0/10=34.5,41,第二章 基本,C+,程序结构,(,2,)赋值表达式:,赋值操作符,=,赋值表达式格式 变量,=,表达式,如:,circum=2 PIradius,42,第二章 基本,C+,程序结构,赋值表达式的值:赋值操作符左边表达式的值。,如:,cout(x=5),:输入操作符(提取操作符),键盘输入语句的格式:,cin,变量,【,变量,】,;,返回,44,第二章 基本,C+,程序结构,1,、,【】,中内容可有可无,若有,可重复多次。,如:,int a,b,c;cina;cinabc;,2,、格式中,cin,后跟的是变量,不可是常量或,表达式。,如:,cin100;()cin100+200;(),注:若在程序中用到,cin,或,cout,,则在程序中应,有,#include,45,第三章 数据类型,一、,C+,数据类型分类图,数 据 类 型,基本数据类型,整型(,int),浮点型,(float,),字符型,(char),双精度型,(double),无值,(void),构造数据类型,引申数据类型,指针,(*),引用,(&,),结构化数据类型,数组,(),结构,(struct),联合,(union),位域,枚举,(enum),类,(class),46,第三章 数据类型,二、基本数据类型概况:,1,、数据在计算机中的存储,(,1,)计算机内存单元的单位是字节,,一个字节是,8,个二进制位。,如:,0000 0000 1010 1010,是两个字节。,47,第三章 数据类型,(,2,)不同的计算机中,同一数据类型,占用的空间不一定相同。,如:,16,位计算机中,整型占两个字节;,32,位计算机中,整型占四个字节;,48,第三章 数据类型,(,3,)数据占用内存字节的多少决定了其,能表达的数据的范围。,如:两个字节的整数表示范围是,-3276832767,49,第三章 数据类型,(,4,)计算机对内存中存放的同样信息解释,会因其所能表示的数据类型的不同而,不同。,如:,0000 0000 0000 1010,在,16,位计算机中,若表示整数,则为一个整数,若表示字符,则为两个字符,50,第三章 数据类型,注:定义变量时,数据类型有两个含义:,为该变量分配多大的存储空间;,如何解释该存储空间中的二进制数位。,如:定义变量,float radius;,则表示,radius,将要占用,4,个字节的存储空间,并且对这,个空间的值的存放和解释都按小数进行。,51,第三章 数据类型,2,、修饰符号,long(,长型符,)short(,短型符,),signed(,有符号型,)unsigned(,无符号型,),52,第三章 数据类型,使用修饰符号后的基本数据类型,所属类型,加修饰符后的类型,16,位计算机中所占字节数,简写,char,char,1,unsigned char,1,signed char,1,char,53,第三章 数据类型,所属类型,加修饰符后的类型,16,位计算机中所占字节数,简写,int,int,2,unsigned int,2,signed int,2,int,54,所属类型,加修饰符后的类型,16,位计算机中所占字节数,简写,short int,short int,2,short,unsigned short int,2,signed short int,2,第三章 数据类型,55,所属类型,加修饰符后,的类型,16,位计算机中所占字节数,备注,long int,long int,4,long,unsigned long int,4,signed long int,4,第三章 数据类型,56,所属类型,加修饰符后,的类型,16,位计算机中所占字节数,备注,实型,float,4,double,8,long double,10,第三章 数据类型,57,第三章 数据类型,3,、基本数据类型,(,1,),void,:实际上不能算是一种数据,类型,它表示根本就没有值,通,常用于表示函数没有返回值。,58,第三章 数据类型,(,2,)整型,整数的三种表示方式:,十进制:无前缀 如:,12,八进制:,0,前缀 如:,012,十六进制:,OX,(或,ox,)前缀 如:,OX12,59,第三章 数据类型,(,3,)实型,浮点数,(float),和双精度数,(double),的区别,表示的数据范围不同,表示的精度不同,60,第三章 数据类型,实数的两种表示形式,定点数形式 如:,3.14,指数形式 如:,31400 3.14E4,0.314 3.14E-1,61,第三章 数据类型,(,4,)字符型,字符型和整型的关系,字符在内存中是以,ASCII,码存储,所以 字符和整数在一定范 围内可以通用。,如:,char c=60;int i=,&,;,62,第三章 数据类型,整数值的范围比字符类型值的范围,要大,所以在赋值时要注意不能超,过字符的范围。,如:,char c=1234;(),63,第三章 数据类型,尽管整数和字符可以在一定范围内,相互赋值,但它们表示的含义不同,,一个表示整数,而另一个表示字符。,64,第三章 数据类型,例,3,:,#include,void main(),int i=60;char c=i;,cout,”,The value of integer:,”,iendl;,cout,”,The value of character:,”,c,endl;,该程序的输出结果是:,The value of integer:60,The value of character:,65,第三章 数据类型,特殊字符(转义字符):以,开头的字符序列。,名称,符号,名称,符号,空字符,0,水平制表,t,换行,n,垂直制表,v,换页,f,问号,?,回车,r,反斜线,回格,b,单引号,响铃,a,双引号,”,66,第三章 数据类型,如:,cout,”,How are you!,”,;,则屏幕输出:,How are you!,cout,”,”,How are you!,”,;,则屏幕输出:,”,How are you!,”,67,第三章 数据类型,字符串(用,”括起来的字符序列),0,:字符串结束符;不显示,但占一个,字节的存储空间。,如:”,Hello,”,内存表示为:,H,e,l,l,o,0,68,第三章 数据类型,如:,”,0,”,与,0,的差别:,”,0,”,为字符串,内存表示为:,0,为字符,内存表示为:,0,0,0,69,第三章 数据类型,4,、数据类型长度的确定,格式:,sizeof(,数据类型,),如:,cout,”,Size of int is:,”,sizeof(int);,则屏幕输出:,Size of int is:2,表示在,16,位计算机中,,int,型的长度为,2,个字节。,70,第三章 数据类型,5,、选择数据类型的原则,根据所表示的数据的类型选择。,根据所表示的数据的范围选择。,71,第三章 数据类型,三、结构化数据类型概况,1,、数组,数组变量可以存放一组具有相同类型的数据。,数组变量的定义格式:,数据类型 数组名,数组元素个数,如:,int grade50;,则将变量,grade,定义成一个可存放,50,个整 数的整型数组。,72,第三章 数据类型,下标访问,通过下标访问操作符,访问指定的数组元素。,若数组元素个数为,n,,则下标范围是:,0n-1,如:,grade0,表示该数组的第一个元素。,grade49,表示该数组的最后一个元素。,73,第三章 数据类型,2,、枚举,枚举是一种用户自定义的类型,使用前必须先定义。,枚举类型的定义格式:,enum,枚举类型名,常量,1,,常量,2,,,,常量,n;,如,:enumWEEKDAYSun,Mon,Tue,Wed,Thu,Fri,Sat;,74,第三章 数据类型,定义了一个枚举类型后,就可以用该,类型来定义变量,.,如,:WEEKDAY w1,w2=sat;,75,第三章 数据类型,某一枚举类型的变量,它的取值范围限定在,中的,n,个变量。,如:,WEEKDAY,类型的两个变量,w1,w2,,它们只能,Sun,Mon,Tue,Wed,Thu,Fri,Sat,这七个符号常量中取值。,76,第三章 数据类型,枚举类型中的每个符号常量对应一个整数。,两种对应关系:,依此与整数,0,,,1,,,2,,,,,n,对应。,用赋值号规定其对应关系。,77,第三章 数据类型,如:,enum WEEKDAYSun,Mon,Tue,Wed,Thu,Fri,Sat;,此枚举类型中,:,Sun,Mon,Tue,Wed,Thu,Fri,Sat,对应的整数分别为:,0,,,1,,,2,,,3,,,4,,,5,,,6,78,第三章 数据类型,如:,enum SomeDigitsONE=1,TWO,FIVE=5,SIX,SEVEN;,此枚举类型中,:,ONE=1,TWO=2,FIVE=5,SIX=6,SEVEN=7,79,第三章 数据类型,3,、结构,结构是一种用户自定义的类型,,使用前必须先定义。,80,第三章 数据类型,结构类型的定义格式:,struct,结构类型名,成员,1,;,成员,2,;,成员,n,;,;,81,第三章 数据类型,如:,struct Person,char name10;,int sex;,int age;,float pay;,;,定义了一种结构类型后,可以用该类型来定义变量。,如:,Person p1;,82,第三章 数据类型,对结构变量进行赋值:,对各成员进行赋值,如:,p1.name=,”,WangPin,”,;,p1.sex=1;,p1.age=35;,p1.pay=1000.0;,在定义结构变量时进行初始化,如:,Person p1=,”,WangPin,”,1,35,1000,、,.,83,第四章 程序流程控制,一、复合语句,1,、最常用的四类语句:,(,1,)说明和定义语句。,如:,char a,b;,(,2,)表达式语句,如:,c=a+b;,(,3,)流程控制语句,(,4,)异常处理语句,84,第四章 程序流程控制,2,、复合语句,包含在一对,的语句序列。,如:,int i=4;couti;,(,3,),cout score;,if(score=60),cout score;,if(score=60)cout,”,及格,”,;,else,cout score;,if(score=60),if(score=90)cout=80)cout,”,良好”,;,else cout,”,及格,”,;,else,cout score;,if(score100)cout,”,输入错误!,”,;,else if(score 60)cout,”,不及格,”,;,else if(score 70)cout,”,及格,”,;,else if(score 80)cout,”,中等,”,;,else if(score 90)cout,”,良好,”,;,else cout,”,优秀,”,;,95,第四章 程序流程控制,二,switch,语句,1,、格式:,switch,(表达式),case,常量表达式,1,:语句,1,;,case,常量表达式,2,:语句,2,;,case,常量表达式,n,:语句,n,;,【default:,语句,n+1,;,】,96,第四章 程序流程控制,2,、执行顺序:,先计算,switch,语句中表达式的值,然后在,case,语句中寻找值相等的常量表达式,并以此为入口,由此开始 顺序执行。如果没有找到 相等的常量表达式,且,default,后的语句,n+1,存在,则执行语句,n+1,,否则什么都不做。,97,第四章 程序流程控制,3,、五点注意:,(,1,),case,后表达式的值必须是整型的。,(,2,)各常量表达式的值不能相同。,(,3,)每个,case,语句的分支可以有多条语句,,但不必用,。,98,第四章 程序流程控制,(,4,)每个,case,语句只是一个入口标号,并不能确定执行的终止点,因此每个,case,分支的最后最好加上,break,语句,用来结,束当前,switch,语句的执行;否则会从入口点开始一直执行到,switch,语句的结束。,(,5,)当若干分支需要执行相同操作时,可以使多个,case,分支共用一组语句。,99,第四章 程序流程控制,例,5,:根据整型变量,dayoftheweek(0-6),值输出其表示的星期几的英语单词。,(无,break,语句),Switch(,dayoftheweek),case 0:cout,”,Sunday,”,;,case 1:cout,”,Monday,”,;,case 2:cout,”,Tuesday,”,;,case 3:cout,”,Wednesday,”,;,case 4:cout,”,Thursday,”,;,case 5:cout,”,Friday,”,;,case 6:cout,”,Saturday,”,;,default:cout,”,Unknown week day,”,;,100,第四章 程序流程控制,若,dayoftheweek,的值为,4,,,则输出结果为:,ThursdayFridaySaturdayUnknown week day,101,第四章 程序流程控制,(有,break,语句),Switch(,dayoftheweek),case 0:cout,”,Sunday,”,;,break,;,case 1:cout,”,Monday,”,;,break,;,case 2:cout,”,Tuesday,”,;,break,;,case 3:cout,”,Wednesday,”,;,break,;,case 4:cout,”,Thursday,”,;,break,;,case 5:cout,”,Friday,”,;,break,;,case 6:cout,”,Saturday,”,;,break,;,default:cout,”,Unknown week day,”,;,break,;,;,102,第四章 程序流程控制,若,dayoftheweek,的值为,4,,,则输出结果为:,Thursday,103,第四章 程序流程控制,(三),if,多分支结构和,switch,语句的改写,改写条件:,switch,语句中每个非空语句序列,的最后一个语 句为,break,语句。,104,第四章 程序流程控制,例,6,:例,5,的后一个,switch,语句可改写为,if,多分支结构,if(,dayoftheweek,=0,)cout,”,Sunday,”;,else if(,dayoftheweek,=,1,)cout,”,Monday,”;,else if(,dayoftheweek,=2,)cout,”,Tuesday,”;,else if(,dayoftheweek,=3,)cout,”,Wednesday,”;,else if(,dayoftheweek,=4,)cout,”,Thursday,”;,else if(,dayoftheweek,=5,)cout,”,Friday,”;,else if(,dayoftheweek,=6,)cout,”,Saturday,”;,else cout,”,Unknown week day,”;,105,第四章 程序流程控制,五、循环流程,(一),while,语句,1,、格式:,while,(循环条件),循环体,注:循环体是单个语句,或者是复合语句。,106,第四章 程序流程控制,2,、执行过程:,当循环条件为真时,,执行循环体,否则,退出循环。,3,、流程图(见右上图),循环条件?,循环体,Y,N,107,第四章 程序流程控制,例,7,:,#include,void main(),int sum=0;int i=1;,while(I=100),int sum=sum+i;i+;,cout,”,sum=,”,sum;,程序功能:计算并输出从,1,加到,100,的和。,输出结果:,sum=5050,108,第四章 程序流程控制,(二),dowhile,语句,1,、格式:,do,循环体,while,(循环条件),;,109,第四章 程序流程控制,2,、执行过程:,循环执行语句,,直到循环条件为假时,,退出循环。,3,、流程图(见右上图),循环体,循环条件?,Y,N,110,第四章 程序流程控制,例,8,:,#include,void main(),int sum=0;int i=1;,do,sum=sum+i;i+;,while(i=100),cout,”,sum=,”,sum;,111,第四章 程序流程控制,3,、,dowhile,语句与,while,语句唯一的区别:,while,语句的循环体有可能一次不执行。,dowhile,语句的循环体至少执行一次。,112,第四章 程序流程控制,(三),for,语句,1,、格式:,for,(循环初始化;循环条件;循环参数调整),循环体,113,第四章 程序流程控制,2,、执行过程:,(,1,)进行循环初始化;,(,2,)判断循环条件;,(,3,)如果循环条件为真,则执行循环体、对,循环参数调整,然后转向步骤(,2,);如,果循环条件为假,则结束循环。,114,第四章 程序流程控制,3,、流程图:,循环初始化,循环条件?,循环体,循环参数调整,Y,N,115,第四章 程序流程控制,例,9,:,#include,void main(),int sum=0;,for(int i=1;i=100;i+),sum=sum+i;,cout,”,sum=,”,inval;,if(inval,=,0)break;,sum=sum+inval;num+;,cout,”,sum/num=,”,inval;,if(inval,=,0)break;,if(inval 0)continue;,sum=sum+inval;num+;,cout,”,sum/num=,”,inval;,if(inval,=,0)goto loop;,sum=sum+inval;num+;,loop:cout,”,sum/num=,”,=y)return x;,else return y;,127,第五章 函数,(一)返回类型,1,、函数返回结果值的数据类型。,2,、返回类型可以是除数组以外的,任意数据类型。,3,、若函数的返回类型为,void,,,则表示此函数无返回值。,128,第五章 函数,4,、若函数有返回值,则在函数体中应,有,return,语句,:,return(,表达式,);,或,return,表达式,;,若函数无返回值,则在函数体中可,以没有,return,语句,也可以用空的,return,语句,:,return;,129,第五章 函数,(,二,),函数名,1,、函数名应是一个非保留字的标识符。,2,、函数名代表一个函数。,3,、函数命名时,应该尽量使名字能代表,函数所完成的功能。,130,第五章 函数,(三)函数参数,1,、函数参数是函数完成功能所需要的输入信息。,2,、函数参数可有,0,个或多个,参数之间用,隔开。,3,、每个函数参数由参数类型和参数名来表示;参数类型可以是任意数据类型,参数名是非保留字的标识符。,131,第五章 函数,4,、函数定义中的函数参数称为形式参数,,函数调用中的函数参数称为实在参数。,函数的形式参数和实在参数在类型和,数量上应该保持一致。,132,第五章 函数,(四)函数体,1,、函数体是函数功能的实现部分。,2,、函数体由一系列语句构成,这些语句包含在一对,中。,3,、定义在函数体中的变量或常量是局部量,只能在定义它们的函数中使用;,定义在任何函数外的变量或常量是全,局 量,它可以在所有的函数中使用。,133,第五章 函数,三、函数调用,(一)函数调用就是暂时中断现有程序,的运行,转去执行被调用函数,,当被调用函数执行结束之后,再,返回到中断处继续执行。,(二)函数调用格式:,函数名 (实在参数表),134,第五章 函数,例,2,:,#include,int max(int x,int y),if(xy)return x;else return y;,void main(),int val1,val2;cinval1val2;,coutmax(val1,val2);,135,程序功能:,从键盘输入两个整数,输出两者中较大的一个。,如:从键盘输入:,3 5,则屏幕输出:,5,注:,函数调用本身也可以看成是一个表达式。,第五章 函数,136,第五章 函数,四、程序运行时的内存分布,(一)程序的内存区域,1,、程序代码区:存放函数编译成的二,进制代码。,2,、全局数据区:存放全局变量和静态,变量。,3,、堆:存放动态数据。,4,、栈:存放局部数据。,137,第五章 函数,(二)每次进行函数调用时,内存应存放,以下信息:,1,、当前函数的运行状态和返回地址;如果是,main,函数,则保存操作系统的当前状态和返回地址。,2,、被调用函数的参数。,3,、被调用函数的局部变量。,138,第五章 函数,(三)每进行一次函数调用,系统应作,如下工作:,1,、建立被调用函数的栈空间。,2,、保存调用函数的运行状态和返回地址。,3,、将实在参数的值传递给被调用函数。,4,、将程序控制交给被调用函数。,139,第五章 函数,(四)当一个函数执行结束之后,系统,应作如下工作:,1,、如果函数有返回值,将函数的返回值放到,一个临时的变量空间。,2,、根据栈顶记录的信息,恢复调用函数的运,行状态。,3,、释放栈顶空间。,4,、根据函数的返回地址,继续调用函数的运,行。,注:,在不再需要所申请的内存空间时,一定要及时释放。,140,第五章 函数,五、函数的参数,(一)函数参数的传递,1,、,函数调用时:实在参数 形式参数,2,、函数参数的传递方式:,按值传递,按地址传递,按引用传递,141,第五章 函数,(二),main,函数的参数,1,、,main,函数一般情况下无参数。,2,、,main,函数若有参数,则规定其有两个参数,其中一个参数是字符串数组,,另一个参数是整数。字符串数组就是,输入的命令,整数就是字符串的个数。,通常这两个参数的名字称作,argc,和,argv,。,即:,void main(int argc,char*argv);,142,第五章 函数,六、,const,参数、,const,返回值与,const,函数,(一),const,参数,1,、出现在函数参数中的,const,表示在函数体中不能对这个参数做修改。,2,、,const,通常用来限制函数的指针参数、引用参数和数组参数。,如:,int strcmp(,const,char*str1,const,char*str2);,143,第五章 函数,(二),const,返回值,1,、函数返回值为,const,,只有用在函数值为,引用类型的情况。,2,、,const,返回值的函数调用不能放在赋值号,的左边。,如:,const,int,则:,min(a,b)=4;(),144,第五章 函数,(三),const,函数,1,、在函数头后面加上,const,,表示这个,函数是一个只读函数。,2,、,const,函数通常作为类的成员函数,,表示此函数不能改变类对象的成员,变量的值。,如:,void printmessage(char*msg),const,;,145,第五章 函数,七、作用域,(一)作用域就是标识符在程序中能使用的,范围。,(二),c+,中标识符的作用域与标识符的声明,位置密切相关。一个标识符的作用域一,般开始于 标识符的声明处,而结束位置,取决于标识符声明在程序中的位置。,146,第五章 函数,(三)作用域分类:,文件作用域、局部作用域、类作用域,(四)局部作用域,1,、当标识符的声明出现在函数定义中时,,它将具有局部作用域。,147,第五章 函数,2,、五种情况:,(,1,)函数参数的作用域从函数头开始到,函数定义结束。,(,2,)函数体中定义的局部变量的作用域,从变量定义开始,到函数定义结束。,148,(,3,)如果函数体中定义的局部变量定义,在一个复合语句中,则变量作用域,从变量定义开始,到该复合语句结束。,(,4,)在,for,语句的初始化表达式中定义的,变量的作用域取决于编译器的实现,,在,ANSIc+,中规定其作用域在,for,语,句范围之内。,第五章 函数,149,第五章 函数,(,5,)在函数中定义的标号语句(与,goto,语,句配合使用)的作用域是整个函数体,,因为,goto,语句可能跳转到函数内的任何,一处。,150,第五章 函数,例,3,:从键盘输入一个整数,n,,计算并输出,n!,#include,double factorial(int n)/n,作用域开始,double retVal=1;/retVal,作用域开始,for(int i=1;in;if(n,=,0)goto END;,fact=factorial(n);,cout n,”!=”,factendl;,while(1);/n,作用域结束,END:,cout,”,Thank you!n,”,;,/fact,END,作用域结束,第五章 函数,152,第五章 函数,(五)文件作用域,1,、在所有函数定义之外说明的标识符具有,文件作用域,其作用域从说明点开始,,一直延伸到文件结束。,2,、在头文件中定义的变量的作用域可以看,成从,#include,该头文件开始的位置到程,序结束。,153,例,4,:,#include /cin,cout,的作用域开始,double factorial(int n)/factorial,的作用域开始,void main(),/main,的作用域开始,/,cin,cout,,,factorial,和,main,的作用域结束。,第五章 函数,154,第五章 函数,(六)覆盖问题,1,、如果作用域重叠,则局部变量将覆盖,全局变量,作用域小的局部变量将覆,盖同名的作用域大的局部变量。,155,第五章 函数,例,5:,#include,int x;,void addx(),x+;coutxendl;,int x=5;coutxendl;,void main(),int x=10;coutxendl;,addx();coutxendl;,x+;coutxendl;,运行结果为:,10,1,5,10,11,156,第五章 函数,2,、若函数的
展开阅读全文