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

news/2024/4/19 2:20:54
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…

Java | 字符分类统计

大家可以关注一下专栏,方便大家需要的时候直接查找,专栏将持续更新~ 题目描述 编写一个Java程序,用于统计输入的一行字符中英文字母、空格、数字和其他字符的个数。 程序需要接收一行文本作为输入,然后分别统计并输出其中英文字…

Spring相关框架八股

单例bean是线程安全的吗? AOP 事务失效 Bean生命周期 Bean循环依赖解决 MVC执行流程 自动装配原理 Spring常见注解 SpringMVC注解 SpringBoot注解 MyBatis执行流程 MyBatis延迟加载 MyBatis缓存 SpringCloud五大组件 注册中心Nacos、Eureka 负载均衡Ribbon 服务雪崩…

opencv-批量调整图片的曝光率

#--coding:utf-8-- import cv2 import numpy as np import osdef gamma_trans(img,gamma):#gamma函数处理gamma_table[np.power(x/255.0,gamma)*255.0 for x in range(256)]#建立映射表gamma_tablenp.round(np.array(gamma_table)).astype(np.uint8)#颜色值为整数return cv2.LU…

【研究僧总结】回顾第1095个创作日

目录 前言一. 机缘二. 日常三. 展望 前言 感觉刚过1024不久,现在又来个1095创作日 一. 机缘 研究僧一直在找平台做笔记,方便之后的回顾总结,也让各位网友见证你我的成长,相互学习 止不住的写文止不住的成长,大家共同…

ETL工具-nifi干货系列 第三讲 nifi web ui 使用教程

1、nifi 服务启动之后,浏览器输入https://localhost:8443/nifi ,匿名登录或者输入用户名密码进入操作页面,如下图所示: 2、组件工具栏 处理器,鼠标放到图标上提示Processor,里面里面有各种各样的组件,可以实现各种各样…

蓝桥杯day9刷题日记

P8649 [蓝桥杯 2017 省 B] k 倍区间 思路&#xff1a;前缀和的题&#xff0c;对k取余相同的数就可以得到k的倍数 #include <iostream> #include <string> using namespace std; long long ans; int n,k; long long q[100010]; long long sum[100010];int main() …

微服务(基础篇-001-介绍、Eureka)

目录 认识微服务&#xff08;1&#xff09; 服务架构演变&#xff08;1.1&#xff09; 单体架构&#xff08;1.1.1&#xff09; 分布式架构&#xff08;1.1.2&#xff09; 微服务&#xff08;1.1.3&#xff09; 微服务结构 微服务技术对比 企业需求 SpringCloud(1.2) …

操作系统究竟是什么?在计算机体系中扮演什么角色?

操作系统究竟是什么&#xff1f;在计算机体系中扮演什么角色&#xff1f; 一、操作系统概念二、操作系统如何管理软硬件资源2.1 何为管理者2.2 操作系统如何管理硬件 三、系统调用接口作用四、用户操作接口五、广义操作系统和狭义操作系统 一、操作系统概念 下面是来自百度百科…

ETL数据倾斜与资源优化

1.数据倾斜实例 数据倾斜在MapReduce编程模型中比较常见&#xff0c;由于key值分布不均&#xff0c;大量的相同key被存储分配到一个分区里&#xff0c;出现只有少量的机器在计算&#xff0c;其他机器等待的情况。主要分为JOIN数据倾斜和GROUP BY数据倾斜。 1.1GROUP BY数据倾…

C++实现FFmpeg音视频实时拉流并播放

1.准备工作: 下载rtsp流媒体服务器rtsp-simple-server,安装go开发环境并编译 编译好后启动流媒体服务器 准备一个要推流的mp4视频文件,如db.mp4 使用ffmpeg开始推流 推流命令: ffmpeg -re -stream_loop -1 -i db.mp4 -c copy -rtsp_transport tcp -f rtsp rtsp://192.168.16…

语言模型的原理、实战与评估

语言模型的原理、实战与评估是一个宽泛的话题,下面是对这三个方面简要概述: 语言模型的原理 语言模型(Language Model, LM)是一种统计模型,用于估计一段文本序列的概率分布。它的核心任务是给定一系列词语,计算出这些词语组合成一个完整句子或段落的概率。典型的语言模型…

常见的加密算法场景和特点

对称加密算法&#xff1a; DES&#xff08;Data Encryption Standard&#xff09;&#xff1a; 适用场景&#xff1a;历史上的数据加密&#xff0c;由于密钥长度较小&#xff08;56位&#xff09;&#xff0c;安全性不足以应对现代威胁&#xff0c;目前较少单独使用&#xff0c…