《2023年面向对象程序设计复习辅导三.docx》由会员分享,可在线阅读,更多相关《2023年面向对象程序设计复习辅导三.docx(38页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、面向对象程序设计复习辅导(三)函数徐孝凯一个C+语言程序由若干个程序文献和头文献所组成,每个头文献中通常带有用户类 型的定义、符号常量的定义、函数的声明等内容,每个程序文献由若干个函数定义所组成, 其中必有一个并且只有一个程序文献中包具有主函数main,称此程序文献为主程序文献。 函数是C+程序中的基本功能模块和执行单元,这一章专门讨论函数的定义和调用,变品的 作用域和生存期等内容。一、函数的定义(一)定义格式类型名函数名)(参数表)函数体类型名)为系统或用户已定义的一种数据类型,它是函数执行过程中通过rot u rn语 句规定返回的值的类型,又称为该函数的类型。当一个函数不需要通过r etu
2、r n语句返回 一个值时,称为无返回值函数或无类型函数,此时需要使用保存字void作为类型名。当类 型名为int时,可以省略不写,但为了清楚起见,还是写明为好。函数名是用户为函数所起的名字,它是一个标记符,应符合C+标记符的一般命名 规则,用户通过使用这个函数名和实参表可以调用该函数。参数表又称形式参数表,它包具有任意多个(含0个,即没有)参数说明项,当多于 一个时其前后两个参数说明项之间必须用逗号分开。每个参数说明项由一种已定义的数据类 型和一个变量标记符组成,该变量标记符成为该函数的形式参数,简称形参,形参前面给出的 数据类型称为该形参的类型。一个函数定义中的V参数表)可以被省略,表白该函
3、数为无参 函数,若 参数表用void取代,则也表白是无参函数,若参数表不为空,同时又不是 保存字void,则称为带参函数。置接着向下执行。当return语句带有表达式时,又分为两种情况,一种是函数类型为非引用 类型,则计算出r e turn表达式的值,并把它保存起来,以便返回后访问它参与相应的运算; 另一种情况是函数的类型为引用类型,则re turn中的表达式必须是一个左值,并且不能 是本函数中的局部变量(关于局部变量的概念留在下一节讨论),执行r e turn语句时就返 回这个左值,也可以说函数的返回值是该左值的一个引用。因此,返回为引用的函数调用表 达式既可作为右值乂可作为左值使用,但非引
4、用类型的函数表达式只能作为右值使用。例如:in t & fl4(int a, in t n)(。i nt k=0;for(in t i=l;ia k ) k=i;return ak;)该函数的功能是从一维整型数组an中求出具有最大值的元素并引用返回。当调用该 函数时,其函数表达式既可以作为右值,从而取出a k的值,乂可以作为左值,从而向a k 赋予新值。如:#inclu d eint& f14(int a口, int n)(int k=0;for(int i=l;i a k) k = i;oretu r n a k ;oint b 8 = 25, 3 7, 1 8 , 6 9, 54, 73,
5、 6 2, 3 1 ;。c ou t fl4(b , 8) endl;f 1 4(b, 5)=86;。fo r (int i=0; i 8; i+) c o utbi zocoutendl;)该程序的运营结果如下,请读者自行分析。7325 3 7 18 8 6 54 73 62 31通常把函数定义为引用的情况较少出现,而定义为非引用(即普通类型和指针类型)的情 况则常见。(三)函数调用举例程序1 :# inc 1 uden t xkl (int n );vo i d m a i nO(cout v ”输入i个正整数:“;i nt m;c i n m;3int sum=xkl (m)+xk 1
6、(2*m+l);ocoutsume n(11;i nt xk 1 (int n),for (i = l; i=n;i+) s+= i ;r e turn s;)该程序包含一个主函数和一个xkl函数,在程序开始给出了一条xkl函数的原型语句, 使得xkl函数无论在什么地方定义,在此程序文献中的所有函数都可以合法地调用它。注意: 主函数不需要使用相应的函数原型语句加以声明,由于C+规定不允许任何函数调用它,它 只由操作系统调用并返回操作系统。函数x kl的功能是求出自然数1至n之和,这个和就是s的最后值,由r e turn语句 把它返回。在主函数中一方面为m输入一个自然数,接着用m去调用xkl函数
7、返回1至m之 间的所有自然数之和,再用2 *m+l去调用xkl函数返回1至2 *m+l之间的所有自然数之和, 把这两个和加起来赋给变量s um,最后输出s um的值。假定从键盘上为m输入的止整数为5 ,则进行xk 1 (m)调用时把m的值5传送给n,接着 执行函数体后返回s的值为15,进行xkl (2*m+l )调用时把2*m+l的值1 1传送给n,接着 执行函数体后返回s的值为6 6,它们的和81被作为初值赋给sum,最后输出的sum值为8 1。程序2:ttinclud e void x k 2( i nt& a, i n t b);v o id main()(int x=12, y= 1
8、8;ocoutx=z,x, y=H yend 1;x k 2 ( x , y);。c o ut x =* x *1 y= H yendl; void xk2(in t & a, i nt b) couta = a* Y b=VVbVVend 1 ;a=a+b;b=a+ b ;coutz,a= az ?,b=b end 1 ;)该程序包含一个主函数和一个xk2函数,xk2函数使用了两个形参,一个是整型引 用变量a,另一个是整型变量b。在主函数中使用xkl (x, y)调用时,将使形参a成为实参 x的别名,在函数体中对a的访问就是对主函数中x的访问,此调用同时把y的值传送给形参 b,在函数体中对形
9、参b的操作是与相应的实参y无关的,由于它们使用各自的存储空间。 该程序的运营结果为:x= 1 2 y=l 8a=l 2 b=J8a=30 b=48x=30 y=18程序3:# i nc 1 u dev oid x k 3(i n t * a, in t * b);voi d xk 4 (int& a, int& b);void main()(int x=5, y= 1 0;co u tx= x * y = V VyXendl;x k 3 (& x , &y);cout x = V x J y= y e ndl; xk 4 (x, y);。c out* x =*x/ Yy=yendl;)void
10、 xk3(int* a, int* b)(int c=* a ;* a =*b;*b= c ;)voi d xk4( i nt& a, i nt& b)(。int c =a;a= b ;b = c ;该程序中的x k 3函数用于互换a和b分别指向的两个对象的值,主函数使用x k3(&x, &y)调用时,分别把x和y的地址赋给形参a和b ,所以实际互换的是主函数中x和y的值; x k4函数用于直接互换a和b的值,由于a和b都是引用参数,所以在主函数使用xk 4 (x, y) 调用时,执行x k 4函数实际互换的是相应实参变量x和y的值此程序的运营结果为:x=5 y=l 0x= 1 0 y= 5x
11、=5 y=10上述的xk 3和xk4具有完全相同的功能,但由于在x k 3中使用的是指针参数,传送给 它的实参也必须是对象的地址,在函数体中访问指针所指向的对象必须进行间接访问运算,所以,定义和调用xk3不如定义和调用x k 4直观和简便。程序4:# in c 1 u decons t i n t N= 8 ;int xk5(i n t a , i n t n);void main()int bN= 1 ,7, 2, 6, 4, 5, 3,-2);3i n t ml= x k5 (b, 8);。int m2 =xk 5 (&b2 ,5 );。in t m3=xk 5 (b+3, 3):cou
12、t m 1 m2V m3en d 1;i n t xk5 (int a , int n)(。int i, f=l;f o r ( i =0 ; i n;i+) f *= a i; 或写成 f*=*a+ + ;。return f;)该函数包含一个主函数和一个xk5函数,x k5函数的功能是求出一维整型数组a n 中所有元素之积并返回。在主函数中第一次调用xk5函数时,把数组b的首地址传送给a, 把数组b的长度8传送给n,执行函数体对数组a的操作事实上就是对主函数中数组b的操 作,由于它们同时指向数组b的存储空间;第二次调用xk5函数是把数组b中b 2元素的 地址传送给a,把整数5传送给n,执行函
13、数体对数组an的操作事实上是对数组b中b2 至b6之间元素的操作;第三次调用xk5函数是把数组b中b3元素的地址传送给a,把整 数3传送给n,执行函数体对数组a n的操作事实上是对数组b中b 3至b5之间元素 的操作。该程序的运营结果为:-1 0 08 0 720 1 2 0程序5:#inc 1 u d echar* xk6( c ha r * s p, c h ar* dp);void m a in()(。char a 15 = abca d e caxy b c w ;3cha r b15;。char * cl = x k6(a,b);oc o u t c 1 a be n dl;char
14、* c2=xk6 (a+ 4 , b);coutVclV 1 a* * b end 1 ;)ch a r* xk 6 (cha r * s p , char* dp) (。i f (*sp=0)*dp=,O, ; return dp;i n t i=0, j ;for (char* p=sp; *p; p+) /扫描s p所指字符串中的每个字符位 置3 f or(j= 0 ; j = i)dp i+=*p;/ /若d p数组的前i个元素均不等于*p,则把* P写入d pi元素中)dp i = 0* ; 写入字符串结束符retu r n dp;x k 6函数的功能是把sp所指向的字符串,去掉反复
15、字符后拷贝到dp所指向的字符数 组中,并返|可dp指针。在主函数中第一次调用xk 6函数时,分别以a和b作为实参,第二次 调用时分别以a+4 (艮*的地址)和b作为实参。该程序运营后的输出结果为:abcdexyw abcadec a x y b cw a b cde x ywdeca xybw a b ca d ecaxyb c w d e ca x yb w程序6:# includ e i n t* xk7 ( i nt * & al, in t * a 2);i n t* x k7(i n t al, i n t* a2)。c o u t when en t e r xk7: *al, *
16、a2=z* * a 1 , *a 2 endl;al= n e w int(2 *al+4);oa2 =ne w i n t (2*a2 1 );。cout,when leave xk 7 : *al, *a2 =V*al, ”*a2Ve n dl;r e turn a2;)voi d ma i n()in t x= 1 0, y=25;i nt *xp=&x, *yp=&y;c outwbofore call x k7: *xp, * y p= V* x p”,,*ypondl;i nt* i p=xk7 ( x p , y p );c o ut?,a f te r call xk7: *x
17、p, *yp= V*xpV, ”*y p Ven d 1; co u tV* i p=* * ip e ndl;d elete xp; /x p指向的是在执行xk7函数时动态分派的对象*al delete ip; ip指向的是在执行xk 7函数时动态分派的对象*a2 )在x k 7函数的定义中,把形参al定义为整型指针的引用,把a2定义为整型指针,当在主 函数中运用xk7(xp,yp)表达式调用该函数时,al就成为xp的别名,访问a 1就等于访问 主函数中的x p ,而a2同y p具有各自独立的存储空间,a 2的初值为y p的值,在xk7函数 中对a2的访问(指直接访问)与yp无关。此程序运营
18、结果为:bofo r e c all xk7: *xp, *yp=10,2 5w h en e nter xk 7 :* al,* a 2=10, 2 5when leave xk7: *al, *a2= 2 4 ,49aft e r call x k 7:* xp, *yp=24, 2 5*ip=49三、变量的作用域在一个C+程序中,对于每个变量必须遵循先定义后使用的原则。根据变量定义的位置 不同将使它具有不同的作用域。一个变量离开了它的作用域,在定义时为它分派的存储空间 就被系统自动回收了,因此该变最也就不存在了。(一)作用域分类变量的作用域具有四种类别:全局作用域、文献作用域、函数作用域
19、和块作用域。具 有全局作用域的变量称为全局变量,具有块作用域的变量称为局部变量。1 .全局作用域当一个变量在一个程序文献的所有函数定义之外(并且通常在所有函数定义之前)定 义时,则该变量具有全局作用域,即该变量在整个程序涉及的所有文献中都有效,都是可见 的,都是可以访问的。当一个全局变量不是在本程序文献中定义时,若要在本程序文献中使用, 则必须在本文献开始进行声明,声明格式为:ex t e rn类型名变量名, 变量名,.;它与变量定义语句格式类似,其区别是:不能对变量进行初始化,并且要在整个语句 前加上exte r n保存字。当用户定义个全局变量时,若没有对其初始化,则编译时会自动把它初始化为
20、0。2 .文献作用域当一个变量定义语句出现在一个程序文献中的所有函数定义之外,并且该语句前带有s ta t ic保存字时,则该语句定义的所有变量都具有文献作用域,,即在整个程序文献中有效, 但在其他文献中是无效的,不可见的。若在定义文献作用域变量时没有初始化,则编译时会自动把它初始化为0。3 .函数作用域在每个函数中使用的语句标号具有函数作用域,即它在本函数中有效,供本函数中的 gol。语句跳转使用。由于语句标号不是变量,应当说函数作用域不属于变量的一种作用域。4,块作用域当一个变量是在一个函数体内定义时;则称它具有块作用域,其作用域范围是从定义 点开始,直到该块结束(即所在复合语句的右花括号
21、)为止。具有块作用域的变量称为局部变量,若局部变量没有被初始化,则系统也不会对它初 始化,它的初值是不拟定的。对于在函数体中使用的变量定义语句,若在其前面加上st a tic 保存字,则称所定义的变最为静态局部变量,若静态局部变量没有被初始化,则编译时会被 自动初始化为00对于非静态局部变量,每次执行到它的定义语句时,都会为它分派相应的存储空间,并 对带初值表达式的变量进行初始化;而对于静态局部变量,只是在整个程序执行过程中第一 次执行到它的定义语句时为其分派相应的存储空间,并进行初始化,以后再执行到它时什么 都不会做,相称于第一次执行后就删除了该语句。函数体是一条复合语句,它以左花括号开始,
22、到右花括号结束,中间为一条或若干条 C+语句。在一个函数的参数表中,每个参数可认为任一种数据类型,涉及普通类型、指针类型、 数组类型、引用类型等,一个函数的返回值可以是除数组类型之外的任何类型,涉及普通类 型、指针类型和引用类型等。此外,当不需要返回值时,应把函数定义为void类型。(二)定义格式举例(1) void fl (). . (2 ) void f2(i n t x) (3) i n t f 3 (i n t x, int* p ) .(4) char* f 4( c h a r a) (.)(5 ) int f5(int& x, dou bled) . . (6) i n t &
23、f6(int b10, i nt n) (. .)(7) void f7 ( f 1 o at c N, int m, flo a t & max)(8) b ool f 8 ( E lemTyp e *& bt, E 1 emT y pe& i tem) . . 在第一条函数定义中,函数名为门,函数类型为void,参数表为空,此函数是一个无参 无类型函数。若在fl后面的圆括号内写入保存字voi d ,也表达为无参函数。在第二条函数定义中,仅带有一个类型为int的形参变量x ,该函数没有返回值。在第三条函数定义中,函数名为f 3 ,函数类型为in t,函数参数为x和p,其中x为i n t型普通
24、参数,p为int*型指针参数。在第四条函数定义中,函数名为f4,函数类型为char*,即字符指针类型,参数表中包 含一个一维字符数组参数。注意:在定义任何类型的一维数组参数时,不需要给出维的尺寸, 当然给出也是允许的,但没有任何意义。在第五条函数定义中,函数名为5,返回类型为int,该函数带有两个形参,一个为 整型引用变量x,另一个为双精度变量d。在第六条函数定义中,函数名为f6,函数类型为i nt&,即整型引用,该函数带有两个形参,一个是整型数组b,另一个是整型变量n。在这里定义形参数组b所给出的维的尺任一函数定义中的每个形参也具有块作用域,这个块是作为函数体的复合语句,当离开 函数体后它就
25、不存在了,函数调用时为它分派的存储空间也就被系统自动回收了,当然引用 参数相应的存储空间不会被回收。由于每个形参具有块作用域,所以它也是局部变量。在C+程序中定义的符号常量也同变量同样具有全局、文献和局部这三种作用域。当符 号常量定义语句出现在所有函数定义之外,并且在前面带有ex tern保存字时,则所定义 的常量具有全局作用域,若在前面带有stati c关键字或什么都没有,则所定义的常量具有 文献作用域。若符号常量定义语句出现在个函数体内,则定义的符号常量具有局部作用域。一个C+程序中的所有函数的函数名都具有全局作用域,所以在程序中所含的任何 文献内都可以使用任一函数名构成函数调用表达式,执
26、行相应的函数。具有同一作用域的任何标记符,不管它表达什么对象(如常量、变量、函数、类型等) 都不允许重名,若重名系统就无法唯一拟定它的含义九由于每一个复合语句就是一个块,所以在不同复合语句中定义的对象具有不同的块 作用域,也称为具有不同的作用域,其对象名允许重名,由于系统可以区分它们。(二)程序举例程序7 :程序主文献7.cpp# inc 1 udeint xk8(in t n) ;/ /函数xk8的原型声明i n t x k 9 (int n);函数x k9的原型声明i n t AA=5;/ /定义全局变量AAe x te r n cons t int BB=8; 定义全局常量 BBs ta
27、t ic i n t CC=1 2 ;/定义文献域变量CCconstintl)D=2 3;定义文献域常量D )void m a i n ()int x = 1 5;x的作用域为主函数体cou t x*x=xk8(x)endl;cou t *main F i 1 e : A A, B B =/AA,, BBen d 1;cou t ma i n Fi 1 e: CC, DD=CC, DIK e nd 1 ;c o u txk9(16)endl;)i nt xk9( i nt n)/ /n的作用域为xk 9函数体in t x= 1 0:/ / x的作用域为xk9函数体c o ut X k9: x=
28、 X en d 1;return n*x;程序次文献7T. cpp# i nc 1 ud e in t xk8(int n);函数xk 8的原型声明e x t ern int AA;/全局变量AA的声明e x t er n con s t int BB ; 全局常量BB的声明s t a t i c int C C=120; 定义文献域变量CCconst int DD=230;/定义文献域常量DDint xk8( i nt n )/ / n的作用域为x k 8函数体(cout?,atta c hF i le: AA, BB= A A*, * B B en d 1;coutat t achFile
29、: CC, DD =VC CV, VDDVen d 1;return n* n ;此程序包含两个程序文献,定义有各种类型的变量和常量,其中A A为全局变量,BB为 全局常量,CC为各自的文献域变量,DD为各自的文献域常量,主函数中的x为作用于主函数 的局部变量,xk9函数中的x为作用于该函数的局部变量,x k8和xk9函数的各自参数表中 的形参n是作用于各自函数的局部变量。为了在程序次文献7 7. cp P中可以使用程序主文 献7 . cpp中定义的全局变量AA和全局常量BB,必须在该文献开始对他们进行声明。当上机输入和运营该程序时可以先建立程序主文献d6-7.cpp并编译通过,再建立 程序次
30、文献7 1 . cpp并编译通过,然后把它们连接起来生成可执行文献7. e xe。该程 序的运营结果为:attach F ile: AA, BB= 5 , 8a t ta c hFi 1 e : C C, DD=120,230x*x=225mainFi 1 e : AA, BB=5, 8mai nFil e : CC, DD= 1 2, 23xk 9 : x=10160请读者结合上述程序分析结果的对的性。程序8:# i n c 1 ud e co n st i n t N=1 0 ;void main()(int a N =3,8,1 2, 20,15, 6, 7, 24, 8, 19;for
31、 (i n t i =0;iVN /2;i+) o int x=a i ;a i =a N- i -1;a N-i - 1 =x,for ( i = 0 ; iN; i+) couta i z;coutendl;)在这个程序中,N为文献域常量,a和i分别为主函数体复合语句块内的局部数组和变 量,它们的作用域从定义点开始到主函数结束,x为for循环体复合语句块内的局部变量, 它的作用域从定义点开始到f or循环体结束。在主函数中,一方面定义了一维整型数组a N,接着运用for循环互换数组a中前后对 称元素的值,使得a中的每个元素值按原有位置的逆序排列,然后依次输出a中每个元素值。 该程序运营结果
32、为:1 9 8 2 4 7 6 1 5 20 1 2 8 3程序9:#includevo i d i nput 0 ;v oid o u tput ();int s um S quar e ( i n t b, int n );const int n n=5; 定义文献域常量nnint a nn;定义全局域数组an n v oid main ()(,inp u t ();。o u tp u t ();。co u ts u mSq u a re (a, nn)endl; 使用数组a和常量nn作为实参vo id input ()cout”为数组 a 输入V Vnn”个整数:*e n d 1 ;。f
33、or( i nt i= 0 ; inn; i+) c i n a i ;/ / i 是本函数的局部变量)voi d output ()(cout 输出数组a中的VnnV 个元素值: e nd 1 ;for (int i=0; i nn; i+) c o u ta i *;/i 是本函数的局部变最。coutend 1 ;i n t s umSqu a re (in t b , int n) b将指向相应的实参数组a, / /形参指针b和形参n是本函数中的局部变量(/ /求数组a中n个元素之和的平方。int s =0, i ; /s和i是本函数的局部变量。for (i=0;in;i+) s+=bi
34、;r ctu r n s*s;)该程序包含一个主函数和三个一般函数,主函数依次调用这三个函数。Input函数从 键盘上向数组a nn输入数据,out p ut函数依次输出数组ann中每个元素的值,sumSqua r c函数求出数组b中n个元素值之和的平方。由于调用sumSquare函数是把实参数组a 和常量nn分别传送给形参数组b和形参变量n ,所以在函数体中对数组bn的操作事实上 是对实参数组ann的操作。在本程序中,nn为文献域常量,a n n为全局域数组,所以,它们可以使用在该程序 中的任何地方,即在任何地方都是可见的。假定程序运营时从键盘上输入的5个整数为:1,2, 3,4,5,则得到
35、的运营结果为: 为数组a输入5个整数:1 2 3 4 5输出数组a中的5个元素值:1 2 3 4 5225程序1 0 :# i n c 1 u dci n t x=l 0 ;v oid m a i n ()int y= 2 0;co u t x , y =*x,, 1 y e n d 1 ;(。in t x=30;y = y + x ;cout,zx, y =*x ye n d 1;cout x, y=/x, /yend 1 ;)在函数体外定义的x为全局变量,在主函数体中定义的y为作用于整个函数体的局 部变量,在主函数体中的一条复合语句中又定义了一个变量x ,它的作用域只局限于该复合 语句内,
36、离开了该复合语句它就不存在了。在C+中,当一个作用域包含另一个作用域时,则在里层作用域内可以定义与外层作 用域同名的对象,此时在外层定义的同名对象,在内层将被重:新定义的同名对象屏蔽掉,使之 变为不可见。如在此程序主函数体中的一条复合语句内,由于重新定义了变量X,所以全局 变量X在此复合语句内暂时被屏蔽掉,当离开这条复合语句后,全局变量X为有效。此程序 运营结果如下:x , y =10, 20x,y= 3 0, 50x , y =1 0 , 50提醒:若要在函数体内访问与局部变量同名的全局域或文献域变量,则只要在该变量 名前加上作用域区分符(:)即可。如:x使用在上述主函数中定义有x的复合语句
37、内时, 则就表达全局变最x,若不加作用域区分符则表达在当前作用域内定义的变量x。程序11:ttincludei n t xklO ( i n t m, int n)/求出m和n的最大公约数(int r=m%n:w h i le(r! = 0 ) 。m=n;。n=r;r =m%n;0 )。r eturn n;void main ()int m, n;。d o coutend 1 ;。cout输入两个整数求其最大公约数(若任一数mn:if (m = 0 | | n= 0 ) b r ea k ; 输入的任一数小于等于0则结束循环。c o utXVmV和VnV”的最大公约数为:VxklO(m, n)
38、endl;。 while( 1 );)在这个程序中,主函数和xklO函数中都定义有m和n这两个整数变量,并且主函数调用 xklO是通过值传送进行的,所以主函数中的m和n与xk 1 0函数中的m和分别占用各自的 存储空间,分别具有各自的作用域,一个函数中的m和n值的变化与另一个函数中的m和n 无关。假定需要依次求出(75, 15), ( 3 6,90), (74, 2 5), (3 5 0,48)等四组整数的最大公 约数,则程序运营结果如下:输入两个整数求其最大公约数(若任一数70则结束):75 1575和15的最大公约数为:15输入两个整数求其最大公约数(若任数=0则结束):36 9036和9
39、0的最大公约数为:18输入两个整数求其最大公约数(若任一数=0则结束):74 2 574和25的最大公约数为:1输入两个整数求其最大公约数(若任一数=0则结束):350 4 8350和48的最大公约数为:2输入两个整数求其最大公约数(若任一数=0则结束):0 0程序1 2 :#in c 1 u d evoid x k 1 1 ( i nt& x, int y);v oid mainO(aint x= 1 2 ,y=2 5 ;。xk 1 1 (x, y);cout*mai n 1 : x, y= x* * yendl;。x k 1 1 (y, x );,c out in a in2:x, y=/
40、z x * J y en d 1;。xk 1 1(x, x+y):,c o u t i n 3:x, y =,x, y e n d 1;)v o i d xk 1 1 (int& x, int y)(ox=x+2; y=x + y;。c o ut xkll: x , y=*x, 1 y e ndl:)在xkll函数中,说明x为引用参数,y为非引用参数,在主函数中也定义X和y变量, 每次运用不同的实参调用xkll函数,并通过输出语句显示出x和y的值,读者可以借此分 析不同的参数传递方式对不同作用域内变量的影响作用。该程序运营结果为:xkll: x, y =14 39m a i nl:x, y=l
41、4 25xkll: x, y =27 4 1main2:x, y=14 27 xkll: x, y =16 57ma i n 3: x, y=16 2 7程序13:#in c lud e v oid x k 12 ();void main ()(fo r (int i=0;i5; i+) xk12();)void x kl2()(。 int a=0; a若不被初始化,则初值是未知的a +;s t at i c int b =0;/ / b若不被初始化,也将被自动赋初值0b+ + ;c o u t a=a/,, b=z,bendl;在该程序的xkl 2函数中定义有局部变量a和静态局部变量b,主函
42、数5次调用这个函 数,每次调用都将为a分派存储空间并被初始化为0,但只有第一次调用才使为b分派存储 空间并初始化为0,其余4次调用都不会再建立b并初始化,将始终访问第一次建立的b,也就 是说,静态局部变量同全局变量和文献域变量同样,一经建立和初始化后将在整个程序运营 过程中始终存在,只有当程序运营结束时系统才收回分派给它的存储空间。该程序的运营结 果为:a=l, b=la=l, b =2a=l, b= 3 寸10可以被省略。在第七条函数定义中,函数名为f 7,无函数类型,参数表中包含三个参数,一个为二 维单精度型数组c,第二个为整型变量m,第三个为单精度引用变量max。注意:当定义 一个二维数
43、组参数时,第二维的尺寸必须给出,并且必须是一个常量表达式,第一维尺寸可给 出也可不给出,其作用相同。在第八条函数定义中,函数名为f8,返【可类型为b o。1,即逻辑类型,该函数带有两个 参数,一个为形参bt,它为Ele m Type的指针引用类型,另一个为形参i t em,它是ElemT ype的引用类型,其中ElemTy p e为一种用户定义的类型或是通过typedef语句定义的一 个类型的别名。(三)有关函数定义的几点说明1 .函数原型语句在一个函数定义中,函数体之前的所有部分称为函数头,它给出了该函数的返回类型、 每个参数的顺序和类型等函数原型信息,所以当没有专门给出函数原型说明语句时,
44、系统就 从函数头中获取函数原型信息。一个函数必须先定义或声明而后才干被调用,否则编译程序无法判断该调用的对的性。个函数的声明是通过使用条函数原型语句实现的,当然使用多条相同的原型语句声明同 一个函数虽然多余但也是允许的,编译时不会出现错误。在个完整的程序中,函数的定义和函数的调用可以在同一个程序文献中,也可以处 在不同的程序文献中,但必须保证函数原型语句与函数调用表达式出现在同一个文献中,并 且函数原型语句出现在前,函数的调用出现在后。通常把一个程序中用户定义的所有函数的原型语句组织在一起,构成一个头文献, 让该程序中所含的每个程序文献的开始(即所有函数定义之前)包含这个头文献(通过# i n elude命令实现),这样不管每个函数的定义在哪里出现,都可以保证函数先声明后使用 (即调用)这一原则的实现。个函数的原型语句就是其函数头的个拷贝,当然要在最后加上语句接上结束符分 号。函数原型语句与函数头也有细微的差别,在函数原型语句中,其参数表中的每个参数允许a=l, b= 4a= 1 , b=5总之,对于全局变量、文献域变量、加入static保存字定义的局部变量、运用ne w 运算符动态分派的对象,它们的生存期(