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

7.5.1 使用构造函数和析构函数管理本地类数据

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

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

type
  TPerson = class
  private
    FName: string;
    FBirthdate: TDate;
  public
    constructor Create(const Name: string);
    destructor Destroy; override;
    // 一些实际方法
    function Info: string;
  end;

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

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

constructor TPerson.Create(const Name: string);
begin
  FName := Name;
  FBirthdate := TDate.Create;
end;

destructor TPerson.Destroy;
begin
  FBirthdate.Free;
  inherited;
end;

function TPerson.Info: string;
begin
  Result := FName + ': ' + FBirthdate.GetText;
end;

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

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

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

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

7.5.2 重载方法和构造函数

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

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

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

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

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

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

type
  TDate = class
  public
    procedure SetValue(Month, Day, Year: Integer); overload;
    procedure SetValue(NewDate: TDateTime); overload;
  end;

procedure TDate.SetValue(Month, Day, Year: Integer);
begin
  FDate := EncodeDate(Year, Month, Day);
end;

procedure TDate.SetValue(NewDate: TDateTime);
begin
  FDate := NewDate;
end;

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

type
  TDate = class
  public
    constructor Create; overload;
    constructor Create(Month, Day, Year: Integer); overload;
  end;

constructor TDate.Create(Month, Day, Year: Integer);
begin
  FDate := EncodeDate(Year, Month, Day);
end;

constructor TDate.Create;
begin
  FDate := Date; // 今天
end;

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

var
  Day1, Day2: TDate;
begin
  Day1 := TDate.Create(2020, 12, 25);
  Day2 := TDate.Create; // 今天

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/485379.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣74---搜索二维矩阵

目录 题目描述: 思路: 代码: 题目描述: 给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。 每行的第一个整数大于前一行的最后一个整数。 给你一个整数 targ…

c#绘制图形

窗体工具控件 如果选纹理 ,需要在ImageList中选择图像(点击添加选择图片路径) using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Drawing2D; using System.Linq; using System.…

【Redis教程0x03】详解Redis的基本数据类型

引言 根据【Redis教程0x02】中介绍的,Redis的数据类型可分为5种基本数据类型(String、Hash、List、Set、Zset)和4种高级数据类型(BitMap、HyperLogLog、GEO、Stream)。在本篇博客中,我们将详解这9种数据类…

分类预测 | Matlab实现CNN-LSTM-Mutilhead-Attention卷积神经网络-长短期记忆网络融合多头注意力机制多特征分类预测

分类预测 | Matlab实现CNN-LSTM-Mutilhead-Attention卷积神经网络-长短期记忆网络融合多头注意力机制多特征分类预测 目录 分类预测 | Matlab实现CNN-LSTM-Mutilhead-Attention卷积神经网络-长短期记忆网络融合多头注意力机制多特征分类预测分类效果基本介绍模型描述程序设计参…

Springboot做分组校验

目录 分组校验 Insert分组 Upload分组 测试接口 测试结果 添加测试 更新测试 顺序校验GroupSequence 自定义分组校验 自定义分组表单 CustomSequenceProvider 测试接口 测试结果 Type类型为A Type类型为B 总结: 前文提到了做自定义的校验注解&#xff…

牛客NC170 最长不含重复字符的子字符串【高频 中等 map、滑动窗口 Java,Go,PHP】

题目 题目链接: https://www.nowcoder.com/practice/48d2ff79b8564c40a50fa79f9d5fa9c7 思路 用一个hashmap记录每个字母的index如果这个字母已经在map里了说明已经有重复了这样就更新看这个字母上次出现的index需要注意的是这种情况:“bacbca”这里的a…

初识kafka-数据存储篇1

目录 背景 1 kafka总体体系结构 2 疑问解答 2.1 高吞吐低延迟 2.2 实现分布式存储和数据读取 2.3 如何保证数据不丢失 背景 最近在和产品过项目审批的时候,深刻感受到业务方对系统的时时响应提出了更高的要求。目前手上大部分的业务都是基础定时任务去实现的&…

【yolo算法水果新鲜程度检测】

Yolo(You Only Look Once)系列算法是一类流行的一阶段实时目标检测模型,在水果检测领域有着广泛的应用。因其高效性和实时性而受到青睐,可用于识别和定位图像中不同种类的水果以及水果的新鲜度。 YOLOv3 已被用于水果商品的检测分…

家乡特色推荐系统设计与实现|SpringBoot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW,文末可获取本项目的所有资料。 推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java,…

【Linux】线程互斥{线程间的互斥相关背景概念/锁的相关问题/锁的原理/可重入VS线程安全}

文章目录 0.计算机如何完成y a * b c ?1.线程间的互斥相关背景概念2.pthread_mutex_t3.pthread_mutex_lock()4.time() or gettimeofday5.锁的相关问题6.锁的原理7.可重入VS线程安全8.完善后的代码 0.计算机如何完成y a * b c ? 来源: 王道…

nodejs+vue反诈科普平台的设计与实现pythonflask-django-php

相比于以前的传统手工管理方式,智能化的管理方式可以大幅降低反诈科普平台的运营人员成本,实现了反诈科普平台的标准化、制度化、程序化的管理,有效地防止了反诈科普平台的随意管理,提高了信息的处理速度和精确度,能够…

基础篇Redis

基础篇Redis 1.Redis简单介绍 Redis是一种键值型的NoSql数据库,这里有两个关键字: 键值型NoSql 其中键值型,是指Redis中存储的数据都是以key.value对的形式存储,而value的形式多种多样,可以是字符串.数值.甚至json…

Windows/Linux-openEuler系统使用路由侠内网穿透,部署项目详细教程

文章目录 Windows/Linux-openEuler系统使用路由侠内网穿透,部署项目详细教程一、在windows系统下载安装路由侠并实现项目部署1、下载路由侠并注册安装到Windows系统2、点击内网映射,添加映射,注册域名前缀3、选择网站应用4、配置你想要代理项…

mysql 存储引擎 基本介绍

目录 一 存储引擎概念介绍 (一)存储引擎概念 (二)MySQL常用的存储引擎 (三)存储引擎运作方式 二 MyISAM 存储引擎介绍 (一) MyISAM 存储引擎特点 1,不支持…

栅格地图路径规划:基于螳螂搜索算法(Mantis Search Algorithm,MSA)的机器人路径规划(提供MATLAB代码)

一、机器人路径规划介绍 移动机器人(Mobile robot,MR)的路径规划是 移动机器人研究的重要分支之,是对其进行控制的基础。根据环境信息的已知程度不同,路径规划分为基于环境信息已知的全局路径规划和基于环境信息未知或…

数据分析和机器学习库Pandas的使用

Pandas 库是一个免费、开源的第三方 Python 库,是 Python 数据分析和机器学习的工具之一。Pandas 提供了两种数据结构,分别是 Series(一维数组结构)与 DataFrame(二维数组结构),极大地增强的了 …

个人博客系列-后端项目-系统角色配置(8)

系统角色配置需要设置的接口 用户可以绑定多个角色,角色对应有多个路由权限。用户绑定角色后,可以访问当前角色下的各个api路由和菜单路由。 用户注册时设置用户角色修改用户角色(同时对应用户可以访问的路由将会同步变更)添加修…

有关AI的随笔(1)

随笔: 今天是周天,是个好日子,结果老师布置的诗还没写,只好去借助AI,结果我发现了几个有趣的问题: 1. AI写的诗是如何来的?通过数据库? 2. 它真的明白是什么意思吗?&…

AutoDL算力云进行yolov5训练流程

目录 第一步 充值第二步 选择我们用到的显卡第三步 将我们的yolov5源代码导入服务器第四步 激活环境第五步 训练第六步 训练完成 提取 第一步 充值 打开我们的算力云官网 然后找到充值入口 最低充值50 第二步 选择我们用到的显卡 一般呢我都用便宜的2080ti 选择2080ti之后 基…

前端学习之用css和html做一个仿淘宝的导航栏

代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>仿淘宝界面案例</title><style>/* 最外层盒子 */.container{width: 270px;height: 385px;border: 1px solid rgb(255, 208, 0);bord…