资源描述
,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,C+,程序设计,第,3,章,(1),函数的定义和调用,1,主要内容,函数概述,函数的定义,函数的调用和返回,函数的参数传递值传递,函数的参数传递引用传递,函数的原型声明,全局变量及其作用域,局部变量及其作用域,C+,程序的内存布局,标识符的作用域块作用域、文件作用域、函数原型作用域、函数作用域,变量的存储类型和生存期,函数的调用机制,2,函数概述,关于,C+,函数:,C+,程序的结构化特点:,就是整个程序由一个或多个函数组成,每个函数具有相对独立的功能,函数之间有明显的界面,程序整体具有清晰的模块结构,易于修改。,C+,函数有两大类:,一类是系统预定义的,称为库函数或标准函数,这些库函数按照不同的功能进行分类,集中定义在不同的头文件中,用户只要在自己的程序中包含某个头文件,就可直接使用该头文件中定义的函数。另一类是用户自定义函数,用户可以根据需要将程序中某个具有相对独立功能的程序段定义为函数。,C+,程序的基本模块:,就是函数,任何一个,C+,程序均由若干个函数组成,其中有且仅有一个主函数,它是程序执行的入口函数,,VC+,控制台编程是由用户定义的,main(),作为入口函数,,Windows,编程是由编译器定义的,WinMain,(),作为入口函数。,3,函数概述,C+,函数之间是并列平等的关系,在程序中的定义位置任意,一个函数可以调用其它函数,也可以被其他函数所调用,但主函数只能调用其他函数,而不能被调用。,函数定义的并列关系 函数调用的层次关系,void f1(),f1,的函数体,void f2(),f2,的函数体,void main(),main,的函数体,void f3(),f3,的函数体,void f4(),f4,的函数体,void f5(),f5,的函数体,main(),f1(),f2(),f3(),f4(),f6(),4,函数的定义,函数的定义,:,格式:,返回值类型,函数名,(,类型,1,形参,1,,,类型,2,形参,2,,,,,类型,n,形参,n,),语句序列,说明:,返回值类型,可以是,C+,中任意基本数据类型、已定义的构造数据类型;,若函数没有返回值,则返回值类型定义为,void,型;,若函数返回值类型省略,表示返回值类型为,int,型。,函数体,函数头,5,函数的定义,函数名,按标识符命名规则命名,其后括号内定义的是函数的形式参数;,若该函数为无参函数,括号内的,void,通常省略不写,但括号不能省略!,形式参数表,列出所有形式参数的数据类型、参数名称;,各参数即使类型相同,也必须分别进行类型说明;,形参类型可以是,C+,中任意基本数据类型、已定义的构造数据类型。,函数参数的作用:,函数调用时,主调函数通过参数将数据传递给被调函数。,函数返回值的作用:,函数返回时,被调函数可将一个确定的值带回到主调函数。,若函数有返回值,则,return,语句格式为:,return,表达式;,且,return,后面表达式值的类型必须与函数返回值类型相匹配!,若函数无返回值,则返回值类型定义为,void,,且,return,语句格式为:,return,;,6,函数的调用和返回,函数的调用:,格式:,函数名,(,实参,1,,,实参,2,,,,,实参,n,),调用:,就是控制从主调函数转去执行被调函数的函数体。调用时,系统要将实参值按位置传递给对应的形参,因此,一般情况下实参与形参在个数、排列顺序上都必须一一对应,且类型匹配。,函数的返回:,就是控制从被调函数返回到主调函数的调用点。返回时,即在被调函数中执行到,return,语句时,若有返回值带回,则先计算,return,语句后面表达式的值,并转换成所规定的返回值类型,此时系统会在内存中建立一个临时变量,用来存放该返回值,待主调函数中包含该调用式的表达式语句从该临时变量中取值后,系统便撤消该临时变量。,7,【,例,】,(定义求三个实数中最大数的函数,max(),。),#include,float,max(,float x,float y,float z,),/,要将三个实数传递给,max(),函数,需定义三个形参。,float t=yz?y:z;,return,(xt?x:t),;,void main(),float a,b,c;,cout,a b c;,cout,“,最大数:,”,max(,a,b,c,),endl,;,运行:,请输入三个实数:,13 56 -89 ,最大数:,56,main(),函数,调用,max(13,56,-89),main(),函数的后续语句,函数,max(13,56,-89),return 56,主调函数,被调函数,8,函数的参数传递,形参与实参:,函数定义时,写在函数头部参数表中的变量,称为形式参数(形参)。,函数调用时,写在调用式参数表中的表达式、变量、常量,称为实在参数(实参),形参与实参的结合:,编译时,并不为各函数的形参分配存储空间,只有在该函数被调用时,其形参才占用存储空间,并通过堆栈从主调函数中获得值,这个过程称为形参与实参的结合,一旦函数调用结束,该函数的形参就被撤销。,函数的参数传递方式有三种:,值传递,引用传递,地址传递,9,函数的参数传递,值传递,值传递:,调用函数进行,值传递,时,调用式中对应的,实参可以是常量、变量、表达式,。,先计算出各个实参表达式的值,并将值赋给对应的形参变量,其过程就是赋值,因此,要求实参值的类型与形参变量类型,符合赋值兼容,。,由于值传递就是赋值传递,因此是,单向传递,,即实参值传递给形参变量后,若形参变量的值发生变化不会影响到对应的实参变量。,【,例,】,#include,void swap(,int,a,int,b,),int,t=a;a=b;b=t;,void main(),int,x,y ;,cout,x y;,cout,“,调用前:,x=”,x,“,ty,=”,y,endl,;,swap(,x,y,);,cout,“,调用后:,x=”,x,“,ty,=”,y,endl,;,运行:,请输入两个整数:,58 97,调用前:,x=56 y=97,调用后:,x=56 y=97,10,【,例,】,#include,int,maxi(,int,a,int,b ),return ab?a:b;,float,maxf,(float a,float b ),return ab?a:b;,void main(void ),float x=3.4,y=5.6;,char c1=A,c2=B;,int,i=20,j=30;,cout,maxi(x,y),t;,cout,maxf,(x,y),t;,cout,maxi(c1,c2),t;,cout,maxf,(c1,c2),t;,cout,maxi(,i+j,45+y),t;,cout,maxf,(,i+j,45+y),endl,;,运行:,5 5.6 66,66,50 55.6,float x=3.4,int,a=3,float y=5.6,int,b=5,float x=3.4,float a=3.4,float y=5.6,float b=5.6,char c1=A,int,a=65,char c2=B,int,b=66,char c1=A,float a=65,char c2=B,float b=66,表达式,i+j,值,50,,,int,型,int,a=50,表达式,45+y,值,50.6,,,float,型,int,b=50,表达式,i+j,值,50,,,int,型,float a=50,表达式,45+y,值,50.6,,,float,型,float b=50.6,11,函数的参数传递,引用传递,引用类型:,是,C+,中一种特殊的数据类型,,定义引用类型变量,其本质是给一个已定义的变量起一个别名,系统并不为引用类型变量分配内存空间,引用类型变量与其相关联的变量使用的是同一个内存空间。,引用类型变量的定义:,格式:,&,=,功能:,定义一个引用类型变量,必须同时对其进行初始化,使之与一个已定义过的同类型变量相关联,即给该已定义过的变量起一个别名。,【,例,】,#include,void main(),int,x=5 ;,int,&,x1,=,x,;,int,x2=x;,x1+=2,;,cout,“x=”,x,“tx1=”,x1,“tx2=”,x2,endl,;,5,7,x,x1,5,x2,运行:,x=7 x1=7 x2=5,12,函数的参数传递,引用传递,引用类型变量可以作为函数的形参,以实现参数的引用传递。,【,例,】,void swap(,int,&,a,int,&,b,),int,t=a;a=b;b=t;,引用传递:,调用函数时,系统对引用类型的形参是,不分配,存储空间的,其本质是给对应的实参变量起一个别名。,进行,引用传递,时,调用式中对应的,实参只能是变量,。,引用传递时传递的是变量名,引用类型的形参变量与其相关联的实参变量使用的是同一个存储空间,若引用类型的形参变量的值发生变化,其相关联的实参变量的值也就随之变化,因此是,双向传递,。,13,【,例,】,(值传递),#include,void swap(,int,a,int,b,),int,t=a;a=b;b=t;,void main(),int,x=5,y=10 ;,cout,“,调用前:,x=”,x,“,ty,=”,y,endl,;,swap(,x,y,);,cout,“,调用后:,x=”,x,“,ty,=”,y,endl,;,【,例,】,(引用传递),#include,void swap(,int,&,a,int,&,b,),int,t=a;a=b;b=t;,void main(),int,x=5,y=10 ;,cout,“,调用前:,x=”,x,“,ty,=”,y,endl,;,swap(,x,y,);,cout,“,调用后:,x=”,x,“,ty,=”,y,endl,;,运行:,调用前:,x=5 y=10,调用后:,x=10 y=5,引用传递:,main(),:,swap(),:,x,a,10,y,b,5,5,10,运行:,调用前:,x=5 y=10,调用后:,x=5 y=10,值传递:,main(),:,swap(),:,x,a,10,y,b,5,5,10,5,10,14,函数的原型声明,函数的原型声明:,C+,中,把函数的定义部分称为函数的定义性声明,而把对函数的引用性声明称为函数的原型声明。,当函数定义在前、调用在后时,可直接调用;当函数调用在前、定义在后时,在函数被调用前,必须对被调函数作原型声明,函数原型声明可放在主,调函数中,也可放在所有函数之外。,函数原型声明的目的是告知编译系统,该函数的返回值类型、参数个数、顺序、各参数的类型,以便编译系统对其后该函数调用式是否有效进行语法检查。,函数原型声明的格式:,格式,1,:,函数头,+,末尾加分号,返回值类型,函数名,(,类型,1,形参,1,,,类型,2,形参,2,,,,,类型,n,形参,n,),;,格式,2,:,函数头(去掉形参变量名),+,末尾加分号,返回值类型,函数名,(,类型,1,,,类型,2,,,,,类型,n,),;,15,【,例,】,(,输入一个,8,位二进制数,将其转换为十进制数输出。例:若输入,11010001,,,1101,0001,2,=,1(2,7,)+1(2,6,)+0(2,5,)+,1,(2,4,),+0,(2,3,)+,0,(2,2,)+,0,(2,1,)+,1,(2,0,),=,209,10,,输出,209,。),#include,void main(),double,power,(,double,int,),;,/power(),函数的引用性声明,即原型声明,int value=0,k,;,char,c,;,cout=0,;,i-,),cin c,;,if,(,c=,1,),value+
展开阅读全文