(delphi11最新学习资料) Object Pascal 学习笔记---第4章第2.2节(引用参数)

4.2.2 引用参数

​ 在Object Pascal中,过程和函数允许按值和按引用传递参数。按值传递参数是默认的:值被复制到堆栈上,例程使用和操作该数据的副本,而不是原始值(如我之前在“函数参数和返回值”一节中所述)。通过引用传递参数意味着其值未复制到例程的形式参数堆栈中。相反,程序直接引用例程代码中的原始值。这使得过程或函数能够更改作为参数传递的变量的实际值。通过引用传递参数需要使用var关键字。

​ 大多数编程语言中也有这种技术,因为避免复制往往意味着程序执行得更快。C 语言中没有这种方法(在 C 语言中可以直接使用指针),但 C++ 和其他基于 C 语言语法的语言中引入了这种方法,即使用 &(引用传递)符号。下面是一个使用 var 关键字通过引用传递参数的示例:

procedure DoubleIt(var Value: Integer);
begin
  Value := Value * 2;
end;

​ 在这种情况下,参数既用于向存储过程传递一个值,也用于向调用代码返回一个新值。当你编写:

var
  X: Integer;
begin
  X := 10;
  DoubleIt(X);
  Show(X.ToString);

​ 变量X的值变为20,因为该函数使用对X的原始内存位置的引用,从而影响其原始值。

​ 与一般的参数传递规则相比,向引用参数传递值要遵守更严格的规则,因为你传递的不是值,而是一个实际的变量。不能将常量值作为引用参数、表达式、函数结果或属性传递。另一条规则是不能传递类型略有不同的变量(需要自动转换)。变量和参数的类型必须完全匹配,否则编译器会给出错误信息:

[dcc32 Error] E2033 Types of actual and formal var parameters must be identical

​ 这是如果您写下面的代码(也是ParamsTest示例的一部分,但被注释掉)会收到的错误消息:

var
  C: Cardinal;
begin
  C := 10;
  DoubleIt(C);

​ 通过引用传递参数对于序数类型和记录(我们将在下一章中看到)是有意义的。这些类型通常被称为值类型,因为它们默认具有按值传递和按值赋值语义。

Object Pascal 对象和字符串的行为略有不同,我们将在后面详细讨论。对象变量是引用,因此可以修改作为参数传递的对象的实际数据。这些类型属于不同的组,通常称为引用类型。

除了标准和引用(var)参数类型,Object Pascal 还有一种非常特别的参数说明符,out。out 参数没有初始值,只能用于返回值。除了没有初始值外,out 参数的行为与 var 参数类似。

注解:out 参数的引入是为了支持 Windows 组件对象模型(或 COM)中的相应概念。它们可以用来表达开发人员期望未初始化值的意图。

你可能感兴趣的:(Object,Pascal,Handbook,学习,笔记,delphi,delphi11,Object,Pascal)