




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 第4章过程与函数 本章着重讲解Delphi过程和函数的声明与实 现,介绍参数类型与传递方式。最后讨论过 程和函数的使用。 4.1过程与函数的编写 4.2参数 4.3过程与函数的使用 4.4 本章小结 第4章过程与函数 n 过程和函数统称为例程(routines),它们包括程序 头、声明和一段可以被程序中不同位置调用的语句块。 它们明显的区别在于:函数(function)是执行时返 回值的例程,过程(procedure)是不返回值的例程。 n 使用过程和函数可以降低程序的复杂性。通过使用恰 当命名的过程和函数,使编写代码的工作可以划分成 有限的部分,并避免重复编写雷同的代码。 n 过程和函数的
2、设计以功能单一,代码短小为佳。对于 它们的“理想”长度并没有一个公认的标准,但是, 从软件开发的经验出发,都倾向于“短短益善”。 4.1 过程与函数的编写 o 4.1.1过程 o 4.1.2函数 o 4.1.3指示字* o 4.1.4程序型类型* 4.1 过程与函数的编写 编写过程或函数时,首先需要为其指定名称、接受 参数的个数及类型。对于函数,还要指定返回值的 类型,这部分声明有时叫做原型(prototype)、 标题(heading)或头(header)。然后才可以 编写局域声明块,用于声明过程或函数中需要使用 的局域变量,最后开始编写代码块,用于过程或函 数随时被调用时的执行,这部分称为
3、例程的主体 (body),即程序体。 4.1.1过程 n 编写过程是为了将一个程序分成更小的、更易于 控制的语句块。过程的声明是由过程头和附属部 分组成的,其中过程头的语法是: Procedure 标识符标识符(参数列表参数列表) n 附属部分的语法如下: 调用约定调用约定;指示字指示字 n procedure是保留字,过程标识符可以是任何合 法的标识符,以后就是通过这个标识符调用该过 程。一个过程可以有参数,如果有多个参数,参 数之间用分号隔开;也可以没有参数,对于后者, 过程标识符后直接跟分号。声明过程的示例如下: Procedure ThreeParamsProc (Param1,Par
4、am2:Integer;param3:Real); 4.1.1过程 声明了一个过程后,就应当在程序单元的 Implementation部分实现这个过程,实现 过程的语法是这样的: Procedure 过程标识符过程标识符(形参形参); Begin 过程的执行体过程的执行体 End; 4.1.1过程 正如前所述,过程还可以有自己的局域变量,它紧接在过程名 后面声明,这样的程序示例如下: Procedure ThreeParamsProc(param1,param2:integer;param3: real); Var i,j,K:integer; /声明三个局域变量 Begin i := Par
5、am1; j := Param2; k := j; Param3 := k; End; 4.1.2函数 声明函数的语法跟过程的声明有相似之处,不同的 是函数头,声明函数的语法为: Function 函数标识符(参数列表)函数标识符(参数列表):返回值返回值; 示例如下: Function MyFunc(Param1,param2:Integer;param3:R eal) :Integer; 上述例子中声明了一个函数,函数名是MyFunc,有三个参 数,前两个是整数类型,第三个是实数类型,返回类型是整 数类型。 4.1.2函数 实现函数的语法是这样的: function ThreeParams
6、Proc (param1, param2 : Integer; param3 : Real) : integer; Begin 函数执行体函数执行体 End; 4.1.2函数 和过程一样,函数可以有参数,可以没有参 数。要注意的是:函数必须指定返回类型。 Delphi的函数可以返回任何数据类型(除了 文件类型)。另外,还要注意,在过程的定 义中,过程的执行体可以是空的,但函数的 执行体至少要有一个语句,那就是必须返回 一个数值。如果程序代码中没有给出函数的 返回值,那么,在程序编译时,Delphi将给 出一个警告信息。 4.1.2函数 n函数的返回值函数的返回值 函数可以包含任何可执行代码,可
7、以完全像过程一样。但是在Delphi 中函数的返回值必须在函数返回前被计算并赋给函数。Delphi语言的 函数返回方法跟其他语言中函数通过Return语句实现返回值不同, 在Delphi中返回值是通过对函数标识符赋值的方式实现的。利用赋值 语句将返回值赋给左边的函数名,编译程序就默认这是结果值。程序 示例如下: Function PlusTwo(Number:Integer) : Integer; Begin ./ 其它可执行代码 PlusTwo := Number * 2; End; 上面的程序将传入的参数Number乘以2,并将相乘后的结果作为返 回结果。 4.1.2函数 nResult变
8、量 Delphi自动在函数内部隐含了一个局域变量,这就是 Result变量。我们不必显式地声明Result,它被默认为 与函数结果有相同的类型,对Result的赋值相当于对函 数名赋值,也就是说相当于返回一个数值。还是上面的范 例,程序代码可以调整为如下样子: Function PlusTwo(Number:Integer) : Integer; Begin ./ 其它可执行代码 Result := Number * 2; End; 4.1.2函数 Result是个真正的变量,可以在函数中被引用在赋值语 句的任一边。如果Result仅仅是为了返回一个数值,那 它也没有什么意义,Result变量
9、的关键在于它能出现在 赋值语句的右边,而如果函数名出现在赋值语句的右边, 则意味着递归调用,另外对Result变量赋值不一定就是 从函数返回,这跟对函数名赋值也不同,程序示例如下: Function Square(x:integer) : integer; Begin Result := x; Result := Result *x; end; Exit可以出现在任何过程和函数的块中。Exit过程在其 出现的位置停止例程的执行,并立即将程序控制交回例 程被调用的执行点处。 4.1.3指示字* Delphi对于函数的声明和调用提供了更多的支持。 在使用时,Delphi提供了几个特殊的指示字,以区
10、 分默认的声明和调用方式。 1. 调用约定指示字 声明过程或函数时,可以指定调用约定(calling convention)。指定调用约定可以使用的指示字包括 register、pascal、cdecl、stdcall以及safecall。 2. External指示字 External 这个指示字允许从程序中调用分别编译的例程, 表明过程或函数是外部的。外部例程可以来自对象文件 (object files,即.obj文件)或动态可加载库 (dynamically loadable libraries,即.dll文件)。 4.1.3指示字* 3.Forward指示字指示字 n当使用一个标识符(
11、任何类型)时,编译器必 须已经知道该标识符指的是什么。为此,通常 需要在例程使用之前提供一个完整的声明。 n一般情况下,当调用一个过程或函数时,被调 用的过程或函数必须是在Type区已声明的。然 而在某些情况下可能做不到这一点,此时使用 Forward指示字可以让编译器查找过程或函数 的定义。要预先声明一个过程或函数,而且只 给出它的名字和参数,不列出其实现代码,需 要在句尾加forward关键字。 4.1.4 程序型类型* Delphi的另一个独特功能是可定义程序型类 型(procedual type)。程序型类型属于 语言的高级功能,它允许将过程和函数的引 用赋值给变量或传递给其他过程和函
12、数。程 序型类型不是很常用。 4.2 参数 参数是过程、函数间传递和交换数据的基础。大多 数过程和函数头都包括一个参数列表(parameter list)。参数列表是一个参数声明序列,声明之间 以分号隔开,参数列表由圆括号封装。每个声明是 一个参数名序列,参数名之间以逗号隔开,大多数 情况下跟随一个冒号(:)和一个类型标识符,某 些情况下还跟随一个等号(=)和一个缺省值。参 数名必需是有效标识符。 4.2.1 参数类型 1. 值参数 大多数参数是值参数(缺省参数)或变量参数 (var参数),其中值参数最常用。值参数是一 种传递数值副本的参数,当调用过程或函数时, 程序为实参的值复制一个副本,由
13、值参数来传 递。 4.2.1 参数类型 2. 变量参数 变量参数相当于一个指针,该参数在传递时传 递的不是实参的值的副本,而是指向实参值的 一个引用。这样当参数在过程或函数中被改变 时,实参的值也相应改变,在过程或函数中对 形参的引用实际上就是对实参自身的引用。 4.2.1 参数类型 3. 常量参数 常量参数与其他参数的区别在于,常量参数是 只读的,也就是说不允许在过程或函数中改变 常量参数的值,对常量参数赋值是非法的,并 且不允许把常量参数再作为实参传递给另一个 过程或函数。 4.2.1 参数类型 4. out参数 一个out参数就象一个变量参数,它传递的也是 引用。然而,对于out参数,引
14、用变量的初始值 被其传递到的例程丢弃。out参数仅用于输出, 也就是说,它告诉函数或过程在哪里存储输出, 而不提供任何输入。 4.2.2 无类型参数* 所谓无类型参数,就是在过程或函数声明和定义时 不指定参数的数据类型,程序代码示例如下: Procedure MyProc (Var Value); 上例中,Value参数没有指定数据类型,但前面必 须加var、const或out,加var、out表示参数的值 是可以改变的,加const表示参数是只读的。如果 没有使用这些参数类型,则表示为值参数,而值参 数必须指定类型。 4.2.3 缺省参数 Delphi允许在过程或函数头指定参数的缺省值。这
15、样调用时该参数可以加上,也可以省略。缺省值仅 允许用于有类型的值参数和常量参数。要提供缺省 值,需要在参数声明的末尾使用等号“=”,并跟 随一个与参数类型赋值兼容的常量表达式。 4.2.3 缺省参数 缺省参数使用主要规则是:调用时只能从最后一个 参数开始进行省略。也就是说,如果要省略一个参 数,就必须省略它后面所有的参数。 缺省参数的使用规则还包括: n带缺省值的参数必须放在参数表的最后面。 n缺省值必须是常量。显然,这限制了缺省参数的数据类 型,例如动态数组的缺省参数值只能是nil;至于记录类 型,则根本不能用作缺省参数。 n缺省参数必须通过值参数或常量参数传递。引用参数 var不能有缺省值
16、 4.3 过程与函数的使用 前面我们详细介绍了过程、函数以及它们的参数, 接下来,重点介绍如何使用过程和函数,分两个方 面讲解:一是过程和函数的调用,另一个是过程和 函数的重载 4.3.1 调用过程和函数 调用过程或函数时,程序控制将由调用点传递给例程 体。可以通过使用例程声明的名称或者通过使用指向 例程的程序型变量来实现调用。 4.3.1 调用过程和函数 调用过程或函数时应切记: n用于传递有类型的常量参数和值参数的表达式,必需与 相应的形式参数是赋值兼容的。 n用于传递变量参数和out参数的表达式,其类型必需与相 应形式参数的类型等同,除非形式参数是无类型的。 n只有可赋值的表达式可以被用
17、于传递变量参数和out参数。 n如果过程或函数的形式参数是无类型的,那么数字和含 数值的真实常量都不能作为实际参数传递。 n调用使用了缺省参数值的过程或函数时,跟随在第一个 接受缺省值之后的所有实际参数,都必需使用缺省值; 形如MyFunc( , ,tempVar)的调用是不合法的。 4.3.2 过程与函数的重载 可以在相同的作用域(即为可访问范围,后面章节 有详细介绍)中以相同的名称声明多个(一个以上) 例程,称为重载(overloading)。重载的例程必 需以指示字overload声明,并且参数列表必需有 所区别。重载的思想其实很简单:编译器允许使用 同一名称定义多个参数不同的函数或过程
18、,而实际 上,编译器是通过检测参数来确定需要调用的例程 (它们是不同的例程)。 4.4 本章小结 o 过程和函数统称为例程,它们包括程序头、声明和 一段可以被程序中不同位置调用的语句块。它们明 显的区别在于:函数是执行时返回值的例程,过程 是不返回值的例程。 o 使用过程和函数可以降低程序的复杂性,提高代码 的重用性。过程和函数的设计以功能单一,代码短 小为佳。 o Delphi中函数返回值是通过对函数标识符或 Result变量赋值的方式实现的。 4.4 本章小结 o Delphi提供了几个特殊的指示字,以区分默认的声 明和调用方式。常用的指示字包括各种调用约定指 示字、调用外部例程的Exte
19、rnal指示字、用于预先 声明的Forward指示字等。 o 所谓过程或函数的引用本质上是一个程序指针,它 指向该过程或函数的地址。 o 当例程声明和定义时,参数称为形参,它指定了参 数的类型和顺序。当例程被调用时,参数列表指定 了必需传递给例程的参数的个数、顺序以及类型, 此时称为实参。 4.4 本章小结 o 在过程或函数主体中,参数名可以被作为局域变量 使用。在过程或函数体的局域声明中无需对参数名 进行再声明。 o 根据参数的使用方式,参数可分为:值参数、变量 参数、常量参数、out参数。 o 程序中大多数参数是值参数或变量参数。值参数是 一种传递数值副本的参数,当调用过程或函数时, 程序为实参的值复
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 股东合作协议及条款详解
- 2025年长沙货车从业资格证模拟考试
- 3D打印技术与设备应用指南
- 2025年深圳道路运输从业资格证考哪些项目
- 个人挖机机械租赁合同5篇
- 安全性评价技术服务合同
- 2025年宁夏道路货运驾驶员从业资格证考试题库完整
- 建筑工程木工合同
- 办公信息化解决方案报告
- 交通意外事故赔偿协议书
- 《创意设计》课程标准
- 三年级语文 溪居即事市赛一等奖
- 2024年山东化工职业学院高职单招(英语/数学/语文)笔试历年参考题库含答案解析
- 2024年中小学生守则修订版
- 博览会展位装修及布展投标方案技术标
- 顾客提问的问题100条
- 肝脓肿教学查房课件
- 跳绳之双脚跳教案
- 拇外翻护理课件
- 六年级英语教学随笔5篇
- 读书分享交流会《从一到无穷大》课件
评论
0/150
提交评论