(delphi11最新学习资料) Object Pascal 学习笔记---第7章第5节(构造函数和析构函数)

news/2025/3/21 3:04:22/
7.5.1 使用构造函数和析构函数管理本地类数据

​ 即使我将在本书后面介绍更复杂的情况,这里我也想向你展示一个使用构造函数和析构函数进行资源保护的简单案例。 这是使用析构函数最常见的情况。

​ 假设您有一个具有以下结构的类(也是Date3示例的一部分):

typeTPerson = classprivateFName: string;FBirthdate: TDate;publicconstructor Create(const Name: string);destructor Destroy; override;// 一些实际方法function Info: string;end;

​ 该类引用了另一个名为 FBirthdate 的内部对象。创建 TPerson 类的实例时,也应创建该内部(或子)对象;销毁实例时,也应释放该内部(或子)对象。

​ 下面是构造函数、重载析构函数和内部方法的代码编写方法,这些方法总是想当然地认为内部对象是存在的:

constructor TPerson.Create(const Name: string);
beginFName := Name;FBirthdate := TDate.Create;
end;destructor TPerson.Destroy;
beginFBirthdate.Free;inherited;
end;function TPerson.Info: string;
beginResult := FName + ': ' + FBirthdate.GetText;
end;

注解:要理解用于定义析构函数的override关键字和定义中的 inherited 关键字,需要等到下一章。现在只需说明前者用于表示类有一个新的定义来替换基类的析构函数,而后者用于调用基类的析构函数。还要注意的是,在方法声明中使用了 override,但在方法实现代码中没有使用。

​ 现在,您可以像下面的情况一样使用外部类的对象,而内部对象将在 TPerson 对象创建时正确创建,并在 TPerson 销毁时及时销毁:

varPerson: TPerson;
beginPerson := TPerson.Create('John');// 使用类及其内部对象Show(Person.Info);Person.Free;
end;

同样,您可以在Dates3示例中找到的这部分代码。

7.5.2 重载方法和构造函数

Object Pascal支持重载函数和方法:只要参数不同,就可以有多个同名的方法。我们已经了解了重载在全局函数和过程中的作用,同样的规则也适用于方法。通过检查参数,编译器可以确定要调用的方法版本。

​ 同样,有两个基本的重载规则:

  • 每个方法的版本后面必须跟有overload关键字。
  • 差异必须是形参的数量或类型,或两者都有。返回类型不能用来区分两个方法。

​ 如果可以将重载应用于类的所有方法,那么这个特性对于构造函数就尤为重要,因为我们可以有多个构造函数并将它们全部称为Create,这使它们易于记忆。

历史:从历史上看,C++专门增加了重载功能,以允许使用多个构造函数,因为构造函数必须具有相同的名称(类的名称)。在Object Pascal中,这个功能可能被认为是不必要的,仅仅是因为多个构造函数可以有不同的具体名称,但重载还是被添加到了语言中,因为它在许多其他场景中也很有用。

​ 作为重载的一个示例,我向TDate类添加了两个不同版本的SetValue方法:

typeTDate = classpublicprocedure SetValue(Month, Day, Year: Integer); overload;procedure SetValue(NewDate: TDateTime); overload;end;procedure TDate.SetValue(Month, Day, Year: Integer);
beginFDate := EncodeDate(Year, Month, Day);
end;procedure TDate.SetValue(NewDate: TDateTime);
beginFDate := NewDate;
end;

​ 在这一简单步骤之后,我为该类添加了两个单独的Create构造函数,一个没有参数,它隐藏了默认构造函数,另一个带有初始化值。没有参数的构造函数使用今天的日期作为默认值:

typeTDate = classpublicconstructor Create; overload;constructor Create(Month, Day, Year: Integer); overload;end;constructor TDate.Create(Month, Day, Year: Integer);
beginFDate := EncodeDate(Year, Month, Day);
end;constructor TDate.Create;
beginFDate := Date; // 今天
end;

有了这两个构造函数,就可以以两种不同的方式定义新的TDate对象:

varDay1, Day2: TDate;
beginDay1 := TDate.Create(2020, 12, 25);Day2 := TDate.Create; // 今天

这段代码是Dates4示例的一部分。


http://www.ppmy.cn/news/1394803.html

相关文章

108、3D Gaussian Splatting for Real-Time Radiance Field Rendering

简介 官网 更少训练时间的同时实现最先进的视觉质量,能在1080p分辨率下实现高质量的实时(≥30 fps)新视图合成 NeRF使用隐式场景表示,体素,点云等属于显示建模方法,3DGS就是显示辐射场。它用3D高斯作为灵活高效的表示方法&…

使用amd架构的计算机部署其他架构的虚拟机(如:arm)

1 下载quem模拟器 https://qemu.weilnetz.de/w64/2 QEMU UEFI固件文件下载(引导文件) 推荐使用:https://releases.linaro.org/components/kernel/uefi-linaro/latest/release/qemu64/QEMU_EFI.fd3 QEMU 安装 安装完成之后,需要将安装目录添加到环境变…

“低代码+平台”:驱动企业数字化转型与创新的新引擎

“低代码平台”作为一种新兴的软件开发范式,正逐渐成为企业快速响应市场变化、优化业务流程、提升数字化水平的重要手段。它的价值在于,将传统软件开发的复杂性大大降低,赋予了非技术人员或轻量级开发者快速构建应用的能力,并能灵…

Request请求参数----中文乱码问题

一: GET POST获取请求参数: 在处理为什么会出现中文乱码的情况之前, 首先我们要直到GET 以及 POST两种获取请求参数的不同 1>POST POST获取请求参数是通过输入流getReader来进行获取的, 通过字符输入流来获取响应的请求参数, 并且在解码的时候, 默认的情况是 ISO_885…

python第三方库的安装,卸载和更新,以及在cmd下pip install安装的包在pycharm不可用问题的解决

目录 第三方库pip安装,卸载更新 1.安装: 2.卸载 3.更新 一、第三方库pip安装,卸载更新 1.安装 pip install 模块名 加镜像下载:pip install -i 镜像网址模块名 常用的是加清华镜像,如 pip install -i https://pyp…

数据结构:插入排序,希尔排序(缩小增量排序)

1.直接插入排序 当插入第 i 个元素时,前面的数据已经排好序了,将后续的数据按大小插入到前面已经排好序的数组中,就是插入排序 特点 1.元素集合越接近有序,时间效率越高 2.时间复杂度O(N^2) 3.空间复杂度O(1) //插入排序 void InsertSort(int* a, int length) {for (int …

【题目】【网络系统管理】2022 年全国职业院校技能大赛 网络系统管理赛项 模块 A:网络构建

2022 年全国职业院校技能大赛 网络系统管理赛项 模块 A:网络构建 目录 考试说明 … 3 任务描述 … 3 任务清单 … 3 (一)基础配置 … 3 (二)有线网络配置 … 4 (三)无线网络配置 … 5 &…

Linux的一些基本指令

​​​​​​​ 目录 前言: 1.以指令的形式登录 2.ls指令 语法: 功能: 常用选项: 3.pwd指令 4.cd指令 4.1 绝对路径与相对路径 4.2 cd .与cd ..(注意cd后先空格,然后两个点是连一起的&#xff0…