Delphi第5章过程和函数_第1页
Delphi第5章过程和函数_第2页
Delphi第5章过程和函数_第3页
Delphi第5章过程和函数_第4页
Delphi第5章过程和函数_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第五章第五章 过程与函数过程与函数 DelphiDelphi中,有许多预先定义好的子程序,它们统称为中,有许多预先定义好的子程序,它们统称为运行库。运行库。Object PascalObject Pascal也允许程序员自己定义子程也允许程序员自己定义子程序。子程序的引入,降低了程序的复杂性。编写子序。子程序的引入,降低了程序的复杂性。编写子程序还可以提高代码的重用率。子程序实现的功能程序还可以提高代码的重用率。子程序实现的功能相对独立。如此,将大大提高程序编写和维护的效相对独立。如此,将大大提高程序编写和维护的效率。率。Object PascalObject Pascal的子程序分为两种:过

2、程(的子程序分为两种:过程(procedureprocedure)和函数(和函数(functionfunction)。)。过程和函数的区别主要在于过程本身没有返回值,而过程和函数的区别主要在于过程本身没有返回值,而函数有一个返回值。另外,在定义过程时使用保留函数有一个返回值。另外,在定义过程时使用保留字字procedureprocedure,而定义函数使用保留字,而定义函数使用保留字functionfunction。一、过程和函数的声明一、过程和函数的声明1. 1. 过程声明过程声明procedure procedure 过程名过程名( (参数表参数表);); beginbegin end;e

3、nd;过程名过程名即过程标识符。即过程标识符。局部声明部分局部声明部分用于声明仅限于该过用于声明仅限于该过程内引用的常量、自定义数据类型、变量、过程和函程内引用的常量、自定义数据类型、变量、过程和函数等。数等。参数表参数表内声明参数的个数和类型,同类型参数内声明参数的个数和类型,同类型参数之间以之间以逗号逗号分隔,不同类型参数之间以分隔,不同类型参数之间以分号分号分隔。分隔。2. 2. 函数声明函数声明function function 函数名函数名( (参数表参数表):):返回数据类型返回数据类型; ; beginbegin end;end;函数首部函数首部除了声明函数的标识符、形式参数表以

4、外,除了声明函数的标识符、形式参数表以外,必需在冒号之后声明函数必需在冒号之后声明函数返回数据类型返回数据类型。局部声明局部声明部分与过程的局部声明部分类似。部分与过程的局部声明部分类似。函数名函数名本身作为一个特殊的变量,与系统预先定义的本身作为一个特殊的变量,与系统预先定义的变量变量ResultResult一样,可在函数体中接受赋值,一样,可在函数体中接受赋值,用来存用来存储函数返回值储函数返回值。过程和函数首部中声明的参数称为过程和函数首部中声明的参数称为形式参数形式参数,简称形参。,简称形参。形式参数,以及过程和函数局部声明的各种标识符形式参数,以及过程和函数局部声明的各种标识符(如常

5、量、数据类型、变量、过程、函数等)均为(如常量、数据类型、变量、过程、函数等)均为局局部部的,即它们的的,即它们的作用范围只在该过程或函数中作用范围只在该过程或函数中,在局,在局部范围内有效。部范围内有效。全局标识符全局标识符是在主程序中定义的,其是在主程序中定义的,其作用范围在主程序和子程序。由于任一被调用的子程作用范围在主程序和子程序。由于任一被调用的子程序中可以随意地访问全局变量,全局变量的数据缺乏序中可以随意地访问全局变量,全局变量的数据缺乏可靠和安全,因此,应尽量避免在子程序中直接访问可靠和安全,因此,应尽量避免在子程序中直接访问全局变量,而是通过参数来传递外部数据,进行间接全局变量

6、,而是通过参数来传递外部数据,进行间接访问。访问。二、过程和函数调用二、过程和函数调用 如同标准过程和函数的调用一样,程序中如同标准过程和函数的调用一样,程序中可以调用自定义的过程和函数。过程调用的形可以调用自定义的过程和函数。过程调用的形式是以其作为一条单独的语句。式是以其作为一条单独的语句。 函数也可以单独作为一条语句来调用,而函数也可以单独作为一条语句来调用,而更一般的是把函数作为表达式,或表达式的一更一般的是把函数作为表达式,或表达式的一部分的形式进行调用的,部分的形式进行调用的, 函数作为一条单独的语句是合法的,但多数函数作为一条单独的语句是合法的,但多数情况下,调用函数主要是为了获

7、得其返回值,情况下,调用函数主要是为了获得其返回值,因此函数作为一条单独语句调用通常实际意义因此函数作为一条单独语句调用通常实际意义不大。不大。三、参数传递三、参数传递过程或函数调用时,调用语句中传递给过程或函数的参数过程或函数调用时,调用语句中传递给过程或函数的参数称为称为实际参数实际参数,简称实参。实参的个数、数据类型和,简称实参。实参的个数、数据类型和顺序必须与形式参数一一对应,多个参数之间用逗号顺序必须与形式参数一一对应,多个参数之间用逗号隔开。隔开。 形式参数形式参数出现在过程和函数声明的首部,形式参数分出现在过程和函数声明的首部,形式参数分为三类:为三类:值参数值参数(简称值参)、

8、(简称值参)、变量参数变量参数(简称变参)(简称变参)和和常量参数常量参数。三者在声明时的修饰和实参的区别分述。三者在声明时的修饰和实参的区别分述如下:如下: 值参数值参数声明时,形参的前面无任何修饰,值参传递的声明时,形参的前面无任何修饰,值参传递的是一个值。调用时,实参的值拷贝给形参,是一个值。调用时,实参的值拷贝给形参,形参值的形参值的改变不影响其对应实参的值改变不影响其对应实参的值。 变量参数变量参数声明时,形参的前面用保留字声明时,形参的前面用保留字varvar修饰。变修饰。变参传递的是一个变量的地址,即实参把地址传递给参传递的是一个变量的地址,即实参把地址传递给变变参,这样变参和参

9、,这样变参和实参指向的是同一地址空间,因此,实参指向的是同一地址空间,因此,在在过程和函数中对变参的修改,直接影响实参过程和函数中对变参的修改,直接影响实参。显然。显然可以利用变参为被调子程序(函数或过程)可以利用变参为被调子程序(函数或过程)“传递传递”数据给主调程序。数据给主调程序。 常量参数常量参数声明时,形参的前面用保留字声明时,形参的前面用保留字constconst修饰。修饰。常量参数的传递形式本质上类似于值参,但在子程序常量参数的传递形式本质上类似于值参,但在子程序中,它相当于局部的类型常量,中,它相当于局部的类型常量,不能对常量参数进行不能对常量参数进行赋值赋值。常量参数的使用可

10、以防止子程序对实参的修改。常量参数的使用可以防止子程序对实参的修改。在函数或过程定义中,可以给值参数设置一个在函数或过程定义中,可以给值参数设置一个默认值默认值。在调用子程序(过程或函数)时,如果没有提供相应在调用子程序(过程或函数)时,如果没有提供相应的实参,那么子程序即以默认值作为初值。的实参,那么子程序即以默认值作为初值。注意注意:参:参数的默认值只能从参数表的数的默认值只能从参数表的右边开始默认右边开始默认,且中间不且中间不能跳跃能跳跃,此外,变,此外,变参不参不能设置默认值。能设置默认值。例如:例如:procedure FillArray(a:array of Integer;pro

11、cedure FillArray(a:array of Integer; value:Integer=0); value:Integer=0); 值参值参valuevalue是默认参数,缺省值为是默认参数,缺省值为0 0,可以有如下两种调,可以有如下两种调用方式:用方式:FillArray(MyArray); / FillArray(MyArray); / 参数参数valuevalue使用缺省值使用缺省值0 0FillArray(MyArray,10); / FillArray(MyArray,10); / 参数参数valuevalue指值指值1010四、过程和函数重载四、过程和函数重载过程和

12、函数重载是指定义多个名称相同,而参数列表不过程和函数重载是指定义多个名称相同,而参数列表不同的过程和函数。编译器依据调用时实参表中同的过程和函数。编译器依据调用时实参表中参数个参数个数和类型数和类型,自动匹配一个重载的过程或函数。重载过,自动匹配一个重载的过程或函数。重载过程和函数首部句尾应使用保留字程和函数首部句尾应使用保留字overloadoverload修饰。修饰。例如:例如:function add(a,b:integer):integer; overload;function add(a,b:integer):integer; overload;beginbegin result :

13、= a + b; result := a + b;end;end;function add(a,b:real):real; overload;function add(a,b:real):real; overload;beginbegin result := a + b; result := a + b;end;end;function add(a,b:string):string; overload;function add(a,b:string):string; overload;beginbegin result := a + b; result := a + b;end;end;重载过

14、程或函数使用默认参数可能会导致二义性错误。重载过程或函数使用默认参数可能会导致二义性错误。如:如:function f1(a:integer; b:integer=10); overload; function f1(a:integer; b:integer=10); overload; beginbegin result := a + b; result := a + b;end;end;function f1(a:integer):overload; function f1(a:integer):overload; beginbegin result := a result := a* *a;a;end;end;五、过程和函数的递归调用五、过程和函数的递归调用 递归调用递归调用是指是指子程序子程序(函数或过程)(函数或过程)调用子程序自身调用子程序自身。递归在解决某些问题时是十分有用的方法,它可以使递归在解决某些问题时是十分有用的方法

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论