C++函数概述省公共课一等奖全国赛课获奖课件.pptx
《C++函数概述省公共课一等奖全国赛课获奖课件.pptx》由会员分享,可在线阅读,更多相关《C++函数概述省公共课一等奖全国赛课获奖课件.pptx(54页珍藏版)》请在咨信网上搜索。
函数概述函数概述 函数是组成函数是组成C+程序基本模块,每个函数均具有相对独程序基本模块,每个函数均具有相对独立功能。任一立功能。任一C+程序都是由若干个函数组成,即使最简单程程序都是由若干个函数组成,即使最简单程序,也要有一个主函数(即序,也要有一个主函数(即main函数)。所以,程序设计最函数)。所以,程序设计最终都落实到一个个函数设计和编写上。而合理地编写函数可终都落实到一个个函数设计和编写上。而合理地编写函数可以简化程序模块结构,便于阅读和调试,是结构化程序设计以简化程序模块结构,便于阅读和调试,是结构化程序设计方法主要内容之一。方法主要内容之一。在在C+中,关于函数规定如下:中,关于函数规定如下:(1)一个)一个C+程序由一个或多个源程序文件(程序模块)程序由一个或多个源程序文件(程序模块)组成。对较大程序,一般不希望把全部内容全放在一个文件组成。对较大程序,一般不希望把全部内容全放在一个文件中,而是将它们分别放在若干个源程序文件中,再由若干个中,而是将它们分别放在若干个源程序文件中,再由若干个源程序文件组成一个源程序文件组成一个C+程序。这么便于分别编写、分别编译,程序。这么便于分别编写、分别编译,提高调试效率。一个源程序文件可认为多个提高调试效率。一个源程序文件可认为多个C+程序共用。程序共用。1第1页(2)一个源程序文件由一个或多个函数以及其它相关内)一个源程序文件由一个或多个函数以及其它相关内容(如命令行、变量定义等)组成。一个源程序文件是一个容(如命令行、变量定义等)组成。一个源程序文件是一个编译单位,即在程序编译时是以源程序文件为单位进行编译,编译单位,即在程序编译时是以源程序文件为单位进行编译,而不是以函数为单位进行编译。而不是以函数为单位进行编译。(3)C+程序执行是从程序执行是从main函数开始,并在函数开始,并在main函数函数中结束整个程序运行。假如在中结束整个程序运行。假如在main函数中调用其它函数,则函数中调用其它函数,则在调用后流程还返回到在调用后流程还返回到main函数。函数。(4)全部函数都是平等。在定义函数时是分别进行,即)全部函数都是平等。在定义函数时是分别进行,即函数不能嵌套定义。函数间能够相互调用,但不能调用函数不能嵌套定义。函数间能够相互调用,但不能调用main函数。函数。main函数是由系统调用。函数是由系统调用。2第2页(5)从用户使用角度看,函数有以下两种。)从用户使用角度看,函数有以下两种。标准函数。标准函数即库函数,它们是由系统提供,用户无须自己标准函数。标准函数即库函数,它们是由系统提供,用户无须自己定义而直接使用。使用库函数时,必须要包含对应头文件。如例定义而直接使用。使用库函数时,必须要包含对应头文件。如例3.2中需中需要调用库函数要调用库函数sqrt()进行开平方运算,而该函数在进行开平方运算,而该函数在math.h文件中定义,所文件中定义,所以例以例3.2中增加包含命令:中增加包含命令:#include 用户自定义函数。它们是用户自己定义函数,用以实现用户专门需用户自定义函数。它们是用户自己定义函数,用以实现用户专门需要功效。要功效。(6)从函数形式看,函数分为下面两类。)从函数形式看,函数分为下面两类。无参函数。在调用无参函数时,主调函数不向被调用函数传递数据。无参函数。在调用无参函数时,主调函数不向被调用函数传递数据。无参函数普通用来执行指定一组操作。无参函数普通用来执行指定一组操作。有参函数。在调用该类函数时,主调函数经过参数向被调用函数传有参函数。在调用该类函数时,主调函数经过参数向被调用函数传递数据。普通情况下,执行有参函数会得到一个函数值,供主调函数使用。递数据。普通情况下,执行有参函数会得到一个函数值,供主调函数使用。3第3页函数定义函数定义 一个函数必须定义后才能使用。所谓定义函数,就是编写一个函数必须定义后才能使用。所谓定义函数,就是编写完成函数功效程序块。完成函数功效程序块。(1)无参函数定义)无参函数定义定义无参函数普通格式为:定义无参函数普通格式为:类型标识符类型标识符 函数名函数名(void)函数体函数体 其中:其中:(1)函数名是指用户要定义函数名字,它应符合函数名是指用户要定义函数名字,它应符合C+对标识符要求。对标识符要求。(2)函数体是由一对花括号函数体是由一对花括号“”括起来语句序列,这些语句实现函括起来语句序列,这些语句实现函数功效。数功效。(3)类型标识符是调用该函数后所得到函数值类型,即函数返回值类型,类型标识符是调用该函数后所得到函数值类型,即函数返回值类型,它能够是任一标准数据类型或导出数据类型。它能够是任一标准数据类型或导出数据类型。4第4页例例4.1 用函数实现下面字符串打印。用函数实现下面字符串打印。How do you do!算法分析:该问题只包括字符打印,不需要从主调函数算法分析:该问题只包括字符打印,不需要从主调函数传递过来数据,同时也不需要返回任何数值,所以可用无返传递过来数据,同时也不需要返回任何数值,所以可用无返回值无参数函数来实现,程序以下。回值无参数函数来实现,程序以下。void print_string(void)coutHow do you do!n;5第5页(2)有参函数定义)有参函数定义定义有参函数普通格式为:定义有参函数普通格式为:类型标识符类型标识符 函数名函数名(形参类型说明表形参类型说明表)函数体函数体 有参函数定义格式与无参函数定义格式相比,除圆括号有参函数定义格式与无参函数定义格式相比,除圆括号中中“形参类型说明表形参类型说明表”外,其余均相同。形参是函数与外界外,其余均相同。形参是函数与外界联络接口,必须明确指出形参名字和类型。形参类型说明表联络接口,必须明确指出形参名字和类型。形参类型说明表格式为:格式为:类型类型 参数参数1,类型,类型 参数参数2,类型,类型 参数参数n其中参数个数、类型由实际问题确定,参数类型可相同其中参数个数、类型由实际问题确定,参数类型可相同也可不相同。也可不相同。6第6页说明:说明:(1)定义函数时,函数类型和函数体中)定义函数时,函数类型和函数体中return后表示式后表示式值类型应保持一致。假如二者不一致,则以函数类型为准,值类型应保持一致。假如二者不一致,则以函数类型为准,系统会自动进行类型转换。系统会自动进行类型转换。(2)在函数体中允许有多个)在函数体中允许有多个return语句,但每次调用只语句,但每次调用只能有一个能有一个return 语句被执行,所以函数只能返回一个函数值。语句被执行,所以函数只能返回一个函数值。(3)对于不需要返回值函数,在函数定义中应要求函数)对于不需要返回值函数,在函数定义中应要求函数返回值类型为返回值类型为void,但在函数体中间要结束函数执行,并返,但在函数体中间要结束函数执行,并返回调用处时,可使用不带表示式回调用处时,可使用不带表示式return语句。此时语句。此时return语句语句格式为:格式为:return;7第7页例例4.2 编写一个求阶乘编写一个求阶乘m!函数。函数。算法分析:阶乘算法分析:阶乘m!定义为定义为m!=m*(m-1)*(m-2)*2*1,且要求,且要求0!=1。依据该定义,实现阶乘函数只需一个整型参数即可。若依据该定义,实现阶乘函数只需一个整型参数即可。若m0,则阶乘无定,则阶乘无定义,此时可要求函数返回义,此时可要求函数返回-1,以作为函数参数错误标志。所以,本例中能,以作为函数参数错误标志。所以,本例中能够先使用够先使用if语句对语句对m是否大于是否大于0情况作判断,给出对应结果。当情况作判断,给出对应结果。当m1时,要时,要做操作是一个连乘运算,可用循环语句实现,运算结果经过做操作是一个连乘运算,可用循环语句实现,运算结果经过return语句返语句返回。回。float fact(int m)/求求m阶乘阶乘 float product=1;if(m=1)product*=m;m-;return product;8第8页函数调用函数调用(1)函数调用格式)函数调用格式函数调用普通格式为:函数调用普通格式为:函数名函数名(实参表实参表)其中,实参表是调用函数时所提供实际参数值,这些参其中,实参表是调用函数时所提供实际参数值,这些参数值能够是常量、变量或者表示式,各实参之间用逗号数值能够是常量、变量或者表示式,各实参之间用逗号“,”分隔。调用函数时提供给函数实参应该与函数形参表中参数分隔。调用函数时提供给函数实参应该与函数形参表中参数个数和类型一一对应,且实参值一一对应传递给形参,这称个数和类型一一对应,且实参值一一对应传递给形参,这称为参数为参数“虚实结合虚实结合”。9第9页(2)函数调用方式)函数调用方式按照函数在程序中出现位置,函数调用有以下三种方式。按照函数在程序中出现位置,函数调用有以下三种方式。函数语句函数语句 在函数调用普通格式后加上分号即组成函数在函数调用普通格式后加上分号即组成函数语句。使用这种方式时,函数是没有返回值,主要完成一些语句。使用这种方式时,函数是没有返回值,主要完成一些操作。如调用例操作。如调用例4.1定义定义print_string函数完成字符串打印:函数完成字符串打印:void main(void)print_string();/A 其中其中A行是一个函数语句。行是一个函数语句。10第10页 函数表示式函数表示式 函数作为表示式中一项出现在表示式中,函数作为表示式中一项出现在表示式中,以函数返回值参加表示式运算,这种表示式称为函数表示式。以函数返回值参加表示式运算,这种表示式称为函数表示式。这种方式要求函数是有返回值。比如调用这种方式要求函数是有返回值。比如调用max函数求出函数求出a和和b最大值并将其赋给变量最大值并将其赋给变量m表示式:表示式:m=max(a,b);函数参数函数参数 函数调用能够作为另一个函数调用实际参数函数调用能够作为另一个函数调用实际参数出现。这种情况是把该函数返回值作为实参进行传送,所以出现。这种情况是把该函数返回值作为实参进行传送,所以要求该函数必须是有返回值。比如要求该函数必须是有返回值。比如max函数求函数求a、b和和c最大值,最大值,能够用下面表示式运算:能够用下面表示式运算:m=max(max(a,b),c);其中,其中,max(a,b)是一次函数调用,它值作为是一次函数调用,它值作为max函数函数另一次调用实参。最终另一次调用实参。最终m值是值是a、b和和c最大者。最大者。11第11页(3)函数调用过程)函数调用过程一个一个C+程序经过编译后生成可执行代码,形成后缀为程序经过编译后生成可执行代码,形成后缀为exe可执行文件,存放在外存放器中,当程序被执行时,首先可执行文件,存放在外存放器中,当程序被执行时,首先从外存将程序代码加载到内存代码区,然后从从外存将程序代码加载到内存代码区,然后从main函数起始函数起始处(入口地址)开始执行。程序在执行过程中假如碰到了对处(入口地址)开始执行。程序在执行过程中假如碰到了对其它函数调用,则暂停当前函数执行,保留下一条指令地址其它函数调用,则暂停当前函数执行,保留下一条指令地址(即返回地址,作为从被调用函数返回后继续执行入口点),(即返回地址,作为从被调用函数返回后继续执行入口点),并保留现场相关参数,然后转到被调用函数入口地址,执行并保留现场相关参数,然后转到被调用函数入口地址,执行被调用函数。在被调用函数体中当碰到被调用函数。在被调用函数体中当碰到return语句或被调用函语句或被调用函数结束时,则恢复先前保留现场,并从先前保留返回地址开数结束时,则恢复先前保留现场,并从先前保留返回地址开始继续执行主调函数剩下语句,直到结束。始继续执行主调函数剩下语句,直到结束。12第12页函数调用过程函数调用过程13第13页传值调用传值调用 调用函数时,将实参值传递给形参方式称为传值结合,调用函数时,将实参值传递给形参方式称为传值结合,又称为传值调用,简称值调用。值调用特点是函数调用时实又称为传值调用,简称值调用。值调用特点是函数调用时实参仅将其值赋给形参,所以,在函数中对形参任何操作都不参仅将其值赋给形参,所以,在函数中对形参任何操作都不会影响到实参值,即传值调用是单方向进行。会影响到实参值,即传值调用是单方向进行。14第14页例例4.6交换两个变量值。交换两个变量值。void swap(float x,float y)float t;t=x;x=y;y=t;void main(void)float a=10,b=20;cout交换前交换前:a=atb=bn;swap(a,b);cout交换后交换后:a=atb=bn;因为在函数因为在函数swap()中交换是两个形参中交换是两个形参x和和y值,但交换结果并不能改变实参值,但交换结果并不能改变实参a和和b值,所以调用值,所以调用swap()函数后,变量函数后,变量a和和b值仍为原来值。所以本例是一个值仍为原来值。所以本例是一个关于处理关于处理“交换两个变量值交换两个变量值”问题失问题失败例子。败例子。15第15页引用调用引用调用 引用是引用是C+中一个特殊类型变量,其本质是给一个已定中一个特殊类型变量,其本质是给一个已定义变量起一个别名,系统不为引用变量分配内存空间,而是义变量起一个别名,系统不为引用变量分配内存空间,而是要求引用变量和与其相关联变量使用同一个内存空间。所以,要求引用变量和与其相关联变量使用同一个内存空间。所以,经过引用变量名和经过与其相关联变量名访问变量效果是一经过引用变量名和经过与其相关联变量名访问变量效果是一样。样。定义引用变量格式为:定义引用变量格式为:类型标识符类型标识符&引用变量名引用变量名=变量名变量名;比如:比如:int i,&refi=i;C+引入引用变量主要目标是为方便函数间数据传递,引入引用变量主要目标是为方便函数间数据传递,在应用中主要是作为函数参数。在应用中主要是作为函数参数。16第16页例例4.7 利用引用编写实现利用引用编写实现“交换两个变量值交换两个变量值”函数。函数。#include void swap(float&x,float&y)float t;t=x;x=y;y=t;void main(void)float a=10,b=20;cout交换前交换前:a=atb=bn;swap(a,b);cout交换后交换后:a=atb=bn;在调用在调用swap()函数后,函数后,swap()函数完成了交换函数完成了交换a和和b两个变量值功效。这是因为函数参数是引用变量两个变量值功效。这是因为函数参数是引用变量(x是是a引用,引用,y是是b引用),所以在函数中实质上是引用),所以在函数中实质上是对引用关联变量对引用关联变量a和和b进行操作,即调用进行操作,即调用swap()函数函数时实参时实参a和和b值随引用型形参值随引用型形参x和和y一起改变。所以,一起改变。所以,假如函数形参是引用类型,则函数实参加形参间数假如函数形参是引用类型,则函数实参加形参间数据传递是双向。据传递是双向。17第17页函数原型说明函数原型说明 函数定义能够放在主调函数(如函数定义能够放在主调函数(如main函数)后面,此时,函数)后面,此时,需要在主调函数体中增加对所调用函数引用性申明,即函数需要在主调函数体中增加对所调用函数引用性申明,即函数原型说明。函数原型说明普通形式为:原型说明。函数原型说明普通形式为:函数类型标识符函数类型标识符 函数名函数名(形参类型说明表形参类型说明表);其中各部分意义与函数定义相同。其中各部分意义与函数定义相同。说明:说明:(1)函数原型说明与函数定义区分在于:函数原型说明没有函数体部)函数原型说明与函数定义区分在于:函数原型说明没有函数体部分,用分号结束,就像变量申明。分,用分号结束,就像变量申明。(2)函数原型说明位置能够在主调函数体内,也能够在主调函数外,)函数原型说明位置能够在主调函数体内,也能够在主调函数外,只要放在对该函数调用语句之前,即使函数定义放在其调用语句之后,也只要放在对该函数调用语句之前,即使函数定义放在其调用语句之后,也不会引发编译失败。不会引发编译失败。(3)函数原型说明时,形参类型说明表中能够缺省形参变量名,只给)函数原型说明时,形参类型说明表中能够缺省形参变量名,只给出形参类型。出形参类型。18第18页例例4.9求两数中大数。求两数中大数。#include float max(float,float);/A void main(void)float x,y;coutxy;cout两数中大数是两数中大数是:max(x,y)b?a:b);19第19页函数递归调用函数递归调用 在调用一个函数时,在该函数函数体内又调用另一个函在调用一个函数时,在该函数函数体内又调用另一个函数情况称为函数嵌套调用,这种情况数情况称为函数嵌套调用,这种情况C+是允许。当一个函数是允许。当一个函数在它函数体内直接或间接调用它本身时称为递归调用,这种在它函数体内直接或间接调用它本身时称为递归调用,这种函数称为递归函数。函数称为递归函数。20第20页float f(float x)float y;y=f(x);return y;这个函数是一个递归函数。不过运行该函数将无休止地这个函数是一个递归函数。不过运行该函数将无休止地调用其本身,这当然是不正确。为了预防递归调用无终止地调用其本身,这当然是不正确。为了预防递归调用无终止地进行,必须在函数体内有终止递归调用伎俩。这可用进行,必须在函数体内有终止递归调用伎俩。这可用if语句来语句来控制,只有满足某一条件时才继续执行递归,不然就不再作控制,只有满足某一条件时才继续执行递归,不然就不再作递归调用。递归调用。21第21页用递归方法计算用递归方法计算n!程序以下:程序以下:float fact(int n)float p;if(n1)p=n*fact(n-1);/Breturn p;void main(void)int n;coutn;coutn!=fact(n)n;/C22第22页利用递归方法求解问题时,普通须注意三点:其一,存利用递归方法求解问题时,普通须注意三点:其一,存在递归公式,在本例中为在递归公式,在本例中为n*(n1)!;其二,含有递归结束条;其二,含有递归结束条件,本例中是件,本例中是0或或1阶乘为阶乘为1;其三,存在递归约束条件,本例;其三,存在递归约束条件,本例中为中为n0。23第23页例例4.11 阅读下面程序,分析程序运行结果。阅读下面程序,分析程序运行结果。void recu(char c)coutc;if(c3)recu(c+1);coutb?a:b);void main(void)float x,y;coutxy;cout两数中大数是两数中大数是:max(x,y)n;26第26页使用内联函数时应注意以下几点。使用内联函数时应注意以下几点。(1)在在C+中,除在函数体内含有循环、中,除在函数体内含有循环、switch分支和分支和复杂嵌套复杂嵌套if语句外,全部函数均可定义为内联函数。语句外,全部函数均可定义为内联函数。(2)内联函数也要定义在前,调用在后,且形参加实参内联函数也要定义在前,调用在后,且形参加实参之间也要一一对应。这是因为编译器在对函数调用语句进行之间也要一一对应。这是因为编译器在对函数调用语句进行代换时,必须事先知道代换该语句代码是什么。代换时,必须事先知道代换该语句代码是什么。(3)对于用户指定内联函数,编译器是否作为内联函数对于用户指定内联函数,编译器是否作为内联函数来处理由编译器自行决定。说明内联函数时,只是请求编译来处理由编译器自行决定。说明内联函数时,只是请求编译器当出现这种函数调用时,作为内联函数扩展来实现,而不器当出现这种函数调用时,作为内联函数扩展来实现,而不是命令编译器必须要这么去做。是命令编译器必须要这么去做。(4)内联函数实质是采取以空间换取时间方法,即可加内联函数实质是采取以空间换取时间方法,即可加速程序执行,当出现屡次调用同一内联函数时,程序本身占速程序执行,当出现屡次调用同一内联函数时,程序本身占用空间将有所增加。所以,在详细编程时应权衡时间开销与用空间将有所增加。所以,在详细编程时应权衡时间开销与空间开销之间矛盾,以确定是否采取内联函数。空间开销之间矛盾,以确定是否采取内联函数。27第27页函数重载函数重载 函数重载是指完成不一样功效函数,即一组参数和返回函数重载是指完成不一样功效函数,即一组参数和返回值不一样函数共用一个函数名。值不一样函数共用一个函数名。C+语言提供了两种重载:函语言提供了两种重载:函数重载和运算符重载。数重载和运算符重载。因为重载函数含有相同函数名,当经过函数名调用重载因为重载函数含有相同函数名,当经过函数名调用重载函数时,函数时,C+编译器是怎样确定应该调用哪一个函数呢编译器是怎样确定应该调用哪一个函数呢?编译编译器是依据函数实参类型和个数来确定应该调用哪一个函数。器是依据函数实参类型和个数来确定应该调用哪一个函数。所以,重载函数之间必须在参数类型或个数方面有所不所以,重载函数之间必须在参数类型或个数方面有所不一样。只有返回值类型不一样函数不是重载函数。一样。只有返回值类型不一样函数不是重载函数。28第28页例例4.13 重载求绝对值函数,实现求整数、单精度数和双精度数绝对值重载求绝对值函数,实现求整数、单精度数和双精度数绝对值int abs(int x)/A if(x0)return(-x);else return(x);float abs(float x)/B return(x0?-x:x);double abs(double x)/C return(x0?-x:x);void main(void)int a;float b;double c;coutabc;cout它们绝对值分别是它们绝对值分别是:n;coutabs(a)=abs(a)n;coutabs(b)=abs(b)n;coutabs(c)=abs(c)n;29第29页带有默认参数函数带有默认参数函数 C+允许在函数申明或函数定义时为参数预赋一个或多允许在函数申明或函数定义时为参数预赋一个或多个默认值,这么函数就叫做带有默认参数函数(又称为含有个默认值,这么函数就叫做带有默认参数函数(又称为含有缺省参数函数)。在调用带有默认参数函数时,假如为对应缺省参数函数)。在调用带有默认参数函数时,假如为对应参数指定了参数值,则参数将使用该值;不然参数使用其默参数指定了参数值,则参数将使用该值;不然参数使用其默认值。认值。30第30页例例4.14 利用带有默认参数函数编写计算长方体体积程序。利用带有默认参数函数编写计算长方体体积程序。#includefloat v(float a,float b=10,float c=20)/A return a*b*c;void main(void)float x,y,z;coutxyz;cout第一个长方体体积为第一个长方体体积为:v(x,y,z)n;coutxy;cout第二个长方体体积为第二个长方体体积为:v(x,y)n;/B coutx;cout第三个长方体体积为第三个长方体体积为:v(x)n;/C31第31页使用带有默认参数函数时应注意:使用带有默认参数函数时应注意:(1)默认参数申明必须出现在函数调用之前。即:假如)默认参数申明必须出现在函数调用之前。即:假如存在函数原型申明,则参数默认值应在函数原型申明中指定,存在函数原型申明,则参数默认值应在函数原型申明中指定,不然在函数定义中指定。假如函数原型中已给出了参数默认不然在函数定义中指定。假如函数原型中已给出了参数默认值,则在函数定义中不得重复指定,即使所指定默认值完全值,则在函数定义中不得重复指定,即使所指定默认值完全相同也不行。相同也不行。(2)默认参数个数不限,但全部默认参数均须放在参数)默认参数个数不限,但全部默认参数均须放在参数表最终,即默认参数在参数表中应从右向左依次安排。表最终,即默认参数在参数表中应从右向左依次安排。32第32页局部变量局部变量局部变量也称为内部变量,它是指在函数中定义变量,局部变量也称为内部变量,它是指在函数中定义变量,其作用域只在本函数范围内。其作用域只在本函数范围内。float f1(int a)int b,c;.float f2(int x,int y)int i,j;.void main(void)int m,n;.x,y,i,j 有效有效a,b,c有效有效m,n有效有效33第33页说明:说明:(1)主函数中定义变量也只能在主函数中使用,不能在其它函数)主函数中定义变量也只能在主函数中使用,不能在其它函数中使用。同时,主函数中也不能使用其它函数中定义变量。因为主函数也中使用。同时,主函数中也不能使用其它函数中定义变量。因为主函数也是一个函数,它与其它函数是平行关系。是一个函数,它与其它函数是平行关系。(2)形参变量是属于被调函数局部变量。如上面函数)形参变量是属于被调函数局部变量。如上面函数f1中形参中形参a,它只在它只在f1中有效,其它函数能够调用中有效,其它函数能够调用f1函数,但不能引用函数,但不能引用f1中形参中形参a。(3)允许在不一样函数中使用相同变量名。不一样函数中定义同)允许在不一样函数中使用相同变量名。不一样函数中定义同名变量作用域被限制于各自函数体内,它们代表不一样对象,系统为它们名变量作用域被限制于各自函数体内,它们代表不一样对象,系统为它们分配不一样存放单元,互不干扰,也不会发生混同。如上面函数分配不一样存放单元,互不干扰,也不会发生混同。如上面函数f1中变量中变量b、c也可换用也可换用y、z,尽管它们与,尽管它们与f2函数中定义变量重名,但它们占有不一函数中定义变量重名,但它们占有不一样存放单元,不会发生混同。样存放单元,不会发生混同。(4)在复合语句中也可定义变量,也属于局部变量,其作用域只)在复合语句中也可定义变量,也属于局部变量,其作用域只在复合语句范围内。当复合语句中出现与其外部同名变量时,在复合语句在复合语句范围内。当复合语句中出现与其外部同名变量时,在复合语句内则由复合语句定义变量起作用。内则由复合语句定义变量起作用。34第34页例例4.15 分析下面程序输出。分析下面程序输出。#includevoid main()int a=2,b=3;coutfirst:atbn;/A int a=5;b=a*3;coutsecond:atbn;/B a+=b;/C coutthird:atbn;程序输出是:程序输出是:first:2 3 second:5 15 third:17 1535第35页全局变量全局变量 全局变量也称为外部变量,它是在函数外部定义变量,全局变量也称为外部变量,它是在函数外部定义变量,其作用域是整个源程序。其作用域是整个源程序。p,q有效有效int p=1,q=5;float f1(int a)int b,c;.char c1,c2;main()int m,n;.a,b,c有效有效m,n有效有效c1,c2有效有效36第36页说明:说明:(1)全局变量增加了函数间数据联络通道。因为同一文)全局变量增加了函数间数据联络通道。因为同一文件中全部函数都能引用全局变量,所以如果在一个函数中改件中全部函数都能引用全局变量,所以如果在一个函数中改变了全局变量值,就能影响到其它函数,相当于各个函数间变了全局变量值,就能影响到其它函数,相当于各个函数间有直接传递通道。所以,可以利用这一特点经过函数调用能有直接传递通道。所以,可以利用这一特点经过函数调用能得到一个以上值,而一般函数调用只能由得到一个以上值,而一般函数调用只能由return语句带回一个语句带回一个返回值。返回值。(2)全局变量可认为全部函数所共用,使用灵活方便,)全局变量可认为全部函数所共用,使用灵活方便,但滥用全局变量会破坏程序模块化结构,使程序难于了解和但滥用全局变量会破坏程序模块化结构,使程序难于了解和调试。所以要尽可能少用或不用全局变量。调试。所以要尽可能少用或不用全局变量。(3)若在同一源文件中全局变量与局部变量同名,则在)若在同一源文件中全局变量与局部变量同名,则在局部变量作用范围内全局变量不起作用,即被局部变量作用范围内全局变量不起作用,即被“屏蔽屏蔽”。37第37页例例4.17 全局变量与局部变量同名。全局变量与局部变量同名。#includeint a=10;/全局变量全局变量aint f1(int a)/形参形参areturn a*a;int f2(int b)int a;/局部变量局部变量a a=b+1;return a*a;void main(void)coutThe result of f1 is:f1(2)n;coutThe result of f2 is:f2(2)n;couta=an;该程序运行结果为:该程序运行结果为:The result of f1 is:4The result of f2 is:9a=1038第38页假如在函数中要使用与其局部变量同名全局变量,能够使假如在函数中要使用与其局部变量同名全局变量,能够使用作用域运算符用作用域运算符“:”来限定全局变量。来限定全局变量。例例4.18 在局部变量作用域内引用同名全局变量。在局部变量作用域内引用同名全局变量。#include double x=1.5;void main(void)double x=5;cout全局变量全局变量:xn;/A cout局部变量局部变量:xn;该程序运行结果为:该程序运行结果为:全局变量全局变量:5局部变量局部变量:1.539第39页变量存放方式变量存放方式 从变量值存在时间(生存期)角度来分,可将变量分为从变量值存在时间(生存期)角度来分,可将变量分为静态变量和动态变量两类。静态变量和动态变量两类。所谓静态变量是指在程序运行期间由系统分配固定存放所谓静态变量是指在程序运行期间由系统分配固定存放空间变量。而动态变量则是在程序运行期间依据需要系统动空间变量。而动态变量则是在程序运行期间依据需要系统动态分配存放空间变量。变量存放类反应了变量占用内存空间态分配存放空间变量。变量存放类反应了变量占用内存空间情况。情况。一个程序在内存占用存放空间能够分为三个部分:程序一个程序在内存占用存放空间能够分为三个部分:程序区、静态存放区和动态存放区,见图区、静态存放区和动态存放区,见图4.6。40第40页auto型变量型变量 在定义局部变量时,用关键字在定义局部变量时,用关键字auto修饰变量称为自动类修饰变量称为自动类型变量。自动类型变量属于动态变量。对于这种变量,在函型变量。自动类型变量属于动态变量。对于这种变量,在函数执行期间,当执行到变量作用域开始处时,系统动态地为数执行期间,当执行到变量作用域开始处时,系统动态地为变量分配存放空间;当执行到变量作用域结束处时,系统收变量分配存放空间;当执行到变量作用域结束处时,系统收回这种变量所占用存放空间。因为回这种变量所占用存放空间。因为C+编译器默认局部变量为编译器默认局部变量为自动类型变量,所以在实际应用中,自动类型变量,所以在实际应用中,当说明局部变量时,普当说明局部变量时,普通不使用关键字通不使用关键字auto来修饰变量。来修饰变量。int fun(int n)auto int a;float b;对于自动类型变量,若没有明对于自动类型变量,若没有明确地赋初值时,其初值是不确确地赋初值时,其初值是不确定。如上面变量定。如上面变量a和和b都没有确都没有确定初值。定初值。41第41页static型变量型变量(1)静态局部变量)静态局部变量对于静态局部变量,系统在程序开始执行时为这种变量分对于静态局部变量,系统在程序开始执行时为这种变量分配存放空间,当调用函数并执行函数体后,系统并不收回这配存放空间,当调用函数并执行函数体后,系统并不收回这些变量所占用存放空间,当再次调用函数时,变量仍使用原些变量所占用存放空间,当再次调用函数时,变量仍使用原来分配存放空间,所以这种变量仍保留上一次函数调用结束来分配存放空间,所以这种变量仍保留上一次函数调用结束时值。时值。42第42页例例4.19 考查静态局部变量值。考查静态局部变量值。#includeint fun(void)static int i=10;int a=1;i+=a;return i;void main(void)cout第一次调用第一次调用i=fun()n;cout第二次调用第二次调用i=fun()n;程序运行结果为:程序运行结果为:第一次调用第一次调用i=11 第二次调用第二次调用i=1243第43页关于静态局部变量须说明以下几点:关于静态局部变量须说明以下几点:静态局部变量是在编译时赋初值,即只赋初值一次,静态局部变量是在编译时赋初值,即只赋初值一次,在程序运行时它已经有初值。以后每次调用函数时不再重新在程序运行时它已经有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时值。而自动变量赋初赋初值而只是保留上次函数调用结束时值。而自动变量赋初值是在函数调用时进行,且每调用一次函数就重新初始化一值是在函数调用时进行,且每调用一次函数就重新初始化一次,如上例中变量次,如上例中变量a。定义静态局部变量时,若没有明确地赋初值,则编译定义静态局部变量时,若没有明确地赋初值,则编译时系统自动赋以初值时系统自动赋以初值0(对数值型变量)或空字符(对数值型变量)或空字符0(对字(对字符变量)。符变量)。静态局部变量在函数调用结束后即使仍存在,但因为静态局部变量在函数调用结束后即使仍存在,但因为变量作用域所限,其它函数是不能引用它。变量作用域所限,其它函数是不能引用它。44第44页(2)静态全局变量)静态全局变量全局变量属于静态变量,其缺省初值总为全局变量属于静态变量,其缺省初值总为0。在定义全局。在定义全局变量时加上修饰词变量时加上修饰词static,则表示所定义变量仅限于这个源程,则表示所定义变量仅限于这个源程序文件内使用,而不能被其它文件引用。序文件内使用,而不能被其它文件引用。45第45页例例4.20 限定全局变量作用域。限定全局变量作用域。假定一程序由源文件假定一程序由源文件file1.cpp和源文件和源文件file2.cpp组成组成,其中源文件,其中源文件file1.cpp内容为:内容为:#include static int a=10;int b;extern void fun(void);/申明函数申明函数fun()是在其它文件中定义是在其它文件中定义 void main()fun();源文件源文件file2.cpp内容为:内容为:extern int a;/申明申明a是在其它文件中定义全局变量是在其它文件中定义全局变量extern int b;/申明申明b是在其它文件中定义全局变量是在其它文件中定义全局变量 void fun(void)a+=2;/A b*=10;/B couta=anb=bn;46第46页在程序设计中,常由若干个人分别完成一程序不一样模在程序设计中,常由若干个人分别完成一程序不一样模块,为了时每个人独立地在其设计文件中使用相同全局变量块,为了时每个人独立地在其设计文件中使用相同全局变量名而互不干扰,只需在每个文件中全局变量前加上名而互不干扰,只需在每个文件中全局变量前加上static即可。即可。这就为程序模块化、通用性提供方便。这就为程序模块化、通用性提供方便。假如其它文件不需要引用本文件全局变量,能够对本文假如其它文件不需要引用本文件全局变量,能够对本文件中全局变量都加上件中全局变量都加上static,成为静态全局变量,以免被其它,成为静态全局变量,以免被其它文件误用。文件误用。47第47页register型变量型变量 为了提升效率,为了提升效率,C+语言允许将局部变量值存放在语言允许将局部变量值存放在CPU存存放器中,这种变量称为存放器类型变量,用关键字放器中,这种变量称为存放器类型变量,用关键字reg- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 函数 概述 公共课 一等奖 全国 获奖 课件
咨信网温馨提示:
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【精****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【精****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【精****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【精****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
关于本文