4.参数传递
4.1形式参数与实际参数
形式参数简称形参,是在过程或函数首部形参表中的变量名,用于接收数据的变量。
实际参数简称实参,是在调用过程或函数时传递给过程或函数的常量、变量或表达式。
在使用中,实参和形参的变量名不一定相同,但调用的顺序必须一致,在各个参数之间用逗号分隔。
4.2参数的传递
Delphi中,参数的传递方式有两种:
-
按值传递
-
按地址传递
在形参表中,使用Var或者Out的形参表示按地址传递;使用Const或没有任何保留字说明的形参将使用按值传递的方式。
按地址传递的参数,实参和形参的类型必须一致,按值传递的参数,实参和形参之间只需要赋值相容即可。
4.3默认参数
在声明函数或过程时,可以给形参指定一个默认的值,在调用时,如果没有给形参传递实参,则系统自动使用默认值,如果传递了实参,则使用实参的值。
默认参数的声明方法是在形参的类型后面使用等号并指明具体的常量值,如:
procedure Add(x, y: Integer; z: Integer=10); begin ... end;
在形参声明中,如果后面的参数没有使用默认值,不允许对前面的参数使用默认值,如下面的代码就是错误的
procedure Add(z: Integer=10; x, y: Integer); begin ... end;
4.4赋值相容
在Object Pascal中,赋值相容是指变量可以进行赋值或进行参数传递。
对于形参T1和实参T2,要求满足下面的条件:
-
T1和T2类型相同,且都不是文件类型或包含文件类型的自定义类型
-
T1和T2是兼容的有序类型,类型T2的值在T1的取值范围内
-
T1和T2都是实数类型,类型T2的值在T1的取值范围内,或者T2是整型
-
T1和T2都是字符串类型,或者T2是字符类型或者紧凑的字符串类型
-
T1是Variant类型,T2是Integer、Real、String或boolean类型
4.5调用约定
在Object Pascal中,提供了5种函数或过程的调用方式:
-
Register - 默认的调用方式
-
Pascal
-
Cdecl
-
StdCall
-
SafeCall
Register和Pascal调用方式传递参数是从左到右,而Cdecl、StdCall、SafeCall调用方式传递参数是从右到左
Register调用方式会自动清除调用所使用的堆栈、寄存器,负责处理调用错误,同时也是最快的调用方式。
示例:指定过程的调用方式为Pascal
procedure Add(x, y: Integer; z: Integer=10); pascal;