《2022年面向对象程序设计复习辅导.docx》由会员分享,可在线阅读,更多相关《2022年面向对象程序设计复习辅导.docx(44页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选学习资料 - - - - - - - - - 面对对象程序设计复习辅导(三) -函 数徐孝凯一个 C+语言程序由如干个程序文件和头文件所组成,每个头文件中通常带有用户类型的定义、符号常量的定义、函数的声明等内容,每个程序文件由如干个函数定义所组成,其中必有一个并且只有一个程序文件中包含有主函数main,称此程序文件为主程序文件;函数是 C+程序中的基本功能模块和执行单元,这一章特地争论函数的定义和调用,变量的作用域和生存期等内容;一、函数的定义(一)定义格式 returnreturn语句要求为系统或用户已定义的一种数据类型,它是函数执行过程中通过返回的值的类型,又称为该函数的类型;当一个函
2、数不需要通过语句返回一个值时,称为无返回值函数或无类型函数,此时需要使用保留字 int 时,可以省略不写,但为了清晰起见,仍是写明为好;是用户为函数所起的名字,它是一个标识符,应符合 就,用户通过使用这个函数名和实参表可以调用该函数;void 作为类型名;当类型名为 C+标识符的一般命名规又称形式参数表,它包含有任意多个(含 0 个,即没有)参数说明项,当多于一个时其前后两个参数说明项之间必需用逗号分开;每个参数说明项由一种已定义的数据类型和一个变量标识符组成,该变量标识符成为该函数的形式参数,简称形参,形参前面给出的数据类型称为该形参的类型;一个函数定义中的可以被省略,说明该函数为无参函数,
3、如 用 void 取代,就也说明是无参函数,如 不为空,同时又不 是保留字 void ,就称为带参函数;是一条复合语句,它以左花括号开头,到右花括号终止,中间为一条或如干条 C+语句;在一个函数的参数表中,每个参数可以为任一种数据类型,包括一般类型、指针类 型、数组类型、引用类型等,一个函数的返回值可以是除数组类型之外的任何类型,包括一般类型、指针类型和引用类型等;另外,当不需要返回值时,应把函数定义为void类型;(二)定义格式举例 1 void f1 . 2 void f2int x . 3 int f3int x,int* p . 4 char* f4char a. 5 int f5in
4、t& x,double d . 6 int& f6int b10, int n . 7 void f7float cN, int m, float& max . 8 bool f8ElemType*& bt, ElemType& item . 在第一条函数定义中,函数名为f1 ,函数类型为void ,参数表为空,此函数是一个无参无1 / 27 名师归纳总结 - - - - - - -第 1 页,共 27 页精选学习资料 - - - - - - - - - 类型函数;如在f1 后面的圆括号内写入保留字void ,也表示为无参函数;在其次条函数定义中,仅带有一个类型为 int 的形参变量 x,该函
5、数没有返回值;在第三条函数定义中,函数名为 f3 ,函数类型为 int ,函数参数为 x 和 p,其中 x 为int 型一般参数, p 为 int* 型指针参数;在第四条函数定义中,函数名为 f4 ,函数类型为 char* ,即字符指针类型,参数表中包含一个一维字符数组参数;留意:在定义任何类型的一维数组参数时,不需要给出维的尺寸,当然给出也是答应的,但没有任何意义;在第五条函数定义中,函数名为 f5 ,返回类型为 int ,该函数带有两个形参,一个为整型引用变量 x,另一个为双精度变量 d;在第六条函数定义中,函数名为 f6 ,函数类型为 int& ,即整型引用,该函数带有两个形参,一个是整
6、型数组 b,另一个是整型变量 n;在这里定义形参数组 b 所给出的维的尺寸 10 可以被省略;在第七条函数定义中,函数名为f7 ,无函数类型,参数表中包含三个参数,一个为二维单精度型数组c,其次个为整型变量m,第三个为单精度引用变量max;留意:当定义一个二维数组参数时,其次维的尺寸必需给出,并且必需是一个常量表达式,第一维尺寸可 给出也可不给出,其作用相同;在第八条函数定义中,函数名为 f8 ,返回类型为 bool ,即规律类型,该函数带有两个 item ,它是 参数,一个为形参 bt ,它为 ElemType 的指针引用类型,另一个为形参 ElemType 的引用类型,其中 ElemTyp
7、e 为一种用户定义的类型或是通过 typedef 语句定义 的一个类型的别名;(三)有关函数定义的几点说明 函数原型语句 1. 在一个函数定义中,函数体之前的全部部分称为函数头,它给出了该函数的返回类 型、每个参数的次序和类型等函数原型信息,所以当没有特地给出函数原型说明语句时,系统就从函数头中猎取函数原型信息;一个函数必需先定义或声明而后才能被调用,否就编译程序无法判定该调用的正确 性;一个函数的声明是通过使用一条函数原型语句实现的,当然使用多条相同的原型语句 声明同一个函数虽然余外但也是答应的,编译时不会显现错误;在一个完整的程序中,函数的定义和函数的调用可以在同一个程序文件中,也可以处
8、在不同的程序文件中,但必需确保函数原型语句与函数调用表达式显现在同一个文件中,并且函数原型语句显现在前,函数的调用显现在后;通常把一个程序中用户定义的全部函数的原型语句组织在一起,构成一个头文件,让 该程序中所含的每个程序文件的开头(即全部函数定义之前)包含这个头文件(通过 #include 命令实现),这样不管每个函数的定义在哪里显现,都能够确保函数先声明后使 用(即调用)这一原就的实现;一个函数的原型语句就是其函数头的一个拷贝,当然要在最终加上语句接上终止符分 号;函数原型语句与函数头也有微小的差别,在函数原型语句中,其参数表中的每个参数 答应只保留参数类型,而省略参数名,并且如使用参数名
9、也答应与函数头中对应的参数名 不同;2. 常量形参 在定义一个函数时,如只答应函数体拜访一个形参的值,不答应修改它的值,就应把该形参说明为常量,这只要在形参说明的前面加上const 保留字进行修饰即可;如: void f9const int& x, const char& y; void f10const char* p, char key;2 / 27 名师归纳总结 - - - - - - -第 2 页,共 27 页精选学习资料 - - - - - - - - - 在函数 f9 的函数体中只答应使用x 和 y 的值,不答应修改它们的值;在函数f10 的函数体中只答应使用 p 所指向的字符对象
10、或字符数组对象的值,不答应修改它们的值,但在函数体中既答应使用也答应修改形参 key 的值;3. 缺省参数在一个函数定义中,可依据需要对参数表末尾的一个或连续如干个参数给出缺省值,当调用这个函数时,如实参表中没有给出对应的实参,就形参将采纳这个缺省值;如: void f11int x, int y=0 . int f12int a, char op=+, int k=10 . 函数 f11 的定义带有两个参数,分别为整型变量 x 和 y,并且 y 带有缺省值 0,如调用该函数的表达式为 f11a,b,将把 a 的值赋给 x,把 b 的值赋给 y,接着执行函数体;如调用该函数的表达式为 f11a
11、+b ,就也是正确的调用格式,它将把 a+b 的值赋给 x,因 y 没有对应的实参,将采纳缺省值0,参数传送后接着执行函数体;函数 f12 的定义带有三个参数,其中后两个带有缺省值,所以调用它的函数格式有三种,一种只带一个实参,用于向形参a 传送数据,后两个形参采纳缺省值,其次种带有两个实参,用于分别向形参 a 和 op 传送数据,第三个形参采纳缺省值,第三种带有三个实 参,分别用于传送给三个形参;如一个函数带有特地的函数原型语句,就形参的缺省值只能在该函数原型语句中给出,不答应在函数头中给出;如对于上述的f11 和 f12函数,其对应的函数原型语句分别为: void f11int x, in
12、t y=0; int f12int a, char op=+, int k=10函数定义应分别改写为: void f11int x, int y . int f12int a, char op, int k . 4. 数组参数 在函数定义中的每个数组参数实际上是指向元素类型的指针参数;对于一维数组参数说明: 它与下面的指针参数说明完全等价:* 其中 就是数组参数说明中的 ;如对于 f12 函数定义中的数组参 数说明 int a,等价于指针参数说明 int* a;也就是说,数组参数说明中的数组名 a 是 一个类型为 int* 的形参;留意:在变量定义语句中定义的数组,其数组名代表的是一个数组,它
13、的值是指向第一个元素的指针常量,这与数组形参的含义有区分;对于二维数组参数说明: 它与下面的指针参数说明完全等价: * 如 对 于 f7函 数 定 义 中 的 二 维 数 组 参 数 说 明float cN, 等 价 于 指 针 参 数 说 明float*cN;5. 函数类型当调用一个函数时就执行一遍循环体,对于类型为非void 的函数,函数体中至少必需带有一条 return 语句,并且每条 return 语句必需带有一个表达式,当执行到任一条return 语句时,将运算出它的表达式的值,终止整个函数的调用过程,把这个值作为所求3 / 27 名师归纳总结 - - - - - - -第 3 页,
14、共 27 页精选学习资料 - - - - - - - - - 的函数值带回到调用位置,参加相应的运算;对于类型为void 的函数,它不需要返回任何函数值,所以在函数体中既可以使用 return 语句,也可以不使用,对于使用的每条 return 语句不答应也不需要带有表达式,当执行到任一条 return 语句时,或执行到函数 体最终终止位置时,将终止函数的调用过程,返回到调用位置向下连续执行; 6. 内联函数inline就就把该函数声明为内联函数;运算当在一个函数的定义或声明前加上关键字机在执行一般函数的调用时,无论该函数多么简洁或复杂,都要经过参数传递、执行函数 体和返回等操作;如把一个函数声
15、明为内联函数后,在程序编译阶段系统就有可能把全部 调用该函数的地方都直接替换为该函数的执行代码,由此省去函数调用时的参数传递和返 回操作,从而加快整个程序的执行速度;通常可把一些相对简洁的函数声明为内联函数,对于较复杂的函数就不应声明为内联函数;从用户的角度看,调用内联函数和一般函数没 有任何区分;下面就是一个内联函数定义的例子,它返回形参值的立方; inline int cubeint n return n*n*n; 二、函数的调用(一)调用格式 调用一个已定义或声明的函数需要给出相应的函数调用表达式,其格式为: 如调用的是一个无参函数,或全部形参为可选的函数,就 表为空;被省略,此时实参为
16、一个或如干个用逗号分开的表达式,表达式的个数应至少等于不带缺省值的形参的个数,应不大于全部形参的个数,中每个表达式称为一个实参,每个实参的类型必需与相应的形参类型相同或兼容(即能够被自动转换为形参的类型,如整型与字符型就是兼容类型);每个实参是一个表达式,包括是一个常量、一个变量、一个函数调用 表达式,或一个带运算符的一般表达式;如:1 g125 / 实参是一个整数 2 g2x / 实参是一个变量 3 g3a,2*b+3 /第一个为变量,其次个运算表达式 4 g4sinx, /第一个为函数调用表达式,其次个为字符常量 5 g5&d,*p,x/y-1 /分别为取地址运算、间接拜访和一般运算表达式
17、任一个函数调用表达式都可以单独作为一条表达式语句使用,但当该函数调用带有返回值时,这个值被自动丢失;对于具有返回值的函数,调用它的函数表达式通常是作为一个数据项使用,用返回值参加相应的运算,如把它赋值给一个变量,把它输出到屏幕上显示出来等;如:1 f1; / 作为单独的语句,如有返回值就被丢失 2 y=f3x,a; / 返回值被赋给 y 储存 3 coutf6c,10endl; / 返回值被输出到屏幕上 4 f2f5x1,d1+1; /f2 调用作为单独的语句, /f5 调用是 f2 实参表达式中的一个数据项 5 f6b,5=3*w-2; /f6 函数调用的返回值当作一个左值 6 iff8ct
18、,x cout”true ”endl ; / f6 函数调用作为一个判定条件,4 / 27 名师归纳总结 - - - - - - -第 4 页,共 27 页精选学习资料 - - - - - - - - - /如返回值不为0 就执行后面的输出语句,否就不执行任何操作(二)调用过程当调用一个函数时,整个调用过程分为三步进行,第一步是参数传递,其次步是函数体执行,第三步是返回,即返回到函数调用表达式的位置;参数传递称为实虚结合,即实参向形参传递信息,使形参具有准确地含义(即具有对应的储备空间和初值);这种传递又分为两种不怜悯形,一种是向非引用参数传递,另一种是向引用参数传递;形参表中的非引用参数包括
19、一般类型的参数、指针类型的参数和数组类型的参数三种;实际上可以把数组类型的参数归为指针类型的参数;当形参为非引用参数时,实虚结合的过程为:第一运算出实参表达式的值,接着给对应的形参变量安排一个储备空间,该空间的大小等于该形参类型的长度,然后把已求出的实参表达式的值存入到为形参变量安排的储备空间中,成为形参变量的初值;这种传递是把实参表达式的值传送给对应的形参变量,称这种传递方式为“ 按值传递” ;假定有下面的函数原型:1 void h1int x, int y; 2 bool h2char*p; 3 void h3int a, int n 4 char* h4char bN, int m如采纳
20、如下的函数调用:1 h1a,25;/ 假定 a 为 int 型2 bool bb=h2sp; / 假定 sp 为 char* 型3 h3b,10; / 假定 b 为 int* 型4 char* s=h4c,n+1; / 假定 c 为 int*N 型, n 为 int 型当执行第一条语句中的 h1a,25 调用时,把第一个实参 a 的值传送给对应形参 x 的储备空间,成为 x 的初值,把常数 25 传送给形参 y 的储备空间,成为 y 的初值;当执行其次条语句中的 h2sp 调用时,将把 sp 的值,即一个字符对象的储备地址传送给对应的指针形参 p 的储备空间中,使 p 指向的对象就是实参 sp
21、 所指向的对象,即 *p 和*sp指的是同一个对象,如在函数体中对 *p 进行了修改,就待调用终止返回后通过拜访 *sp 就得到了这个修改;当执行第三条语句中的h3b,10调用时,将把b 的值(通常为元素类型为 int的一维数组的首地址)传送给对应数组变量(实际为指针变量)a 的储备空间中,使得形参a 指向实参 b 所指向的数组空间,因此,在函数体中对数组a 的存取元素的操作就是对实参数组 b 的操作;也就是说,采纳数组传送能够在函数体中使用形参数组拜访对应的实参数组;当执行第四条语句中的 h4c,n+1 调用时,将把 c 的值(通常为与形参 b 具有相同元素类型和列数的二维数组的首地址)传送
22、给对应二维数组参数(实际为指针变量)a 的存储空间中,使得形参 b 指向实参 c 所指向的二维数组空间,在函数体中对数组 b 的存取元素的操作就是对实参数组 c 的操作;该函数调用仍要把其次个实参表达式 n+1 的值传送给形参 m中,在函数体中对 m的操作与相应的实参无关;在函数定义的形参表中说明一个数组参数时,通常仍需要说明一个整型参数,用它来接收由实参传送来的数组的长度,这样才能够使函数知道待处理元素的个数;当形参为引用参数时,对应的实参通常是一个变量,实虚结合的过程为:把实参变量的地址传送给引用形参,成为引用形参的地址,也就是说使得引用形参是实参变量的一个引用(别名),引用形参所占用的储
23、备空间就是实参变量所占用的储备空间;因此,在函5 / 27 名师归纳总结 - - - - - - -第 5 页,共 27 页精选学习资料 - - - - - - - - - 数体中对引用形参的操作实际上就是对被引用的实参变量的操作;这种向引用参数传递信 息的方式称为引用传送或按址传送;引用传送的好处是不需要为形参安排新的储备空间,从而节约储备,另外能够使对形 参的操作反映到实参上,函数被调用终止返回后,能够从实参中得到函数对它的处理结 果;有时,既为了使形参共享实参的储备空间,又不期望通过形参转变实参的值,就应当 把该形参说明为常量引用,如: void f13const int& A, con
24、st Node*& B, char C;在该函数执行时,只能读取引用形参A 和 B 的值,不能够修改它们的值;由于它们是对应实参的别名,所以,也可以说,只答应当函数使用 A 和 B 对应实参的值,不答应进行修改,从而杜绝了对实参进行的有意或无意的破坏;进行函数调用除了要把实参传递给形参外,系统仍将自动把函数调用表达式执行后的位置(称为返回地址)传递给被调用的函数,使之储存起来,当函数执行终止后,将依据所储存的返回地址返回到原先位置,连续向下执行;函数调用的其次步是执行函数体,实际上就是执行函数头后面的一条复合语句,它将依据从上向下、从左向右的次序执行函数体中的每条语句,当遇到return语句时
25、就终止返回;对于无类型函数,当执行到函数体最终的右花括号时,与执行一条不带表达式的return语句相同,也将终止返回;return语句的过程;当return语句函数调用的第三步是返回,这实际上是执行一条不带有表达式时,其执行过程为:按函数中所储存的返回地址返回到调用函数表达式的位置接着向下执行;当 return 语句带有表达式时,又分为两种情形,一种是函数类型为非引用类型,就运算出 return 表达式的值,并把它储存起来,以便返回后拜访它参加相应的运算;另一种情形是函数的类型为引用类型,就 return 中的表达式必需是一个左值,并且不能是本函数中的局部变量(关于局部变量的概念留在下一节争论
26、),执行 return 语句时就返回这个左值,也可以说函数的返回值是该左值的一个引用;因此,返回为引用的函数调用表达式既可作为右值又可作为左值使用,但非引用类型的函数表达式只能作为右值使用;例如: int& f14int a, int n int k=0; forint i=1;iak k=i; return ak; 该函数的功能是从一维整型数组an 中求出具有最大值的元素并引用返回;当调用该函数时,其函数表达式既可以作为右值,从而取出 ak 的值,又可以作为左值,从而向 ak 给予新值;如: #include int& f14int a, int n int k=0; forint i=1;
27、iak k=i; return ak; 6 / 27 名师归纳总结 - - - - - - -第 6 页,共 27 页精选学习资料 - - - - - - - - - void main int b8=25,37,18,69,54,73,62,31; coutf14b,8endl; f14b,5=86; forint i=0;i8 ;i+ coutbi coutendl; 该程序的运行结果如下,请读者自行分析; 73 25 37 18 86 54 73 62 31 通常把函数定义为引用的情形较少显现,而定义为非引用(即一般类型和指针类型)的情形就常见;(三)函数调用举例 程序 1: #incl
28、ude int xk1int n; void main coutm; int sum=xk1m+xk12*m+1 coutsumendl; int xk1int n int i,s=0; fori=1;i=n ;i+ s+=i return s; 该程序包含一个主函数和一个 xk1 函数,在程序开头给出了一条 xk1 函数的原型语 句,使得 xk1 函数无论在什么地方定义,在此程序文件中的全部函数都能够合法地调用它;留意:主函数不需要使用相应的函数原型语句加以声明,由于 数调用它,它只由操作系统调用并返回操作系统;C+规定不答应任何函函数 xk1 的功能是求出自然数 1 至 n 之和,这个和就
29、是 s 的最终值,由 return 语句把它返回;在主函数中第一为 m输入一个自然数,接着用 m去调用 xk1 函数返回 1 至 m之间的全部自然数之和,再用 2*m+1 去调用 xk1 函数返回 1 至 2*m+1 之间的全部自然数之和,把这两个和加起来赋给变量 sum,最终输出 sum的值;假定从键盘上为 m输入的正整数为 5,就进行 xk1m 调用时把 m 的值 5 传送给 n,接着执行函数体后返回 s 的值为 15,进行 xk12*m+1 调用时把 2*m+1 的值 11 传送给 n,接着执行函数体后返回 s 的值为 66,它们的和 81 被作为初值赋给 sum,最终输出的 sum值为
30、81;7 / 27 名师归纳总结 - - - - - - -第 7 页,共 27 页精选学习资料 - - - - - - - - - 程序 2: #include void xk2int& a, int b; void main int x=12,y=18;coutx=x y=yendl; xk2x,y;coutx=x y=yendl; void xk2int& a, int b couta=a b=bendl;a=a+b;b=a+b;couta=a b=bendl; 该程序包含一个主函数和一个xk2 函数, xk2 函数使用了两个形参,一个是整型引用变量a,另一个是整型变量 b;在主函数中使
31、用 xk1x,y 调用时,将使形参 a 成为实参 x 的别名,在函数体中对 a 的拜访就是对主函数中 x 的拜访,此调用同时把 y 的值传送给形参b,在函数体中对形参 b 的操作是与对应的实参 y 无关的,由于它们使用各自的储备空间;该程序的运行结果为: x=12 y=18 a=12 b=18 a=30 b=48 x=30 y=18 程序 3: #include void xk3int* a, int* b;void xk4int& a, int& b;void main int x=5,y=10;coutx=x y=yendl;xk3&x, &y;coutx=x y=yendl;xk4x,
32、y;coutx=x y=yendl; void xk3int* a, int* b int c=*a;*a=*b ;8 / 27 名师归纳总结 - - - - - - -第 8 页,共 27 页精选学习资料 - - - - - - - - - *b=c ; void xk4int& a, int& b int c=a;a=b;b=c; 该程序中的 xk3 函数用于交换 a 和 b 分别指向的两个对象的值,主函数使用 xk3&x, &y调用时,分别把 x 和 y 的地址赋给形参 a 和 b,所以实际交换的是主函数中 x 和 y 的值;xk4 函数用于直接交换 a 和 b 的值,由于 a 和 b
33、都是引用参数,所以在主函数使用 xk4x,y调用时,执行 xk4 函数实际交换的是相应实参变量 x 和 y 的值;此程序的运行结果为: x=5 y=10 x=10 y=5 x=5 y=10 上述的 xk3 和 xk4 具有完全相同的功能,但由于在xk3 中使用的是指针参数,传送给它的实参也必需是对象的地址,在函数体中拜访指针所指向的对象必需进行间接拜访运算,所以,定义和调用xk3 不如定义和调用xk4 直观和简便;程序 4: #include const int N=8;int xk5int a, int n;void main int bN=1,7,2,6,4,5,3,-2;int m1=x
34、k5b,8;int m2=xk5&b2,5;int m3=xk5b+3,3;coutm1 m2 m3endl; int xk5int a, int n int i,f=1; /或写成 f*=*a+ ;fori=0;in ;i+ f*=aireturn f; 该函数包含一个主函数和一个 xk5 函数, xk5 函数的功能是求出一维整型数组 an 中全部元素之积并返回;在主函数中第一次调用 xk5 函数时,把数组 b 的首地址传送给 a,把数组 b 的长度 8 传送给 n,执行函数体对数组 a 的操作实际上就是对主函数中数组 b 的操作,由于它们同时指向数组 b 的储备空间;其次次调用 xk5 函
35、数是把数组 b 中 b2 元素的地址传送给 a,把整数 5 传送给 n,执行函数体对数组 an 的操作实际上是对数组 b 中 b2至 b6 之间元素的操作;第三次调用 xk5 函数是把数组 b 中 b3 元素的地址传送给 a,把9 / 27 名师归纳总结 - - - - - - -第 9 页,共 27 页精选学习资料 - - - - - - - - - 整数 3 传送给 n,执行函数体对数组an 的操作实际上是对数组b 中 b3 至 b5 之间元素的操作;该程序的运行结果为: -10080 720 120 程序 5: #include char* xk6char* sp, char* dp;v
36、oid main char a15=abcadecaxybcw;char b15;char* c1=xk6a,b;coutc1 a bendlchar* c2=xk6a+4,b;coutc1 a bendl char* xk6char* sp, char* dp if*sp=0 *dp=0; return dp; int i=0,j;forchar* p=sp; *p ; p+ / 扫描 sp 所指字符串中的每个字符位置 forj=0;j=i dpi+=*p;*p,就把 *p 写入 dpi元素中/ 如 dp 数组的前 i 个元素均不等于 dpi=0; /写入字符串终止符return dp; x
37、k6 函数的功能是把 sp 所指向的字符串,去掉重复字符后拷贝到 dp 所指向的字符数 组中,并返回 dp 指针;在主函数中第一次调用 xk6 函数时,分别以 a 和 b 作为实参,其次 次调用时分别以 a+4(即 a4 的地址)和 b 作为实参;该程序运行后的输出结果为: abcdexyw abcadecaxybcw abcdexyw decaxybw abcadecaxybcw decaxybw 程序 6: #include int* xk7int*& a1, int* a2;int* xk7int*& a1, int* a2 coutwhen enter xk7: *a1,*a2=*a1
38、, *a2endl;a1=new int2*a1+4;a2=new int2*a2-1;10 / 27 名师归纳总结 - - - - - - -第 10 页,共 27 页精选学习资料 - - - - - - - - - coutwhen leave xk7: *a1,*a2=*a1, *a2endl;return a2; void main int x=10, y=25;int *xp=&x, *yp=&y;coutbefore call xk7: *xp,*yp=*xp, *ypendl;int* ip=xk7xp,yp;coutafter call xk7: *xp,*yp=*xp, *y
39、pendl;cout*ip=*ipendl;delete xp; /xp 指向的是在执行 xk7 函数时动态安排的对象 *a1 delete ip; /ip 指向的是在执行 xk7 函数时动态安排的对象 *a2 在 xk7 函数的定义中,把形参 a1 定义为整型指针的引用,把 a2 定义为整型指针,当在主函数中利用 xk7xp,yp 表达式调用该函数时,a1 就成为 xp 的别名,拜访 a1 就等于拜访主函数中的 xp,而 a2 同 yp 具有各自独立的储备空间,a2 的初值为 yp 的值,在 xk7 函数中对 a2 的拜访 指直接拜访 与 yp 无关;此程序运行结果为:before call xk7: *xp,*yp=10, 25 when enter xk7: *a1,*a2=10, 25 when leave xk7: *a1,*a2=24, 49 after call xk7: *xp,*yp=24, 25 *ip=49 三、变量的作用域在一个 C+程序中,对于每个变量必需遵循先定义后