函数、函数与运算符重.ppt
高级语言程序设计C+,张海威南开大学信息技术科学学院,第5章 函数与重载,函数的说明与使用,1,函数的嵌套与递归,2,函数与运算符重载,3,函数与C+程序结构,4,2,Database&Information System Lab,函数的使用与说明,【例5.1】求三次方程的根。计算三次方程x3+px+q=0的一个实根的公式为,Database&Information System Lab,3,xr=,将计算公式分解为如下步骤令实数xrA+B令实数A,B 分别为实数R,S的立方根令R=-q/2+a,S=-q/2a令a=sqrt(q/2)*(q/2)+(q/3)*(q/3)*(q/3),函数的使用与说明,程序设计步骤输入方程的参数p和q,输出方程计算变量a的值计算变量R和变量S的值计算变量A和变量B的值分别对R和S求三次方根求y的三次方根的迭代公式计算Xr的值,Database&Information System Lab,4,函数的使用与说明,程序代码,Database&Information System Lab,5,#include/program5-1#include/use function sqrtusing namespace std;void main(void)float p,q,xr;coutP;coutq;coutThe Equation is:;coutx3+px+q=0endl;float a=sqrt(q/2)*(q/2)+(q/3)*(q/3)*(q/3);float R,S,A,B;const float eps=1e-6;/设置精确度R=-q/2+a;S=-q/2-a;,函数的使用和说明,Database&Information System Lab,6,float root,croot=R;doroot=croot;croot=(2*root+R/(root*root)/3;while(fabs(croot-root)eps);A=croot;croot=S;doroot=croot;croot=(2*root+S/(root*root)/3;while(fabs(croot-root)eps);B=croot;xr=A+B;coutendlThe real root of the equation isxr;,函数的使用和说明,程序分析程序中包含两段类似的代码,完成相同的功能:,Database&Information System Lab,7,float root,croot=R;doroot=croot;croot=(2*root+R/(root*root)/3;while(fabs(croot-root)eps);A=croot;,croot=S;doroot=croot;croot=(2*root+S/(root*root)/3;while(fabs(croot-root)eps);B=croot;,函数的使用和说明,函数的引入程序中功能相同,结构相似的代码段可以用函数进行描述程序的功能相对独立,用来解决某个问题具有明显的入口和出口入口:参数出口:返回值,Database&Information System Lab,8,函数的使用和说明,Database&Information System Lab,9,函数的使用和说明,声明函数cuberoot参数为待求根的变量函数cuberoot的定义如下:,Database&Information System Lab,10,float cuberoot(float x)/精确到小数点后6位float root,croot;const float eps=1e-6;croot=x;do root=croot;croot=(2*root+x/(root*root)/3;while(fabs(crootroot)eps);return croot;,函数的使用和说明,函数的作用实现程序功能的模块化实现程序结构的简化实现程序代码的重用函数的应用场景包含多处功能相同的代码处理数据的类型、处理过程相同或相似代码段具有代表性或特殊含义,Database&Information System Lab,11,函数的使用和说明,用函数的思想实现最简单的C+程序,Database&Information System Lab,12,#inlcudeusing namespace std;void printString();/函数原型int main()printString();/调用函数printString return 0;void pirntString()/函数定义 cout“Hello!”endl;return;/函数返回,函数的说明与使用,函数的使用步骤先说明,后调用程序中必须包含函数的说明及定义函数的说明方式函数原型函数定义可以出现在程序的任何合适的地方函数定义函数定义必须出现在调用函数之前,Database&Information System Lab,13,函数的说明与使用,主调函数函数体中调用其它函数被调函数被其它函数调用的函数上述概念是相对的概念,一个函数既可以调用其它函数(包括该函数自身),亦可以被其它函数调用(包括该函数自身),Database&Information System Lab,14,从函数形式划分,可分为无参函数与有参函数两类,从使用角度划分,可将函数分为:系统预定义的标准库函数(如,sin,abs等),以及由用户自定义的函数,函数分类方法,15,Database&Information System Lab,函数的说明与使用,函数的说明与使用,标准库函数程序中可直接使用(调用)系统预定义的标准库函数,但要求在调用前使用编译预处理指令include将对应的头文件包含进来用户自定义函数由用户自定义的函数与系统预定义的标准库函数的不同点在于,自定义函数的函数名、参数个数、函数返回值类型以及函数所实现的功能等都完全由用户程序来规定(指定),Database&Information System Lab,16,函数的说明与使用,标准库函数标准输入输出流()setw()、setwidth()等标准文件流()open()、close()等标准字符串处理函数()strcpy()、strcmp()等标准数学函数()sqrt()、pow()等,Database&Information System Lab,17,函数的说明与使用,用户自定义函数普通函数内联函数类的成员函数类的友元函数虚函数,Database&Information System Lab,18,函数的说明与使用,无参函数调用它们时不需要提供实际参数函数原型的一般形式();函数定义的一般形式()通常用来实现某种特定的功能不需要进行数据的传递处理的数据通常与主调函数无关,Database&Information System Lab,19,函数的说明与使用,无参函数【例5.2】定义一个函数,实现打印10个“*”的功能,Database&Information System Lab,20,void printStar()for(int i=0;i10;i+)cout“*”;coutendl;,函数的说明与使用,有参函数(带有参数的用户自定义函数)进行调用时,必须提供所需个数的且具有相匹配数据类型的实际参数函数原型的一般形式();定义的一般形式()通过调用处提供的不同实参值来计算出其对应的函数值、或实现某种与传递过来的那些不同值有关的某种功能。,Database&Information System Lab,21,函数的说明与使用,有参函数【例5.3】定义一个函数,控制输出“*”的个数,Database&Information System Lab,22,void printStar(int k)for(int i=0;ik;i+)cout“*”;coutendl;,函数的使用,调用,说明与定义,参数,重载,返回,内联函数,23,Database&Information System Lab,函数的说明与使用,函数的说明与使用,Database&Information System Lab,24,函数的说明与使用,函数的说明和定义在C+程序中,函数有两种说明方式函数原型在调用函数之前说明函数原型函数定义在调用函数之前对函数进行定义,Database&Information System Lab,25,函数的说明与使用,函数原型也称为函数声明用来指明函数的名称、参数以及返回值类型函数原型格式为:();例如int add(int a,int b);inline void swap(float,Database&Information System Lab,26,函数的说明与使用,函数原型属性说明:可缺省,一般可以是下面的关键字之一inline:表示该函数为内联函数static:表示该函数为静态函数virtual:表示该函数为虚函数friend:表示该函数为某类(class)的友元函数返回值类型函数处理得到的结果的数据类型函数名标识符,Database&Information System Lab,27,函数的说明与使用,函数原型参数表空参数表void printroot();void型参数void printroot(void);,*float cuberoot(float);float cuberoot(float x);,Database&Information System Lab,28,函数的说明与使用,函数定义函数定义与函数原型的主要区别是它还包括函数体,其格式为()函数体复合语句即程序块,由完成函数功能所需的全部语句构成,Database&Information System Lab,29,函数的说明与使用,函数的说明和定义“函数原型”的说明方式“函数定义”的说明方式,Database&Information System Lab,30,#includeusing namespace std;void printStar(int);/函数原型int main()printStar(10);/调用函数void printStar(int k)/函数体,#includeusing namespace std;void printStar(int k)/函数定义int main()printStar(10);/调用函数,函数的说明与使用,函数的说明和定义两种说明方式的区别函数原型的参数表中,参数名可以省略;函数定义的参数表中,必须给出参数名(省略参数名为无名参数)函数原型的函数体,可以出现在函数调用之后;函数定义的函数体,必须出现在调用之前函数原型的参数表后面加分号“;”,函数定义的参数表后面是函数体,即花括号“”函数定义不能出现在任何函数体中,函数原型可以出现在其它函数体中,Database&Information System Lab,31,函数的说明与使用,函数的调用函数调用是已定义函数的一次实际运行,与某类型的一个变量和后文中某类的一个对象类似,函数调用是函数定义的一个“实例”在C+程序中,除main函数外,其它任一函数的执行都是通过在main函数中直接或间接地调用该函数而引发的。调用一个函数就是去执行该函数之函数体的过程,Database&Information System Lab,32,函数的说明与使用,函数的调用函数调用过程,Database&Information System Lab,33,函数的说明与使用,函数的调用函数调用的执行顺序根据调用语句中的函数名在整个程序中搜索同名函数定义;对实参数的参数个数,类型,顺序进行核对,判定是否与函数定义中的形参表对应一致根据参数的类型(值参数或引用参数)进行值参数的值传递或引用参数的换名运行函数体代码返回调用点,并返回所要求的函数值,Database&Information System Lab,34,函数的说明与使用,函数的调用无参函数调用格式()例如:printStar();有参函数调用格式()例如:printStar(26);,Database&Information System Lab,35,函数的说明与使用,函数的返回函数的返回表示函数执行结束,将执行结果(无论是否有具体的数据)返回到调用函数的地方函数返回时完成的任务把运行控制从函数体返回到函数调用点根据返回值要求,返回所需要的数据值返回值类型void数值型引用类型,Database&Information System Lab,36,函数的说明与使用,函数的返回返回值类型空型(void)如果函数无值返回,应说明为void 类型。未作类型说明的函数,系统认为是int 类型函数,应返回一整型值值型:返回一个具有类型的值,包括int、float、char、bool等当函数要返回的值不止一个时,情况比较复杂,一般它可以以结构或类的形式,也可以以结构,数组或对象指针类型方式实现,这样的实例在后面的章节可以见到引用类型:详见第6章,Database&Information System Lab,37,函数的说明与使用,函数的返回函数返回用return语句表示return语句有如下几种写法return;/函数返回值类型为空(void)return;/与函数返回值的类型一致return();/与前一种写法等价,Database&Information System Lab,38,第一种格式的return用于立即从被调函数中返回,当函数类型为void时,应使用这种格式的返回语句。当函数类型为非void型时,应使用第二或第三种格式的return语句,此两种格式的语句效果完全相同(可将第二种格式看成是第三种格式的省略形式),系统此时都将计算出表达式的值,并“携带”该值立即从被调函数中返回,函数的说明与使用,函数应用举例【例5.4】设 f(x)=(x*x+x+1)/2-5.5求z=(f(2.5)+2*f(6)/f(4.3),并显示结果z。对任意输入的一个实数a,求出f(a)并显示分析:输入(参数):x输出(返回):函数的运算结果函数原型:double f(double);,Database&Information System Lab,39,函数的说明与使用,函数应用举例【例5.4】函数定义double f(double x)double y;y=(x*x+x+1)/2-5.5;return y;/对非void类型的函数,必须有一个/return语句,由它返回函数值,Database&Information System Lab,40,函数的说明与使用,函数应用举例【例5.4】程序#includeusing namespace std;double f(double);int main()double z,a;z=(f(2.5)+2*f(6)/f(4.3);/调用自定义函数fcouta;coutf(a)=f(a)endl;/算出f(a)并输出return 0;double f(double x)/函数f的定义,Database&Information System Lab,41,函数的说明与使用,函数应用举例【例5.4】程序(不带函数原型)#includeusing namespace std;double f(double x)/函数f的定义int main()double z,a;z=(f(2.5)+2*f(6)/f(4.3);/调用自定义函数fcouta;coutf(a)=f(a)endl;/算出f(a)并输出return 0;,Database&Information System Lab,42,函数的说明与使用,函数应用举例【例5.4】点评f()函数体内的3行也可用如下的一行来代替 return(x*x+x+1)/2-5.5);return句括号内表达式的值,即为整个函数的返回值。return句也可使用另一格式,即可以不括起表达式:return(x*x+x+1)/2-5.5;/OK!,Database&Information System Lab,43,f=(x*x+x+1)/2-5.5;不可给函数名f赋值。return(f);返回值类型应该是double,而非指针类型(函数名相当于一个指针)。f(x)=(x*x+x+1)/2-5.5;赋值号左端非变量(也即f(x)非左值)。,函数的说明与使用,函数的参数C+语言的函数分为无参函数和有参函数函数的参数无参数一个参数多个参数函数参数表的写法一般写法省略参数名(无名参数)参数赋初值,Database&Information System Lab,44,函数的说明与使用,函数的参数形参和实参函数说明中的参数称为形式参数(形参),函数调用中的参数称为实际参数(实参)实参表在参数个数、参数顺序、以及参数类型等方面要与被调函数的形参表之间有一个一一对应的相互匹配关系编译器将根据参数的顺序,来逐一实现实参与对应形参的“结合”,而后执行一遍函数体(而完成本次的函数调用),Database&Information System Lab,45,函数的说明与使用,函数的参数无名参数函数定义中,只有类型,没有名称的参数int f(int a,int b)return a+b*b;int f(int a,int b,int)return a*a+b;两个不同的函数同名,但由于第二个函数包含一无名参数,使得在调用时能够被区分,f(x,y)是第一个函数的调用,f(x,y,0)是第二个函数的调用,Database&Information System Lab,46,函数的说明与使用,函数的参数可缺省参数(参数的默认值)允许在函数定义处为其中最后面的连续若干个参数设置默认值(也称缺省值)若调用处缺省了某个或某些实参的情况下,系统将自动使用那些在函数定义处给定的参数默认值例如,在定义函数func时为其三个参数设置默认值:,Database&Information System Lab,47,#includeusing namespace std;void func(int a=11,int b=22,int c=33)/为参数a、b、c设置了默认值11、22与33couta=a,b=b,c=cendl;,函数的说明与使用,Database&Information System Lab,48,int main()func();/调用时缺省了3个实参,将使用/定义处给定的那3个相对应的参数默认值 func(55);/调用时缺省了后2个实参,将使用/定义处给定的那后2个对应参数默认值 func(77,99);/调用时缺省了最后1个实参,将使用/定义处给定的那最后1个参数默认值 func(8,88,888);/调用时没缺省任一个实参,/系统将不使用定义处给定的任一个参数默认值 return 0;,函数的说明与使用,运行结果:a=11,b=22,c=33a=55,b=22,c=33a=77,b=99,c=33a=8,b=88,c=888,Database&Information System Lab,49,函数的说明与使用,函数的参数可缺省参数(参数的默认值)只能为函数最后面的连续若干个参数设置默认值,且在调用处也只能缺省后面的连续若干个实参例如:,Database&Information System Lab,50,void func(int a,int b=2,int c=3);/OK!void func(int a=1,int b,int c=3);/ERROR!void func(int a=1,int b=2,int c);/ERROR!对第一个函数说明,采用如下的调用语句:func(1,22,333);/OK!调用时给出所有实参 func();/ERROR!参数a没有默认值 func(10,20);/OK!参数c默认为3 func(5,9);/ERROR!调用处也只能缺省后面的连续若干个实参,函数的说明与使用,函数调用过程中参数的传递一般传递过程(赋值传递)发生函数调用,转到函数体执行根据函数的形参,分配内存空间将实参赋值给形参,即为形参分配的存储空间赋值,此时实参在函数体内失效,形参有效函数执行完毕,返回到主调函数,形参所占的空间自动回收,形参失效,Database&Information System Lab,51,函数的说明与使用,函数调用过程中参数的传递按地址传递过程发生函数调用,转到函数体执行根据代表地址的参数,在以该参数为首地址的空间中进行各种处理数组名指针引用函数执行完毕,无论是否有返回值,函数体对内存空间进行的修改将保留,对主调函数仍然有效,Database&Information System Lab,52,函数的说明与使用,函数的参数能够作为函数参数的数据类型基本类型及其派生类型赋值参数传递数组、指针、引用等导出类型、按地址传递参数类类型、结构类型、联合类型等用户定义类型赋值参数传递按地址参数传递,Database&Information System Lab,53,函数的说明与使用,函数的参数一维数组作为函数的参数,数组大小可以指定,也可以不指定,但是多维数组除了第一维之外,其它维的大小必须指定函数原型int searchArray(int,int);int searchArray(int 10,int);函数定义int searchArray(int a,int b)/写为a10也可以return ab;,Database&Information System Lab,54,函数的说明与使用,函数的参数多维数组(以二维数组为例)作为函数的参数,参数表的数组参数可以写为int a10int a1010但不可以写为:int a;int a20;一维数组以及多维数组的第一维大小,形参、实参可以不对应实参为a10,形参可以定义为x6,Database&Information System Lab,55,函数的说明与使用,函数的参数数组作为函数参数,是将实参数组的首地址传递给形参,而不是将数组的所有元素传递给形参在函数体中,根据形参数组首地址和下标指示的偏移量访问数组元素能够表示地址的数据类型数组首地址(第一个元素的地址)指针引用,Database&Information System Lab,56,函数的说明与使用,函数的参数【例5.5】一维数组作参数举例:设计函数,实现两个字符数组的连接。,Database&Information System Lab,57,#includeusing namespace std;void strcat(char s,char ct)int i=0,j=0;while(si!=0)i+;while(ctj!=0)si+=ctj+;si=0;,函数的说明与使用,函数的参数【例5.5】主函数部分,Database&Information System Lab,58,int main(void)char a40=李明;char b20=是东南大学学生;strcat(a,b);/实参为数组名 coutaendl;/打印字符数组a return 0;,函数的说明与使用,函数的参数【例5.6】多维数组做函数参数举例:设计函数,实现矩阵的转置和矩阵乘法,并在主函数中验证用二维数组存储矩阵由于数组作为参数,传递的是数组的首地址,因此,在函数中对作为形参的数组进行的操作,能够直接反映到实参数组中,Database&Information System Lab,59,函数的说明与使用,【例5.6】函数原型及主函数,Database&Information System Lab,60,#includeusing namespace std;void inverse(int 36,int 63);/转置矩阵void multi(int 63,int 34,int 64);/矩阵乘法void output(int 64);/矩阵输出int main()int middle63,result64;int matrix136=8,10,12,23,1,3,5,7,9,2,4,6,34,45,56,2,4,6;int matrix234=3,2,1,0,-1,-2,9,8,7,6,5,4;inverse(matrix1,middle);/实参为数组名 multi(middle,matrix2,result);output(result);return 0;,函数的说明与使用,【例5.6】转置和乘法函数定义,Database&Information System Lab,61,void inverse(int matrix136,int middle63)/转置 int i,j;for(i=0;i3;i+)for(j=0;j6;j+)middleji=matrix1ij;return;void multi(int middle63,int matrix234,int result64)int i,j,k;/矩阵乘法 for(i=0;i6;i+)for(j=0;j4;j+)resultij=0;for(k=0;k3;k+)resultij+=middleik*matrix2kj;return;,函数的说明与使用,【例5.6】矩阵输出函数定义,Database&Information System Lab,62,void output(int result64)/矩阵输出 cout resultn;int i,j;for(i=0;i6;i+)for(j=0;j4;j+)cout setw(4)resultij;coutn;return;,函数的说明与使用,函数的参数变量的引用作为函数的形式参数赋值形参:未被说明为引用(&)的参数赋值形参和实参直观上是一致的,实际是不同的在内存中的地址不同引用形参变量的引用为变量起“别名”在作为形参的变量前加符号“&”与变量的内存地址相同需要在函数中改变实参值并将变化反映到主调函数的时候,用作为实参的变量引用是一种方法还可以用指针做形参操作变量地址,Database&Information System Lab,63,函数的说明与使用,函数的参数赋值形参赋值形参的函数调用过程和参数传递机制在执行函数调用时,在检查函数名及参数表之后,为赋值参数分配内存计算各对应的实参表达式,并把计算的值赋给刚刚创建的参数变量开始函数体的运行。凡是赋值形参,在函数的每次调用时,都必须为每一个赋值形参创建一个新的参数变量。,Database&Information System Lab,64,函数的说明与使用,函数的参数赋值形参实参表达式:函数调用语句中,与赋值形参相对应的实参可以是指定类型的常量、变量或表达式。在执行函数调用时应把该表达式的值计算出来,作为初值赋给刚刚为赋值形参创建的参数变量。这是赋值调用方式名称的由来。为赋值形参创建的参数变量是局限于函数体运行的局部变量,它作为该形参的一个实例,参加函数体程序块的这次运行,一旦运行完毕,这个参数变量就被撤消,Database&Information System Lab,65,函数的说明与使用,函数的参数实参表达式作参数例如,函数原型:int add(int a,int b);调用函数时,可以采用如下方式:int main()int x=5;int c=add(1,4*x+2);/实参为表达式,Database&Information System Lab,66,函数的使用和说明,函数的参数【例5.7】编写函数,实现两个整数的交换输入两个整数输出初始值交换输出交换后的值,Database&Information System Lab,67,void swap(int x,int y)int temp=x;x=y;y=temp;,函数的说明和使用,【例5.7】主函数部分#inlcudeusing namespace std;void swap(int x,int y).int main()int a,b;cinab;cout“a=“a“b=“bendl;swap(a,b);cout“a=“a“b=“bendl;return 0;,Database&Information System Lab,68,函数的说明与使用,【例5.7】分析程序运行结果显示,a和b的值没有进行交换!主函数运行时,为变量a和b分配存储空间调用函数swap时,为变量x和y分配存储空间函数体中交换了x和y存储单元的值a和b所在存储单元的值没有交换输出的仍然是a和b所在存储单元的值,Database&Information System Lab,69,函数的说明与使用,函数的参数引用形参函数定义的参数表中,名字前加上符号的参数为引用形参。例如void swap(int a,int b);引用形参在调用过程中的参数传递机制函数的调用语句中对应于引用形参的实参必须是同一类型的变量,非变量的表达式则不允许。参数传递的内容不是实参的值,而是地址,其实际的效果是令对应的引用形参在调用过程中,作为一个变量名指向作为实参的这个变量,在引用调用过程中并不创建新的参数变量。这一点有别于赋值调用,Database&Information System Lab,70,函数的说明与使用,函数的参数引用形参引用形参在调用过程中的参数传递机制在函数体程序块的运行中,引用形参的每次出现,由于它现在已经是指向实参变量,因此相当于全用实参变量所代替。即起到了所谓的“换名”的作用。在函数体程序运行结束,控制转回调用点时,该引用形参与实参变量的对应关系也就终止了。但是在调用过程中对于这个实参变量的所有处理和操作的结果,却保留下来。这一点也是区别于赋值调用的,Database&Information System Lab,71,函数的说明与使用,函数的参数引用形参设计函数在下面两种情形时,建议采用引用参数 需要改变某些变量的值(上述函数swap 就是一例)对于占内存较多的数据参数,为了不另建新的参数变量以节省内存为了保证实参不在函数中被修改,可在形参说明中加上const 说明,例如:complex add(const complex而对于赋值形参,则无此必要。,Database&Information System Lab,72,函数的说明与使用,函数的参数赋值调用所调用的函数参数为赋值参数引用调用所调用的函数参数为引用参数举例void printStar(int k,int n);/它所用的两个参数均为赋值参数void swap(int/它所用的第一个参数为赋值参数,另一个为引用参数,Database&Information System Lab,73,函数的说明与使用,函数的参数【例5.7】中的交换函数,采用引用作为参数void swap(int 引用参数&x和&y是实参的别名,函数中对引用形参的操作实际上就是对实参的操作,Database&Information System Lab,74,函数的说明与使用,函数的参数引用调用方式,实际上传递的是参数的地址(实参的地址),函数体中对形参的操作实际上是对实参地址的操作希望在函数中修改实参值并反映到主调函数中的时候,采用引用调用方式指针、数组等能够表示地址的数据类型作为形参,可以起到与引用形参相同的作用【例5.5】和【例5.6】是数组作为参数,在函数体中修改数组并反映到主调函数的例子,Database&Information System Lab,75,函数的说明与使用,函数的参数从赋值或引用参数的角度看函数的调用过程判断形参是赋值参数还是引用参数将对应实参表达式的值赋给赋值形参(若参数为赋值参数的话);用实参变量替换相应的形参(若参数为引用参数的话);按各形参的“当前值”(或已被“赋值”,或已被“换名”)去执行一遍函数体并返回调用处,Database&Information System Lab,76,函数的说明与使用,函数的参数赋值调用和引用调用传值方式的区别通过赋值参数来传值的方式是一种“单向传值”方式,它只可向被调函数的形参“传入”值,而不可通过该形参“传出”值 通过引用参数来传值的方式是一种“双向传值”方式,它不仅可向被调函数的形参“传入”值,而且还可通过该形参“传出”值,Database&Information System Lab,77,函数的说明与使用,函数的参数【例5.8】赋值调用和引用调用举例#includeusing namespace std;void swap(int/函数原型/前两个为引用参数,可“双向传值”/后两个为赋值参数,Database&Information System Lab,78,函数的说明与使用,int main()int i=1,j=2,k=77,n=88;cout“-In main,befor calling f1-endl;couti,j,k,n=i j k nendlendl;swap(i,j,k,n);/注意,调用后实参变量i、j的值进行了改变/而k与n的值并不改变cout-In main,after calling f1-endl;couti,j,k,n=i j k nendl;,Database&Information System Lab,79,函数的说明与使用,void swap(int,Database&Information System Lab,80,函数的说明与使用,程序运行结果-In main,befor calling f1-i,j,k,n=1 2 77 88-Enter f1-a,b,c,d=1 2 77 88-In the end of f1-a,b,c,d=2 1 88 77-In main,after calling f1-i,j,k,n=2 1 77 88,Database&Information System Lab,81,函数的说明与使用,函数的重载(后面具体讲解)多个函数使用相同的函数名函数重载必须满足下列条件之一参数表中对应的参数类型不同参数表中参数个数不同参数表中不同类型参数的次序不同例如,三个同名函数可以声明为:printStar();printStar(int);printStar(int,int);,Database&Information System Lab,82,函数的说明与使用,内联函数可在一般的函数说明前冠以关键字inline,称这样的函数为内联函数。说明方式:inline(),Database&Information System Lab,83,函数的说明与使用,内联函数在编译过程中,凡内联函数,系统均把它的执行代码插入到该函数的每个调用点处(以取代那一函数调用),从而使程序执行过程中,每次对该函数调用时不需控制转移,可节省执行时间由于每个调用点处均出现那一函数的执行代码拷贝,相对来说使用内联函数后会扩大其代码空间,Database&Information System Lab,84,函数的说明与使用,内联函数举例#include inline int max(int x,int y)/内联函数maxreturn(xy?x:y);void main()int a,b;coutab;coutmax(a,b)=max(a,b)endl;/对内联函数max的调用,Database&Information System Lab,85,函数的说明与使用,内联函数说明内联函数的函数体一般讲不宜过大,以1-5行为宜。凡在类体中定义的成员函数(见第7章)均隐含为内联函数,Database&Information System Lab,86,函数的说明与使用,函数使用的其它问题(后面具体讲解)函数的生存期与作用域函数中变量的生存期与作用域参数函数体内的局部变量函数体内的全局变量函数的存储属性外部存储属性静态存储属性函数间的数据传递方式,Database&Information System La