版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1第第4章章 函数函数 2概述概述函数是程序代码的一个自包含单元,用于完函数是程序代码的一个自包含单元,用于完成某一特定的任务。成某一特定的任务。C+是由函数构成的,是由函数构成的,函数是函数是C+的基本模块的基本模块。有的函数完成某一操作;有的函数计算出一有的函数完成某一操作;有的函数计算出一个值。通常,一个函数即能完成某一特定操个值。通常,一个函数即能完成某一特定操作,又能计算数值。作,又能计算数值。3为什么要使用函数?为什么要使用函数?1、避免重复的编程。、避免重复的编程。2、使程序更加模块化,便于阅读、修改。、使程序更加模块化,便于阅读、修改。参数(多个)参数(多个)函数值函数值(唯一
2、)唯一)函数体函数体所编写的函数应尽量少与主调函数发生所编写的函数应尽量少与主调函数发生联系,这样便于移植。联系,这样便于移植。4说明:说明:1、一个源程序文件由一个或多个函数组成,编译程序以、一个源程序文件由一个或多个函数组成,编译程序以文件而不是以函数为单位进行编译的。文件而不是以函数为单位进行编译的。2、一个程序可以由多个源文件组成,可以分别编译,统、一个程序可以由多个源文件组成,可以分别编译,统一执行。一执行。3、一个程序必须有且只有一个、一个程序必须有且只有一个main( )函数,函数,C+从从main( )函数开始执行。函数开始执行。4、C+语言中,语言中,所有函数都是平行独立的,
3、无主次、相互所有函数都是平行独立的,无主次、相互包含之分包含之分。函数可以嵌套调用,不可嵌套定义函数可以嵌套调用,不可嵌套定义。5、从使用角度来说,分标准函数和用户自定义函数;从、从使用角度来说,分标准函数和用户自定义函数;从形式来说,分无参函数和有参函数。形式来说,分无参函数和有参函数。5库函数是库函数是C+编译系统已预定义的函数编译系统已预定义的函数,用户根据,用户根据需要可以直接使用这类函数。库函数也称为标准需要可以直接使用这类函数。库函数也称为标准函数。函数。为了方便用户进行程序设计,为了方便用户进行程序设计,C+把一些常用数学把一些常用数学计算函数(如计算函数(如sqrt()、exp
4、()等)、字符串处理函数、等)、字符串处理函数、标准输入输出函数等,都作为库函数提供给用户,标准输入输出函数等,都作为库函数提供给用户,用户可以直接使用系统提供的库函数。用户可以直接使用系统提供的库函数。库函数有很多个,当用户使用任一库函数时,在库函数有很多个,当用户使用任一库函数时,在程序中必须包含相应的头文件。程序中必须包含相应的头文件。 如如 #include等。等。6用户在设计程序时,可以将完成某一相对独立功用户在设计程序时,可以将完成某一相对独立功能的程序定义为一个函数。用户在程序中,根据能的程序定义为一个函数。用户在程序中,根据应用的需要,由应用的需要,由用户自己定义函数用户自己定
5、义函数,这类函数称,这类函数称为用户自定义的函数。为用户自定义的函数。 根据定义函数或调用时是否要给出参数,又可将根据定义函数或调用时是否要给出参数,又可将函数分为:无参函数和有参函数。函数分为:无参函数和有参函数。 7函数定义的一般形式函数定义的一般形式一、无参函数一、无参函数主调函数并不将数据传给被调函数。主调函数并不将数据传给被调函数。类型说明类型说明 函数名(函数名(void) 函数体函数体 无参函数主要用于完成某一操作。无参函数主要用于完成某一操作。不传递参数不传递参数参数(多个)参数(多个)函数值函数值(唯一)唯一)函数体函数体8void main(void ) printstar
6、 ( ); print_message ( ); printstar( );void printstar (void ) cout“* * * * * * * * * * *n”; void print_message (void) couty)? x : y ; return z; void main (void ) int a,b,c; cinab; c=max (a , b) ; cout“The max is” cy)? x : y ; return z; void main (void ) int a,b,c; cinab; c=max (a , b) ; cout“The max
7、is” cy)? x : y ; return z; void main (void ) int a,b,c; cinab; c=max (a+b , a*b) ; cout“The max is”cendl; 先计算,后先计算,后赋值赋值若若a为为3,b为为5,则实,则实参为参为8, 15,分别送给形,分别送给形参参x,y。15说明:说明:1、在未出现函数调用时,形参并不占内存的存储单元,、在未出现函数调用时,形参并不占内存的存储单元,只有在函数开始调用时,形参才被分配内存单元只有在函数开始调用时,形参才被分配内存单元。调用结。调用结束后,形参所占用的内存单元被释放。束后,形参所占用的内存单
8、元被释放。2、实参对形参变量的传递是、实参对形参变量的传递是“值传递值传递”,即单向传递。,即单向传递。在内存中实参、形参分占不同的单元在内存中实参、形参分占不同的单元。3、形参只作用于被调函数,可以在别的函数中使用相同、形参只作用于被调函数,可以在别的函数中使用相同的变量名。的变量名。5a8b实参实参xy形参形参5816void fun(int a, int b) a=a*10; b=b+a; coutatbendl;void main(void) int a=2, b=3; fun(a,b); coutatbendl;ab23ab23202320 232 317void fun(int x
9、, int y) x=x*10; y=y+x; coutxtyendl;void main(void) int a=2, b=3; fun(a+b,a*b); coutatby) return x ; else return y; 若函数体内没有若函数体内没有return语语句,就一直执行到函数体句,就一直执行到函数体的末尾,然后返回到主调的末尾,然后返回到主调函数的调用处。函数的调用处。先计算,后返回先计算,后返回可以有多个可以有多个return语句语句21不带返回值的函数可说明为不带返回值的函数可说明为void型。型。函数的类型与函数参数的类型没有关系。函数的类型与函数参数的类型没有关系。
10、double blink ( int a, int b)如果函数的类型和如果函数的类型和return表达式中的类型不一致,表达式中的类型不一致,则以函数的类型为准。则以函数的类型为准。函数的类型决定返回值的函数的类型决定返回值的类型。类型。对数值型数据,可以自动进行类型转换。对数值型数据,可以自动进行类型转换。 既然函数有返回值,这个值当然应属于某一个确既然函数有返回值,这个值当然应属于某一个确定的类型,应当在定义函数时指定函数值的类型。定的类型,应当在定义函数时指定函数值的类型。 int max (float a, float b) / 函数值为整型函数值为整型 函数返回值的类型,也是函数的
11、类型函数返回值的类型,也是函数的类型22参数(多个)参数(多个)函数值函数值(唯一)唯一)函数体函数体int max ( int x, int y) int z; z=xy?x:y; return z; 如果有函数返回如果有函数返回值值,返回值就是函返回值就是函数值数值,必须惟一。必须惟一。如果有函数返回如果有函数返回值值, 函数的类型就函数的类型就是返回值的类型是返回值的类型函数体的类型、形式参数的类型必须函数体的类型、形式参数的类型必须在函数的定义中体现出来。在函数的定义中体现出来。23函数的调用函数的调用函数调用的一般形式函数调用的一般形式函数名(实参列表);函数名(实参列表);形参与实
12、参类型相同,一一对应。形参与实参类型相同,一一对应。 i=2; f (i, +i);函数调用的方式函数调用的方式作为语句作为语句 printstar( );作为表达式作为表达式 c=max (a,b);作为另一个函数的参数作为另一个函数的参数 coutmax (a,b);实际调用:实际调用: f (3, 3);241) 被调用的函数必须是已存在的函数被调用的函数必须是已存在的函数2) 如果使用库函数,必须用如果使用库函数,必须用 #include 在一个函数中调用另一函数(即被调用函数)需要在一个函数中调用另一函数(即被调用函数)需要具备哪些条件呢?具备哪些条件呢?3) 函数调用遵循函数调用遵
13、循先定义、后调用先定义、后调用的原则,即的原则,即被调被调函数应出现在主调函数之前函数应出现在主调函数之前。25float max(float x, float y) float z; z=(xy)? x : y ; return z; void main (void) float a,b, c; cinab; c=max (a+b , a*b) ; cout“The max is”cy)? x : y ; return z; void main (void) float a,b, c; float max (float,float); cinab; c=max (a,b) ; cout“Th
14、e max is”cendl; 函数原型说明函数原型说明函数定义函数定义定义是一个完整的函数单位,定义是一个完整的函数单位,而原型说明仅仅是说明函数的而原型说明仅仅是说明函数的返回值及形参的类型返回值及形参的类型。28void main(void) int i=2, x=5, j=7; void fun(int,int); fun ( j, 6); coutit jt xendl;void fun ( int i, int j) int x=7; coutit jtxendl;2i5x7j676jxi7输出:输出: 7 6 7 2 7 5 29void main(void ) int x=2,
15、y=3, z=0;void add(int,int,int); cout“(1) x=“x“ y=“y“ z=“zendl; add (x, y, z); cout (“(3) x=“x“ y=“y“ z=“zendl;void add ( int x, int y, int z) z=x+y; x=x*x; y=y*y; cout(“(2) x=“x“ y=“y“ z=“zx; y=f1(x); cout“x=“x“ , y=“y0.00001); return s;void main(void) float x; cinx; cout“s=“fun(x)endl;36计算计算100200之
16、间的素数,用函数之间的素数,用函数prime( )判断一个数是判断一个数是否是素数,若是该函数返回否是素数,若是该函数返回1,否则返回,否则返回0。void main(void) for(int i=100;i=200; i+) if(prime(i)=1) coutit; int prime(int x)for(int i=2;ixy; coutgys(x,y)endl;int gys(int a, int b) int r; if(axyz; coutgys(x,y,z)=1;i-) if(a%i=0&b%i=0&c%i=0) break; return i; 39写一个函数验证哥德巴赫猜
17、想;一个不小于写一个函数验证哥德巴赫猜想;一个不小于6 6的偶的偶数可以表示为两个素数之和,如数可以表示为两个素数之和,如6=3+3, 8=3+5, 6=3+3, 8=3+5, 10=3+710=3+7。在主函数中输入一个不小于。在主函数中输入一个不小于6 6的偶数的偶数n n,函数中输出以下形式的结果,函数中输出以下形式的结果34=3+31 方程方程40引用引用对变量起另外一个名字对变量起另外一个名字 ( (外号外号) ),这个名字称为该,这个名字称为该变量的引用。变量的引用。 & = ; 其中其中原变量名原变量名必须是一个已定义过的变量必须是一个已定义过的变量。如:。如:int max ;
18、int &refmax=max;refmax并没有重新在内存中开辟单元,只是并没有重新在内存中开辟单元,只是引用引用max的单元。的单元。max与与refmax在内存中占用同一地址在内存中占用同一地址,即同一地址两个名字即同一地址两个名字。41maxrefmax510int max ;int &refmax=max;max=5 ;20refmax=10;refmax=max+refmax;max与与refmax同一地址同一地址42对引用类型的变量,说明以下几点:对引用类型的变量,说明以下几点:1、引用在定义的时候要初始化。、引用在定义的时候要初始化。2、对引用的操作就是对被引用的变量的操作。、
19、对引用的操作就是对被引用的变量的操作。 int &refmax; int &refmax=max;错误,没有具体的引用对象错误,没有具体的引用对象max是已定义过的变量是已定义过的变量3、 引用类型变量的初始化值不能是一个常数。引用类型变量的初始化值不能是一个常数。如:如:int &ref1 = 5; / 是错误的。是错误的。int &ref=i;43当当&a&a的前面有的前面有类型符类型符时时(如(如int &aint &a),它必然是),它必然是对引用的声明对引用的声明;如果前面;如果前面无类型符(如无类型符(如cout&acout&a), ,则是取变量的地址。则是取变量的地址。 44以下
20、的声明是非法的以下的声明是非法的1、企图建立数组的引用、企图建立数组的引用 int & a9;2、企图建立指向引用的指针、企图建立指向引用的指针 int & *p;3、企图建立引用的引用、企图建立引用的引用 int & &px;int m=10;int &y=10;int &z;float &t=&m;int &x=m;45引用与函数引用与函数 引用的用途主要是用来作引用的用途主要是用来作函数的参数函数的参数或或函数的返回值。函数的返回值。引用作函数的形参,实际上是在被调函数中对引用作函数的形参,实际上是在被调函数中对实参变量实参变量进行操作。进行操作。void change(int &x,
21、int &y)/x,y是实参是实参a,b的别名的别名 int t; t=x; x=y; y=t;void main(void) int a=3,b=5; change(a,b); /实参为变量实参为变量 coutatbendl; a3b5xyt353输出:输出: 5 346void dd(int &x, int &y, int z) x=x+z; y=y-x; z=10; cout“(2)”xtytzendl;void main(void) int a=3,b=4,c=5; for(int i=0;i2;i+) dd(a,b,c); cout“(1)”atbtcendl;(2) 8 -4 10
22、(2) 13 -17 10(1) 13 -17 5x=8y=-4z=10 x=13y=-17z=1047函数的嵌套调用函数的嵌套调用C+语言中,语言中,所有函数都是平行独立的,无主次、所有函数都是平行独立的,无主次、相互包含之分相互包含之分。函数可以嵌套调用,不可嵌套定义函数可以嵌套调用,不可嵌套定义int max ( int a, int b) int c; int min ( int a, int b) return ( ab? a : b); int max ( int a, int b) int c; c=min(a,b); return ( ab? a : b); int min (
23、 int a, int b) return ( ab? a: b);嵌套定义嵌套定义嵌套调用嵌套调用平行定义平行定义48调用调用 b 函数函数a 函数函数b 函数函数main 函数函数调用调用 a 函数函数结束结束(2)(3)(4)(5)(6)(7)(8)(9)在在main函数中调用函数中调用a函数,在函数,在a函数中又调用函数中又调用b函数。函数。49kkkknnkf.321),(int power(int m,int n)/mnint i,product=m;for(i=1;in;i+)product=product*m;return product;int sum_of_power(in
24、t k,int n)/nk的累加和的累加和int i,sum=0;for(i=1;ikm;coutf(k,m)=sum_of_power(k,m)1int age ( int n ) int c; c=age(n-1)+2; return c;void main(void) int age(int); coutage(5)endl;int age ( int n ) int c; if (n= =1) c=10; else c=age(n-1)+2; return c;必须有递归结束条件必须有递归结束条件52int age ( int n ) int c; if (n= =1) c=10; e
25、lse c=age(n-1)+2; return c;void main(void) int age(int); coutage(5)1float fac (int n) float y; if (n= =0)| (n= =1) y=1; else y=n*fac(n-1); return y;void main (void) float y; int n; coutn ; coutn“!=”fac(n)endl;fac (5)n=5y=5*fac (4)fac (4)n=4y=4*fac (3)fac (3)n=3y=3*fac (2)fac (2)n=2y=2*fac (1)fac (1)
26、n=1y=1return yreturn yy=2return yy=6return yy=24return yy=12054int sub(int);void main (void) int i=5; coutsub(i)i; f(i);void f(int n ) if(n= =0) return; else coutn%10; f(n/10); coutn%10; return; f(1234)coutn%10f(n/10)f (123)coutn%10f(n/10)f(12)coutn%10f(n/10)f(1)coutn%10f (n/10)f(0)n=0returncoutn%10
27、returncoutn%10returncoutn%10returncoutn%10return4321123443211234输入:输入:123456void recur(char c) coutc; if(c5) recur(c+1); cout=10) f(n/10); coutnendl;void main(void) f(12345);11212312341234558作用域和存储类作用域和存储类作用域是指程序中所说明的标识符在哪一个区间作用域是指程序中所说明的标识符在哪一个区间内有效,即在哪一个区间内可以使用或引用该标内有效,即在哪一个区间内可以使用或引用该标识符识符。在。在C+中
28、,作用域共分为五类:中,作用域共分为五类:块作用域、块作用域、文件作用域、函数原型作用域、函数作用域和类文件作用域、函数原型作用域、函数作用域和类的作用域。的作用域。 59块作用域块作用域我们把用花括号括起来的一部分程序称为一个块。我们把用花括号括起来的一部分程序称为一个块。在块内说明的标识符,只能在该块内引用,即其在块内说明的标识符,只能在该块内引用,即其作用域在该块内,开始于标识符的说明处,结束作用域在该块内,开始于标识符的说明处,结束于块的结尾处。于块的结尾处。 在一个函数内部定义的变量或在一个块中定义的在一个函数内部定义的变量或在一个块中定义的变量称为局部变量。变量称为局部变量。 60
29、在函数内或复合语句内部定义的变量,其作用域是在函数内或复合语句内部定义的变量,其作用域是从定义的位置起到函数体或复合语句的结束从定义的位置起到函数体或复合语句的结束。形参形参也是局部变量。也是局部变量。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有效有效61主函数主函数main中定义的变量,也只在主函数中有效,中定义的变量,也只在主函数中有效,同样属于局部变量同样属于局部变量。不同的函数可以使用相同名字的局部变量
30、,它们在不同的函数可以使用相同名字的局部变量,它们在内存中分属不同的存储区间,互不干扰。内存中分属不同的存储区间,互不干扰。void main(void) int x=10; int x=20; coutxendl; coutxendl;2010 x10 x20定义变量既是在定义变量既是在内存中开辟区间内存中开辟区间62注意:注意:具有块作用域的标识符在其作用域内,将屏具有块作用域的标识符在其作用域内,将屏蔽其作用块包含本块的同名标识符,即蔽其作用块包含本块的同名标识符,即变量名相同,作用域小的那个变量优先使用。变量名相同,作用域小的那个变量优先使用。63void main(void) int
31、 a=2, b=3, c=5; coutatbtcendl; int a, b=2; a=b+c; coutatbtcendl; c=a-b; coutatbtcendl; a2b3c5 3 57 2 5ab27-12 3 -164void main(void) int a=1,b=2,c=3; +a; c+=+b; int b=4, c; c=b*3; a+=c; cout“first:”atbtcendl; a+=c; cout“second:”atbtcendl; cout“third:”atbtcendl;a=2b=3, c=6b=4c=12a=14a=14,b=4,c=12a=26a
32、=26,b=4,c=12a=26,b=3,c=665文件作用域文件作用域 在函数外定义的变量称为全局变量。在函数外定义的变量称为全局变量。全局变量的作用域称为文件作用域,即在整个文全局变量的作用域称为文件作用域,即在整个文件中都是可以访问的。件中都是可以访问的。 其缺省的作用范围是其缺省的作用范围是:从定义全局变量的位置开始从定义全局变量的位置开始到该源程序文件结束到该源程序文件结束。当在块作用域内的变量与全局变量同名时,当在块作用域内的变量与全局变量同名时,局部局部变量优先。变量优先。 66p,q有效有效int p=1, q=5;float f1( int a) int b,c; .char
33、 c1,c2;main( ) int m, n; .a,b,c有效有效m,n有效有效c1,c2有效有效全局变量全局变量局部变量局部变量全局变量全局变量增加了函数间数据联系的渠道增加了函数间数据联系的渠道,在函数调,在函数调用时可以得到多于一个的返回值。用时可以得到多于一个的返回值。674int min;int max (int x, int y) int z; min=(xy)? x : y ; return z; void main (void) int a,b,c; cinab; c=max (a , b) ; cout“The max is”cendl; cout“ The min is
34、”minb? a:b; return c;void main(void) int a=8; coutmax(a,b)endl;3a5ba88a5bmax (8,5)输出:输出:869int x;void cude(void) x=x*x*x ;void main (void) x=5; cude ( ); coutxendl;输出:输出: 125输出:输出: 5int x=5;x为为070在块作用域内可通过作用域运算符在块作用域内可通过作用域运算符“:”来引用来引用与局部与局部变量同名变量同名的全局变量。的全局变量。 #include int i= 100;void main(void) in
35、t i , j=50; i=18; /访问访问局部变量局部变量i :i= :i+4; /访问全部变量访问全部变量i j= :i+i; /访问全部变量访问全部变量i和局部变量和局部变量j cout”:i=”:in; cout”i=”in; cout”j=”jn;:i=104i=18j=12271函数原型作用域函数原型作用域 在函数原型的参数表中说明的标识符所具有的作在函数原型的参数表中说明的标识符所具有的作用域称为函数原型作用域,用域称为函数原型作用域,它从其说明处开始,它从其说明处开始,到函数原型说明的结束处结束到函数原型说明的结束处结束。 float tt(int x , float y);
36、 /函数函数tt的原型说明的原型说明 由于所说明的标识符与该函数的定义及调用无关,由于所说明的标识符与该函数的定义及调用无关,所以,所以,可以在函数原型说明中只作参数的类型说可以在函数原型说明中只作参数的类型说明,而省略参量名明,而省略参量名。 float tt (int , float); 72int i=0;int workover(int i) i=(i%i)*(i*i)/(2*i)+4); cout“i=“iendl; return i;int rest (int i) i=i2?5:0; return i;void main(void) int i=5; rest(i/2); cou
37、t“i=“iendl; rest(i=i/2); cout“i=“iendl; i= rest(i/2); cout“i=“iendl; workover(i); cout“i=“iendl;i=5i=2i=5i=0i=573存储类存储类 外存外存内存内存程序程序程程序序区区静态存储区静态存储区动态存储区动态存储区存放程存放程序代码序代码存放变量存放变量需要区分变量的存储类型需要区分变量的存储类型74作用域作用域全局变量全局变量局部变量局部变量生存期生存期动态存储变量动态存储变量静态存储变量静态存储变量静态存储:在文件运行期间有固定的存储空间,直到文件静态存储:在文件运行期间有固定的存储空间,
38、直到文件运行结束。运行结束。动态存储:在程序运行期间根据需要分配存储空间,动态存储:在程序运行期间根据需要分配存储空间,函数函数结束后立即释放空间结束后立即释放空间。若一个函数在程序中被调用两次,。若一个函数在程序中被调用两次,则每次分配的单元有可能不同。则每次分配的单元有可能不同。程序区程序区静态存储区静态存储区动态存储区动态存储区全局变量全局变量静态局部变量静态局部变量动态局部变量动态局部变量75局部变量局部变量的分类的分类动态变量(动态变量(auto):默认,存储在动态区):默认,存储在动态区寄存器变量(寄存器变量(register):在):在cpu内部存储内部存储静态局部变量(静态局部
39、变量(static):存储在静态区):存储在静态区动态局部变量未被赋值时,动态局部变量未被赋值时,其值为随机值其值为随机值。其作用域的函。其作用域的函数或复合语句结束时,数或复合语句结束时,空间被程序收回空间被程序收回。程序执行到静态局部变量时,为其在静态区开辟存储空间,程序执行到静态局部变量时,为其在静态区开辟存储空间,该空间一直被保留,该空间一直被保留,直到程序运行结束。直到程序运行结束。由于存储在静态区,静态局部变量或全局变量未赋初值时,由于存储在静态区,静态局部变量或全局变量未赋初值时,系统自动使之为系统自动使之为0。76int fun(int a) int c; static int
40、 b=3; c=a+ b+; return c;void main(void) int x=2, y; y=fun(x); coutyendl; y=fun(x+3); coutyendl;x2ya2b3c5455a5只赋一次初值只赋一次初值c9599输出:输出:变量变量b是静态局部变量,在内存是静态局部变量,在内存一旦开辟空间,就不会释放,空一旦开辟空间,就不会释放,空间值一直保留间值一直保留77int f (int a) int b=0; static int c=3; b=b+1; c=c+1; return a+b+c;void main(void) int a=2,i; for (i
41、=0;i3;i+) coutf(a)endl;i=0a=2b=0, b=1c=3, c=4输出:输出:7i=1a=2b=0, b=1c=4, c=5输出:输出:8i=2a=2b=0, b=1c=5, c=6输出:输出:9789只赋一只赋一次初值次初值78int func (int a, int b) static int m=0, i=2; i+=m+1; m=i+a+b; return m; void main(void) int k=4, m=1, p; p=func(k, m); coutpendl; p=func(k, m); coutpendl;func( 4, 1)a=4, b=1
42、m=0, i=2i=3m=3+4+1=8func( 4, 1)a=4, b=1m=8, i=3i=3+8+1=12m=12+4+1=17输出:输出:8 1779int q(int x) int y=1; static int z=1; z+=z+y+; return x+z;void main(void) coutq(1)t; coutq(2)t; coutq(3)am; c=a*b; couta“*”b“=“cendl; d= power(m); couta“*”m“=“dendl; 文件文件file2.c中的内容为:中的内容为:extern int a;int power (int n )
43、 int i, y=1; for (i=1; iy)? x : y ; return z; void main (void ) int a,b,c; cinab; c=max (a+b , a*b) ; cout“The max is”cendl; 86使用内联函数时应注意以下几点:使用内联函数时应注意以下几点:1、C+中,除在函数体内含有循环,中,除在函数体内含有循环,switch分支和复杂嵌分支和复杂嵌套的套的if语句外,所有的函数均可定义为内联函数。语句外,所有的函数均可定义为内联函数。2、内联函数也要定义在前,调用在后。形参与实参之间、内联函数也要定义在前,调用在后。形参与实参之间的关
44、系与一般的函数相同。的关系与一般的函数相同。3、对于用户指定的内联函数,编译器是否作为内联函数、对于用户指定的内联函数,编译器是否作为内联函数来处理由编译器自行决定。说明内联函数时,只是请求编来处理由编译器自行决定。说明内联函数时,只是请求编译器当出现这种函数调用时,作为内联函数的扩展来实现,译器当出现这种函数调用时,作为内联函数的扩展来实现,而不是命令编译器要这样去做。而不是命令编译器要这样去做。4、正如前面所述,内联函数的实质是采用空间换取时间,、正如前面所述,内联函数的实质是采用空间换取时间,即可加速程序的执行,当出现多次调用同一内联函数时,即可加速程序的执行,当出现多次调用同一内联函数
45、时,程序本身占用的空间将有所增加。如上例中,内联函数仅程序本身占用的空间将有所增加。如上例中,内联函数仅调用一次时,并不增加程序占用的存储间。调用一次时,并不增加程序占用的存储间。87具有缺省参数值和参数个数可变的函数具有缺省参数值和参数个数可变的函数在在C+中定义函数时,允许给参数指定一个缺中定义函数时,允许给参数指定一个缺省的值。省的值。在调用函数时,若明确给出了这种实在调用函数时,若明确给出了这种实参的值,则使用相应实参的值;若没有给出相参的值,则使用相应实参的值;若没有给出相应的实参,则使用缺省的值。(举例说明)应的实参,则使用缺省的值。(举例说明) 88int fac(int n=2
46、) int t=1; for(int i=1;i=n;i+) t=t*i; return t;void main(void) cout fac(6) endl;输出:输出:720fac( )输出:输出:289int area(int lng=4 , int width=2) return lng* width;void main(void ) int a=8, b=6; cout area(a,b) endl; cout area(a) endl; cout area( ) endl; 4816890使用具有缺省参数的函数时,应注意以下几点:使用具有缺省参数的函数时,应注意以下几点:1.不可以
47、靠左边缺省不可以靠左边缺省 2.函数原型说明时可以不加变量名函数原型说明时可以不加变量名 float v(float,float=10,float=20);int area(int long , int width=2)int area(int long =4, int width)3.只能在前面定义一次缺省值只能在前面定义一次缺省值,即原型说明时定义,即原型说明时定义了缺省值,后面函数的定义不可有缺省值。了缺省值,后面函数的定义不可有缺省值。错误!错误!91#includevoid main() int a=8, b=6; int area(int lng=4 , int width=2);
48、 cout area(a,b) endl; cout area(a) endl; cout area( ) endl;int area(int lng=4, int width=2) return lng* width;编译错误编译错误int area(int lng , int width)正确正确只能在前面定义一次缺省值,只能在前面定义一次缺省值,即原型说明时定义了缺省值,即原型说明时定义了缺省值,后面函数的定义不可有缺省后面函数的定义不可有缺省值。值。92函数的重载函数的重载所谓函数的重载是指完成不同功能的函数可以具所谓函数的重载是指完成不同功能的函数可以具有有相同的函数名相同的函数名。
49、 C+的编译器是根据的编译器是根据函数的实参函数的实参来确定应该调用来确定应该调用哪一个函数的。哪一个函数的。 int fun(int a, int b) return a+b; int fun (int a) return a*a; void main(void) coutfun(3,5)endl; coutfun(5)endl;82593 1、定义的重载函数必须具有定义的重载函数必须具有不同的参数个数不同的参数个数,或或不同的参数类型不同的参数类型。只有这样编译系统才有可能。只有这样编译系统才有可能根据不同的参数去调用不同的重载函数。根据不同的参数去调用不同的重载函数。2、仅返回值不同时,
50、不能定义为重载函数。、仅返回值不同时,不能定义为重载函数。即仅函数的类型不同,不能定义为重载函数即仅函数的类型不同,不能定义为重载函数 int fun(int a, int b) return a+b; float fun (int a,int b) return (float) a*a; void main(void) coutfun(3,5)endl; coutfun(3,5)x;coutsin(x)endl;coutsin(x,x)endl;coutsin(x,10)endl;sin(x,x)sin(x,10)不同的参不同的参数类型数类型95int add(int a,int b,int c)return a+b+c; int add(int a,int b)return a+b; void main(void)cout3+5=add(3,5)endl;cout3+5+8=add(3,5,8)x1; /从键盘输入从键盘输入x0 do x0=x1; x1=x0-(x0*x0-a)/(2*x0) ; / while (fabs(x1*x1-a)=1e-6) ;cout”x=”x1endl;)0 x(f)0 x(f0 x1x旧值算本次循环的新值旧值算本次循环的新值上一循环的新值成为本次循环的旧值上一循环的新值成为本次循环的旧值1002、
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 遴选时事政治试题及答案
- 2026滨州邹平市长山镇所属事业单位就业见习信息(30人)模拟试卷及答案详解(有一套)
- 2026北京大学环境科学与工成学院程静课题组招聘博士后研究人员备考题库附参考答案详解(研优卷)
- 2026吉林大学白求恩第一医院呼吸与危重症医学科技术员招聘2人参考题库及参考答案详解(B卷)
- 新能源风光储电池全生命周期
- 工业元宇宙车间数字孪生与低空协同控制
- AI驱动自动化物理机器人
- 无人机物流系统
- 2026三年级读写执行力培养课件
- 2026三年级读写教学案例指导课件
- 2025年湖北省孝感市事业单位人员招聘考试试题及答案详解
- 2024-2025学年广东省深圳市龙岗区北师大版五年级下册期末数学试卷(完整试题+详细解析)
- 2026云南师范大学能源与环境科学学院招聘科研助理岗位工作人员5人备考题库及参考答案详解1套
- 大型工业吊扇销售合同
- 国家突发事件总体应急预案编制指南
- 2026云南临沧国投宏华招聘综合业务开单员3人备考题库及答案详解(必刷)
- 2026年潍坊房地产行业分析报告及未来发展趋势报告
- 2026年西安建筑科技大学《绿色建筑学报》编辑部招聘(3人)考试备考题库及答案解析
- 广州版小学综合实践三年级下学期教案全集
- 2025年CSCO肾癌诊疗指南解读
- 2025年马原考试题库
评论
0/150
提交评论