(delphi11最新学习资料) Object Pascal 学习笔记---第5章第2节(记录数据类型)

5.2 记录数据类型

​ 数组定义了由数字索引引用的相同条目的列表,而记录定义了通过名字引用的不同类型元素的组合。换句话说,记录是一个具有特定数据类型的命名项目或字段的列表。记录类型的定义列出了所有这些字段,为每个字段赋予一个用于可引用的名称。在Pascal的早期阶段,记录只能有字段,现在记录还可以有方法和运算符,我们将在本章中看到。

注解: 记录在大多数编程语言中都可用。它们在C语言中使用struct关键字定义,在C++中进一步扩展了其定义,引入了方法,类似于Object Pascal。一些更"纯粹"的面向对象语言只有类的概念,没有记录或结构,但C#最近重新引入了这个概念。

​ 以下是一个小的代码片段(来自RecordsDemo示例),其中包含记录类型的定义,该类型的变量声明以及使用此变量的一些语句:

pascal 复制代码
type
  TMyDate = record
    Year: Integer;
    Month: Byte;
    Day: Byte;
  end;

var
  ABirthday: TMyDate;

begin
  ABirthday.Year := 1997;
  ABirthday.Month := 2;
  ABirthday.Day := 14;
  Show('Born in year ' + ABirthday.Year.ToString);
end;

注解: 术语"records"有时在使用中有些松散,可用于指代语言的两个不同元素:记录类型的定义和记录类型的变量(或记录实例)。"Record"用作"record type"和"record instance"的同义词,而类类型不同,在类的情况下,实例被称为对象。

Object Pascal 中,记录这种数据结构远不止一个简单的字段列表,本章的其余部分将对此进行说明,但我们从这种传统方式的记录开始。记录的内存通常分配在堆栈上用于局部变量,分配在全局内存中则用于全局变量。这通过调用SizeOf来突出显示,它返回变量或类型所需的字节数,如下语句所示:

pascal 复制代码
Show('Record size is ' + SizeOf(ABirthday).ToString);

在 Win32 系统中,使用默认编译器设置,返回值为 8(为什么返回值是 8 而不是 6---整数字段为 4 字节,每个字节字段为 2 字节--这将在字段对齐部分讨论)。

​ 换句话说,记录是值类型。这意味着,如果将一条记录赋值给另一条记录,就等于复制了一条完整的记录。如果对副本进行更改,原始记录不会受到影响。下面的代码片段用代码的形式解释了这一概念:

pascal 复制代码
var
  ABirthday: TMyDate;
  ADay: TMyDate;

begin
  ABirthday.Year := 1997;
  ABirthday.Month := 2;
  ABirthday.Day := 14;

  ADay := ABirthday;
  ADay.Year := 2008;

  Show(MyDateToString(ABirthday));
  Show(MyDateToString(ADay));
end;

输出(以日本或国际日期格式)是:

复制代码
1997.2.14
2008.2.14

当将记录作为参数传递给函数时,也会发生相同的复制操作,就像我上面使用的MyDateToString函数:

pascal 复制代码
function MyDateToString(MyDate: TMyDate): string;
begin
  Result := MyDate.Year.ToString + '.' +
            MyDate.Month.ToString + '.' +
            MyDate.Day.ToString;
end;

​ 对该函数的每次调用都涉及记录数据的完整拷贝。为了避免复制,并在可能的情况下对原始记录进行修改,必须明确使用引用参数。下面的过程就强调了这一点:

pascal 复制代码
procedure IncreaseYear(var MyDate: TMyDate);
begin
  Inc(MyDate.Year);
end;

var
  ADay: TMyDate;

begin
  ADay.Year := 2020;
  ADay.Month := 3;
  ADay.Day := 18;

  IncreaseYear(ADay);

  Show(MyDateToString(ADay));
end;

通过过程的调用,原始记录的年份字段的值增加了,最终输出比输入晚一年:

复制代码
2021.3.18
相关推荐
那年窗外下的雪.17 分钟前
AIDC 学习日志 第 04 天 BGP Underlay 基础与路由选择
服务器·学习·php
蒸蒸yyyyzwd41 分钟前
cpp选手备战后端学习笔记day6 秋招笔试题
笔记·学习
weixin_446260853 小时前
AVA-Encoder:面向智能体原生视频表征学习框架
学习·音视频
DeviceHub3 小时前
硬件工程师选型笔记:ALPS SKPMAPE010 与 Tonevee TS-3025 贴片轻触开关 PIN TO PIN 评估指南
笔记
吃好睡好便好3 小时前
说说口罩的佩戴
学习·生活·口罩
fīɡЙtīиɡ ℡4 小时前
大模型结构化输出
人工智能·学习
疯狂打码的少年4 小时前
【数据结构】二叉树的性质(五大性质+计算)
数据结构·笔记·算法
Dave1205464 小时前
Day17:Agent Memory高级设计——短期记忆、长期记忆与向量语义记忆
人工智能·学习
小唔w4 小时前
2026年AI培训行业观察:主流学习渠道一览
人工智能·学习
Capricorn19885 小时前
知芽研究问题看板无法推进?从孵化区到笔记的机制排查指南
大数据·论文阅读·人工智能·笔记·学习方法·论文笔记