《第03章函数.ppt》由会员分享,可在线阅读,更多相关《第03章函数.ppt(36页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第03章函数章函数本章内容安排本章内容安排&函数的概念函数的概念&函数的声明与定义函数的声明与定义&函数中的变量函数中的变量&函数返回值函数返回值&默认参数默认参数&函数重载函数重载&内联函数内联函数2什么是函数什么是函数&函数是函数是C+C+程序的基本构成单元,函数对数据执程序的基本构成单元,函数对数据执行操作并返回处理结果。行操作并返回处理结果。3什么是函数什么是函数?&每个程序中有且仅有每个程序中有且仅有1 1个个mainmain函数,其它函数可函数,其它函数可根据需要定义。根据需要定义。程序运行时,系统会调用程序运行时,系统会调用mainmain函数,函数,mainmain函数执行结
2、函数执行结束后整个程序结束。束后整个程序结束。mainmain函数可调用其它函数,函数之间可以相互调用。函数可调用其它函数,函数之间可以相互调用。每个函数都有名称,可用于调用它。每个函数都有名称,可用于调用它。函数被调用后,执行其中的语句,语句执行完或遇到函数被调用后,执行其中的语句,语句执行完或遇到returnreturn后返回到调用该函数的地方继续执行。后返回到调用该函数的地方继续执行。4本章内容安排本章内容安排&函数的概念函数的概念&函数的声明与定义函数的声明与定义&函数中的变量函数中的变量&函数返回值函数返回值&默认参数默认参数&函数重载函数重载&内联函数内联函数5函数的声明函数的声明
3、&函数在使用前必须被声明。函数的声明将函数的函数在使用前必须被声明。函数的声明将函数的名称、返回的数据类型、函数参数类型告知编译器。名称、返回的数据类型、函数参数类型告知编译器。int findArea(int length,int width);int findArea(int length,int width);函数的返回类型:函数的返回类型:intint 函数名称:函数名称:findAreafindArea 函数的参数列表:类型为函数的参数列表:类型为intint的的2 2个参数个参数lengthlength和和widthwidthp函数的声明是函数的声明是1 1条语句,要以分号结尾。声
4、明也叫原型,不条语句,要以分号结尾。声明也叫原型,不 包含任何代码。包含任何代码。p函数可返回任意函数可返回任意C+C+数据类型。如果函数不返回值,将返回数据类型。如果函数不返回值,将返回 类型写为类型写为voidvoid,而不是空缺。,而不是空缺。p函数名称、参数及其排列顺序构成了函数的签名,函数签名函数名称、参数及其排列顺序构成了函数的签名,函数签名 唯一地标识了一个特定的函数。唯一地标识了一个特定的函数。6函数的定函数的定义&函数的定义给出函数的具体行为,函数定义包括函数的定义给出函数的具体行为,函数定义包括函数头和函数体,函数体由若干语句构成,放在函数头和函数体,函数体由若干语句构成,
5、放在 内。内。int findArea(int l,int w)int findArea(int l,int w)return l*w;return l*w;p函数头与函数原型类似,但结尾不能加分号。函数头与函数原型类似,但结尾不能加分号。p如果函数返回一个值,函数体内至少包含如果函数返回一个值,函数体内至少包含1 1条条returnreturn语句,语句,return return语句可返回类型匹配的常量、变量、表达式结果。语句可返回类型匹配的常量、变量、表达式结果。7声明和定声明和定义的匹配的匹配&函数的声明和函数的定义需要匹配,否则无法通函数的声明和函数的定义需要匹配,否则无法通过编译。
6、匹配时检查返回值类型、函数名称、参数过编译。匹配时检查返回值类型、函数名称、参数类型及顺序,但不用匹配参数名称。类型及顺序,但不用匹配参数名称。int findArea(int,int);int findArea(int,int);p函数声明可以只给出参数类型,但语义不够清晰,声明和定函数声明可以只给出参数类型,但语义不够清晰,声明和定 义处的参数名称可以不同,编译器忽略声明处的参数名称。义处的参数名称可以不同,编译器忽略声明处的参数名称。p函数名应符合标识符规则,还要养成良好的习惯,名字应能函数名应符合标识符规则,还要养成良好的习惯,名字应能 体现函数的功能和目的,名字中间不能有空格。体现函
7、数的功能和目的,名字中间不能有空格。8函数的函数的调用用#include#include int findArea(int length,int width);int findArea(int length,int width);int main()int main()int length,width;int length,width;int area;int area;std:cout“How wide is your yard?“;std:coutwidth;std:cinwidth;std:cout“How long is your yard?“;std:coutlength;std:c
8、inlength;9函数的函数的调用用int main()int main()area=findArea(length,width);area=findArea(length,width);std:cout“Your yard is“area;std:cout“Your yard is“area;std:cout“square feet.n”;std:cout“square feet.n”;return 0;return 0;p调用函数时传递的参数称为实参,函数体内的参数称为形参,调用函数时传递的参数称为实参,函数体内的参数称为形参,形参用于接收传入的实参值。形参用于接收传入的实参值。p如果将
9、函数定义放在如果将函数定义放在mainmain函数之前,可以不写函数声明,但函数之前,可以不写函数声明,但 不是一种良好的习惯。不是一种良好的习惯。10本章内容安排本章内容安排&函数的概念函数的概念&函数的声明与定义函数的声明与定义&函数中的变量函数中的变量&函数返回值函数返回值&默认参数默认参数&函数重载函数重载&内联函数内联函数11局部局部变量量&函数体内创建的变量称为函数体内创建的变量称为局部变量局部变量,局部变量只,局部变量只存在于函数内部,调用函数时局部变量被创建,函存在于函数内部,调用函数时局部变量被创建,函数返回后,所有局部变量被销毁,不能再被访问。数返回后,所有局部变量被销毁,
10、不能再被访问。&函数的函数的形参形参(接收并保存实参值)也是函数的局(接收并保存实参值)也是函数的局部变量。部变量。12局部局部变量的使用量的使用#include#include float convert(float);float convert(float);int main()int main()float fahrenheit,celsius;float fahrenheit,celsius;std:coutEnter the temperature in Fahrenheit:;std:coutfahrenheit;std:cinfahrenheit;celsius=convert(
11、fahrenheit);celsius=convert(fahrenheit);std:coutTemperature in Celsius:“std:coutTemperature in Celsius:“celsiusn;celsiusn;return 0;return 0;13局部局部变量的使用量的使用float convert(float convert(float fahreheit float fahreheit)float celsius;float celsius;celsius=(fahreheit-32)*5)/9;celsius=(fahreheit-32)*5)/9;r
12、eturn celsius;return celsius;p尽管实参变量和形参变量的名字都是尽管实参变量和形参变量的名字都是fahreheitfahreheit,它们是不,它们是不 同的变量,同的变量,mainmain函数的中函数的中fahreheitfahreheit将值复制给将值复制给convertconvert 函数中的函数中的fahreheitfahreheit局部变量。局部变量。p变量作用域:变量存在的范围,块语句中声明的变量只能变量作用域:变量存在的范围,块语句中声明的变量只能 存在于当前块。存在于当前块。14全局全局变量量&C+C+中允许在函数外面定义变量,称为中允许在函数外面定
13、义变量,称为全局变量全局变量,全局变量在程序的任何地方都可使用。全局变量在程序的任何地方都可使用。&全局变量的作用域为全局,可以在程序的任何函全局变量的作用域为全局,可以在程序的任何函数中被访问。数中被访问。15局部局部变量的使用量的使用#include#include void convert();void convert();float fahrenheit,celsius;float fahrenheit,celsius;int main()int main()std:coutEnter the temperature in Fahrenheit:;std:coutfahrenheit;
14、std:cinfahrenheit;convert();convert();std:coutTemperature in Celsius:“std:coutTemperature in Celsius:“celsiusn;celsiusn;return 0;return 0;16局部局部变量的使用量的使用void convert()void convert()celsius=(fahreheit-32)*5)/9;celsius=(fahreheit-32)*5)/9;p在函数中直接操作全局变量,不用传递参数或返回值,表面在函数中直接操作全局变量,不用传递参数或返回值,表面 上方便省事。但在复
15、杂程序中,全局变量会导致程序错误上方便省事。但在复杂程序中,全局变量会导致程序错误 难以修改(任意一条语句都有可能修改全局变量的值)难以修改(任意一条语句都有可能修改全局变量的值)p良好编程习惯:应避免使用全局变量!良好编程习惯:应避免使用全局变量!17函数参数函数参数&函数通过函数通过参数(形参)参数(形参)接收信息,函数可以包含接收信息,函数可以包含多个参数,多个参数之间用逗号分割。多个参数,多个参数之间用逗号分割。&函数调用时,函数调用时,提供值(实参)提供值(实参)可以是常量、变量、可以是常量、变量、表达式、其它函数调用的返回值。表达式、其它函数调用的返回值。&函数的形参属于函数的局部
16、变量,函数返回后局函数的形参属于函数的局部变量,函数返回后局部变量就被销毁,无法再访问了。部变量就被销毁,无法再访问了。18函数的参数函数的参数传递#include#include int main()int main()int x=5,y=4;int x=5,y=4;std:cout“sum:“std:cout“sum:“sum(x,y);sum(x,y);return 0;return 0;int sum(int a,int b)int sum(int a,int b)return a+b;return a+b;54mainmainsumsum54x xy ya ab b不成功的数据交不成
17、功的数据交换int x=4,y=13;int x=4,y=13;swap(swap(x,y x,y););void swap(void swap(int x,int y int x,int y)int temp=x;int temp=x;x=y;x=y;y=temp;y=temp;pswapswap函数的形参函数的形参x x、y y,和调用处,和调用处 的的x x、y y虽然同名,但属于不同的虽然同名,但属于不同的 的变量。的变量。pswapswap函数内部,对自己的局部变函数内部,对自己的局部变 量量x x和和y y进行交换,函数返回后,进行交换,函数返回后,调用处的调用处的x x和和y y
18、没有变化。没有变化。20本章内容安排本章内容安排&函数的概念函数的概念&函数的声明与定义函数的声明与定义&函数中的变量函数中的变量&函数返回值函数返回值&默认参数默认参数&函数重载函数重载&内联函数内联函数21从函数返回从函数返回值&函数可以返回一个值或不返回值(用函数可以返回一个值或不返回值(用voidvoid表示)表示)&使用使用returnreturn关键词从函数返回值,返回的值可以关键词从函数返回值,返回的值可以是常量、变量、表达式、其它函数调用的返回值。是常量、变量、表达式、其它函数调用的返回值。&遇到遇到returnreturn语句后,将立即返回到调用函数语句语句后,将立即返回到调
19、用函数语句处,处,returnreturn之后的所有语句不再执行。之后的所有语句不再执行。22判断是否判断是否闰年年?bool isLeapYear(int year)bool isLeapYear(int year)if(year%4=0)if(year%4=0)if(year%100=0)if(year%100=0)if(year%400=0)if(year%400=0)return true;return true;else else return false;return false;elseelse return true;return true;elseelsereturn fal
20、se;return false;p闰年的两个基本条件闰年的两个基本条件 1)1)能被能被4 4整除,但不不能被整除,但不不能被100100整除整除 2)2)能被能被4 4、100100和和400400同时整除同时整除p只要执行到只要执行到4 4个个returnreturn语句中的一个,语句中的一个,函数立即返回。函数立即返回。23判断是否判断是否闰年年?#include#include bool isLeapYear(int year);bool isLeapYear(int year);int main()int main()int input;int input;std:coutEnter
21、 a year:;std:coutinput;std:cininput;if(isLeapYear(input)if(isLeapYear(input)std:coutinput is a leap year.n;std:coutinput is a leap year.n;elseelsestd:coutinput is not a leap year.n;std:coutinput is not a leap year.n;return 0;return 0;24本章内容安排本章内容安排&函数的概念函数的概念&函数的声明与定义函数的声明与定义&函数中的变量函数中的变量&函数返回值函数返回值
22、&默认参数默认参数&函数重载函数重载&内联函数内联函数25形参和形参和实参的匹配参的匹配&在原型中将函数声明为接收一个或多个参数时,在原型中将函数声明为接收一个或多个参数时,调用函数时必须使用数据类型匹配的实参。调用函数时必须使用数据类型匹配的实参。bool isLeapYear(int year);bool isLeapYear(int year);&调用调用isLeapYearisLeapYear函数时,必须提供一个类型为函数时,必须提供一个类型为intint的实参。的实参。&如果调用时传递的参数少了、多了或者类型不匹如果调用时传递的参数少了、多了或者类型不匹配,编译器将报错。配,编译器将
23、报错。isLeapYear();/isLeapYear();/调用函数调用函数Xp形参和实参的类型并不要求严格相同,如实参为形参和实参的类型并不要求严格相同,如实参为floatfloat类型类型 形参可以为形参可以为doubledouble类型,系统会自动转换。只有当类型不类型,系统会自动转换。只有当类型不 兼容时,编译器才会报错。兼容时,编译器才会报错。p良好编程习惯:形参和实参类型保持一致。良好编程习惯:形参和实参类型保持一致。26指定参数默指定参数默认值&如果在函数声明中指定了参数的默认值,调用函如果在函数声明中指定了参数的默认值,调用函数时可以不传递相应的实参,此时使用默认值作为数时可
24、以不传递相应的实参,此时使用默认值作为实参传递给函数。实参传递给函数。bool isLeapYear(int year=2011);bool isLeapYear(int year=2011);isLeapYear();isLeapYear();/调用函数调用函数 isLeapYear(2011);isLeapYear(2011);p在函数原型中声明缺省值,在函数定义处无需定义缺省值。在函数原型中声明缺省值,在函数定义处无需定义缺省值。27默默认值规则&如果函数有多个参数,可以分别为其指定默认值。如果函数有多个参数,可以分别为其指定默认值。&规则:从某个参数开始,右侧的所有参数都必须规则:从某
25、个参数开始,右侧的所有参数都必须指定默认值。指定默认值。long set4Point(int x,int y,int z,int t);long set4Point(int x,int y,int z,int t);long set4Point(int x,int y,long set4Point(int x,int y,int z=10int z=10,int t);,int t);long set4Point(int x,int y,long set4Point(int x,int y,int z=10,int t=300 int z=10,int t=300););set4Point(1
26、30,35);set4Point(130,35);set4Point(130,35,10,300);set4Point(130,35,10,300);X28默默认值示例示例#include#include int findArea(int length,int findArea(int length,int width=20,int height=10int width=20,int height=10););int main()int main()int length=10,width=5,height=2;int length=10,width=5,height=2;int area;in
27、t area;area=findArea(length,width,height);area=findArea(length,width,height);std:coutFirst Area:areastd:endl;std:coutFirst Area:areastd:endl;area=findArea(length,width);area=findArea(length,width);std:coutSecond Area:arean;std:coutSecond Area:arean;area=findArea(length);area=findArea(length);std:cou
28、tThird Area:arean;std:coutThird Area:arean;return 0;return 0;29默默认值示例示例int findArea(int length,int width,int height)int findArea(int length,int width,int height)return length*width*height;return length*width*height;p只在原型中指定默认值,函数定义中不能指定默认值。例外只在原型中指定默认值,函数定义中不能指定默认值。例外 情况,当将函数定义在调用代码的上方时,可以省略原型,情况,当将
29、函数定义在调用代码的上方时,可以省略原型,此时需要在函数定义中(函数头)指定默认值。此时需要在函数定义中(函数头)指定默认值。p良好编程习惯:为所有函数提供原型,在原型中指定默认值良好编程习惯:为所有函数提供原型,在原型中指定默认值 调用函数时,系统用原型中默认值作为实参调用函数。调用函数时,系统用原型中默认值作为实参调用函数。30本章内容安排本章内容安排&函数的概念函数的概念&函数的声明与定义函数的声明与定义&函数中的变量函数中的变量&函数返回值函数返回值&默认参数默认参数&函数重载函数重载&内联函数内联函数31函数重函数重载的概念的概念&C+C+中允许定义多个同名的函数,但它们的参数中允许
30、定义多个同名的函数,但它们的参数不同,称为函数重载。不同,称为函数重载。&参数不同分下面几种情况:参数不同分下面几种情况:参数类型不同参数类型不同 参数数量不同参数数量不同 数量和类型均不同数量和类型均不同int store(int,int);int store(int,int);int store(long,long);int store(long,long);int store(long);int store(long);32函数重函数重载的匹配的匹配&调用调用storestore函数,编译器将根据传递的实参数据类函数,编译器将根据传递的实参数据类型和数量确定调用哪个版本的型和数量确定调用
31、哪个版本的storestore。&不能通过函数不能通过函数返回值返回值类型判断重载函数的版本,类型判断重载函数的版本,如果两个同名函数的参数类型和个数一致,而返回如果两个同名函数的参数类型和个数一致,而返回值类型不同,编译器将报错。值类型不同,编译器将报错。int myFun(int,int);int myFun(int,int);float myFun(int,int);float myFun(int,int);X33函数重函数重载的用途的用途&通过函数重载,可以创建针对不同数据类型执行通过函数重载,可以创建针对不同数据类型执行类似的操作,而不用给每个函数指定不同的名称。类似的操作,而不用给
32、每个函数指定不同的名称。若不使用重载,针对不同类型数据,将定义不同名称的若不使用重载,针对不同类型数据,将定义不同名称的函数,以计算平均值为例,如函数,以计算平均值为例,如averageIntaverageInt、averageFloataverageFloat、averageDoubleaverageDouble等等 通过函数重载,每个函数的名称均为通过函数重载,每个函数的名称均为averageaverage,但参数,但参数类型不同。调用函数时通过实参类型匹配具体函数版本。类型不同。调用函数时通过实参类型匹配具体函数版本。int average(int,int);int average(in
33、t,int);float average(float,float);float average(float,float);double average(double,double);double average(double,double);p通过模板技术,可以提出更好的解决方案。通过模板技术,可以提出更好的解决方案。34本章内容安排本章内容安排&函数的概念函数的概念&函数的声明与定义函数的声明与定义&函数中的变量函数中的变量&函数返回值函数返回值&默认参数默认参数&函数重载函数重载&内联函数内联函数35内内联函数的概念函数的概念&调用函数时,会跳转到函数代码处,传递参数,调用函数时,会跳转到
34、函数代码处,传递参数,函数执行完成后,会返回调用处。函数执行完成后,会返回调用处。&函数调用、参数传递、返回有一定的系统开销,函数调用、参数传递、返回有一定的系统开销,如果函数中的语句很少,通过内联函数可以避免跳如果函数中的语句很少,通过内联函数可以避免跳转造成的开销,提高运行速度。转造成的开销,提高运行速度。inlineinline int doubleIt(int);int doubleIt(int);int doubleIt(int target)int doubleIt(int target)return target*2;return target*2;p编译器将内联函数代码直接嵌入编译器将内联函数代码直接嵌入 到调用处,以渐少函数调用,但到调用处,以渐少函数调用,但 会增加可执行程序大小。会增加可执行程序大小。p在函数原型中指定在函数原型中指定inlineinline,函数,函数 定义处可用可不用。定义处可用可不用。p现代编译器往往对程序进行充分现代编译器往往对程序进行充分 优化,使用优化,使用inlineinline作用不大。作用不大。36