而另一方面,变量参数就像一个指针而不是一个拷贝,当程序返回调用者时,在函数或过程体中对它的改变将被保留,(仅仅)参数名本身超出了作用域。
即使同一个变量被传给两个或多个参数,也不会创建它的拷贝,这通过下面的例子说明。
procedure AddOne(var X, Y: Integer);
begin
X := X + 1;
Y := Y + 1;
end;
var I: Integer;
begin
I := 1;
AddOne(I, I);
end;
这些代码执行后,I的值是3。
如果例程声明了一个var参数,你必须给它传递一个能被赋值的表达式,也就是一个变量、类型化常量(typed constant,在{$J+}状态下)、dereferenced指针、字段或者索引变量(
例子中,DoubleByRef(7)会产生错误,而DoubleByValue(7)是合法的。
索引以及指针引用被当作var参数时,在例程执行之前它们会被计算(一次)
Constant parameters(常量参数)
一个常量参数(const)就像一个局部常量或者一个只读变量,常量参数和数值参数类似,但在过程或函数中你不能给常量参数赋值,也不能把它当作变量参数传给另一个例程。
- 88 - indexed variable)。在前面的。 当把一个对象引用当作 (但是,
Procedures and functions
常量参数时,你仍然可以修改对象的属性。)
使用const允许编译器对结构类型和字符串类型的参数做代码优化,也防止不小心把一个参数通过引用传给另一个例程。
这里的例子是SysUtils单元中的CompareStr函数:
function CompareStr(const S1, S2: string): Integer;
因为S1和S2在CompareStr中没有被修改,它们可以被声明为常量参数。
Out parameters(Out参数)
Out参数和变量参数类似,通过引用传递。但是,当使用out参数时,传给例程的引用参数的初始值被忽略。out参数只是为了输出,也就是说,它告诉函数或过程在哪里存储输出,但不提供任何输入。 比如,考虑过程头声明
procedure GetInfo(out Info: SomeRecordType);
当你调用GetInfo时,你必须给它传递一个SomeRecordType类型的变量:
var MyRecord: SomeRecordType;
...
GetInfo(MyRecord);
但你不使用MyRecord给GetInfo传递任何值,MyRecord只是一个容器,你希望GetInfo用它存储得到的信息。The call to GetInfo immediately frees(释放还是清零?) the memory used by MyRecord, before program control passes to the procedure.
out参数经常用在分布式对象模型中,比如COM和CORBA。而且,当向函数或过程传递未初始化的变量时,你应当使用out参数。
Untyed parameters(无类型参数)
当声明var、const和out参数时,你可以省略类型说明(数值参数必须指定类型)。比如,
procedure TakeAnything(const C);
声明一个叫做TakeAnything的过程,它可以接受任何类型的参数。当你调用这样一个例程时,你不能向它传递numeral or untyped numeric constant。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-23665-63.html
必将来犯之敌全部葬送于南海海域
那么你就得听