这对浮点类型有些影响。浮点类型通过大小进行匹配,如果在调用时,参数类型和传递的浮点类型不完全匹配、但有一个Variant类型的参数,则采用Variant类型,而不是其它较小的浮点类型(the Variant is taken over any smaller float type)。
比如
procedure foo(i: integer); overload;
procedure foo(d: double); overload;
procedure foo(v: Variant); overload;
var
v: Variant;
begin
foo(1);// integer版本
foo(v);// Variant版本
foo(1.2);// Variant版本(float literals -> extended精度)
end;
这个例子调用foo的Variant版本,而不是double版本,因为常数1.2隐含是extended类型,它和double类型不完全匹配。Extended和Variant类型也不是完全匹配,但Variant类型更通用(尽管double类型比extended类型更小)。
foo(Double(1.2));
- 85 -
Procedures and functions
这个类型转换不起作用,你应该使用指定类型的常数。
const d: double = 1.2;
begin
foo(d);
end;
上面的代码工作正常,将调用double版本。
const s: single = 1.2;
begin
foo(s);
end;
上面的代码也是调用double版本,相对于Variant,single和double更匹配,
当声明一组重载例程时,避免浮点类型解释为Variant类型的最好办法,是在声明Variant版本的同时,为每一种浮点类型(Single、Double、Extended)声明一个版本。
若在重载例程中使用默认参数,要当心不明确的参数调用。关于更多这方面的信息,请参考Default parameters and overloaded routines。
通过在调用例程时限定它的名称,能减少重载例程潜在的影响。比如,Unit1.MyProcedure(X, Y)只能调用在Unit1单元声明的例程,若Unit1中没有和指定的名称以及参数相匹配的例程,错误将发生。
关于在类的继承层次中发布重载方法,请参考Overloading methods;关于在共享库中输出重载例程,请参考The exports clause。
Local declarations(局部声明)
函数体或过程体经常以声明局部变量开始,它们用在例程的语句块中。这里也可以包括常量、类型以及例程声明。局部标志符的作用域被限制在声明它的例程中。
嵌套例程
有时,函数和过程在它的局部声明块中包含其它函数和过程。比如,下面声明了一个叫做DoSomething的过程,它包含一个嵌套过程。
procedure DoSomething(S: string);
var
X, Y: Integer;
procedure NestedProc(S: string);
begin
...
end;
begin
...
NestedProc(S);
...
end;
嵌套例程的作用域限制在声明它的过程或函数中,在我们的例子中,NestedProc只能在DoSomething内部调用。
关于嵌套例程的实际应用,请参考SysUtils单元的DateTimeToString过程、ScanDate函数以及其它例程。 - 86 -
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-23665-61.html
就是容许这些女青年带着自己父母