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

7.5 构造函数

​ 在上面的代码中,为了创建一个类的对象(或为对象分配内存),我调用了 Create 方法。这是一个构造函数,是一种可以应用于类的特殊方法,用于为类的新实例分配内存:

ADay := TDate.Create;

​ 该实例由构造函数返回,可以分配给一个变量,用于存储该对象并在以后使用。创建对象时,其内存将被初始化。新实例的所有数据都被设置为零(或 nil,或空字符串,或给定数据类型的适当 "默认 "值)。

​ 如果希望实例数据一开始的值不是零(尤其是当零值作为默认值意义不大时),则需要编写一个自定义构造函数来实现。新构造函数可以叫 Create,也可以叫其他名字。决定其作用的不是名称,而是constructor关键字的使用。

注解:换句话说,Object Pascal 支持命名构造函数,而在许多 OOP 语言中,构造函数必须以类本身命名。有了命名的构造函数,你就可以拥有多个具有相同参数的构造函数(除了重载 Create 符号—重载将在下一节中介绍)。在 OOP 语言中,构造函数还可以是虚构造函数,这是该语言的另一个非常特殊的功能。在下一章介绍虚方法的概念后,我将展示一些关于这个非常好的功能的例子。

​ 为类添加自定义构造函数的主要目的是初始化其数据。如果在创建对象时不对其进行初始化,以后调用方法时可能会出现奇怪的行为,甚至运行时出错。与其等着这些错误出现,不如使用预防性技术从一开始就避免。其中一种技术就是始终使用构造函数来初始化对象的数据。例如,我们必须在创建对象后调用 TDate 类的 SetValue 过程。作为替代方案,我们可以提供一个自定义的构造函数,创建对象并赋予其初始值:

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

constructor TDate.CreateFromValues(M, D, Y: Integer);
begin
  FDate := SetValue(M, D, Y);
end;

​ 您可以使用这些构造函数,就像我在Date3示例中所做的那样,在附加到两个独立按钮的代码中:

ADay1 := TDate.Create;
ADay2 := TDate.CreateFromValues(12, 25, 2015);

​ 一般情况下,虽然构造函数可以使用任何名称,但请记住,如果您使用的名称不是 Create,那么基类 TObject 类的 Create 构造函数仍然可用。如果你正在开发和发布供他人使用的代码,调用默认 Create 构造函数的程序员可能会绕过你提供的初始化代码。通过定义一个带有某些参数(或不带参数,如上例)的 Create 构造函数,你就可以用一个新的构造函数替换默认定义,并强制使用它。

​ 与类可以拥有自定义构造函数的方式相同,类也可以拥有自定义析构函数,即使用destructor关键字声明并始终名为 Destroy 的方法。析构方法可以在对象被销毁前执行一些资源清理,但在很多情况下并不需要自定义析构函数。

​ 正如构造函数调用会为对象分配内存一样,析构函数调用也会释放内存。只有在构造函数中或在其生命周期中获取资源(如另一个对象)的对象才真正需要自定义析构函数。

​ 与默认的Create构造函数不同,默认的Destroy析构函数是虚函数的,强烈建议开发人员覆盖这个虚析构函数(虚方法在下一章中介绍)。

​ 这是因为与直接调用析构函数来释放对象不同,调用 TObject 类的特殊 Free 方法是一种良好的 Object Pascal 编程习惯。因此,如果你定义了一个不同名称的析构函数,它就不会被 Free 调用。我们将在第 13 章重点讨论内存管理,届时将再次讨论这个话题。

注解:正如下一章所述,Destroy 是一个虚方法。你可以在继承类中用一个新的定义替换它的基本定义,并用override关键字标记。顺便提一下,静态方法调用虚方法是一种非常常见的编程风格,称为模板模式。在析构函数中,一般只需编写资源清理代码。尽量避免可能引发异常或耗费大量时间的复杂操作,以免给对象清理带来麻烦,而且许多析构函数都是在程序终止时调用的,因此要尽可能保持快速。

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

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

相关文章

202447读书笔记|《围炉夜话》——多记先正格言,胸中方有主宰 闲看他人行事,眼前即是规箴

202447读书笔记|《围炉夜话》——多记先正格言,胸中方有主宰;闲看他人行事,眼前即是规箴 围炉夜话 《围炉夜话(读客三个圈经典文库)》作者王永彬。读《围炉夜话》,可以掌握君子安身立业的大智慧&#xff01…

MySQL数据库的备份

文章目录 MySQL数据库的备份MySQL备份方法完全备份物理备份备份 逻辑热备完全备份逻辑热备恢复恢复库恢复表 增量备份备份增量备份恢复基于位置进行恢复基于时间 MySQL数据库的备份 MySQL备份方法 物理备份: 物理备份涉及直接复制MySQL的数据文件和日志文件。这种…

(进程线程)的状态和线程安全

进程有两个状态就绪状态和阻塞状态。 这些状态决定了系统会按照什么样的态度来调度这个进程(这些一般是针对一个进程里面有一个线程的情况)。在实际的大多数情况下,一个进程中包含多个线程,其状态则会绑定在线程上。 上诉状态一…

计算机408炸了!大多数人都栽在这门课上

组成原理>>数据结构>操作系统>计算机网络 在本科时,我在学习组成原理之前已经学过数字电路和模拟电路,但在接下来学习组成原理时,我依然感到困难。也许是因为自己理解能力不足,总觉得难以掌握,甚至在考研…

算法打卡day28|贪心算法篇02|Leetcode 122.买卖股票的最佳时机 II、55. 跳跃游戏、45.跳跃游戏 II

算法题 Leetcode 122.买卖股票的最佳时机 II 题目链接:122.买卖股票的最佳时机 II 大佬视频讲解:买卖股票的最佳时机 II视频讲解 个人思路 因为只有一只股票,且两天作一个交易单元,那每次只收集正利润就可以最终最多可以获取的利润&#xf…

数据运营常用的8大模型

✅作者简介:《数据运营:数据分析模型撬动新零售实战》作者、《数据实践之美》作者、数据科技公司创始人、多次参加国家级大数据行业标准研讨及制定、高端企培合作讲师。 🌸公众号:风姑娘的数字视角,免费分享数据应用相…

10个优秀的Github开源项目

1Panel 是一个现代化、开源的 Linux 服务器运维管理面板 EX-chatGPT-精准搜索工具 feishu-chatgpt-飞一般的工作体验工具 Knife4j-是一个集Swagger2 和 OpenAPI3为一体的增强解决方案 Kooder 是 Gitee 团队开发的一个代码搜索系统 mtbird 是一款低代码可视化页面生成器 S…

<Linux> 模拟实现文件流 - 简易版

目录 1. FILE 结构设计 2、函数使用及分析 3、文件打开 fopen 4. 缓冲区刷新fflush 5. 数据写入fwrite 6. 文件关闭 fclose 7. 测试 8. 小结 1. FILE 结构设计 在设计 FILE 结构体前,首先要清楚 FILE 中有自己的缓冲区及冲刷方式 缓冲区的大小和刷新方式因…

巧用 20个 Linux 命令贴士与技巧,让你生产力瞬间翻倍?

在本文中,我将向您演示一些专业的Linux命令技巧,这些技巧将使您节省大量时间,在某些情况下还可以避免很多麻烦,而且它也将帮助您提高工作效率。 并不是说这些只是针对初学者的 Linux 技巧。即使有经验的Linux用户也有可能没有发现…

C++ 扫描当前路径下文件并删除大文件

C 扫描当前路径下文件并删除大文件 C获取当前路径扫描文件路径下规定后缀名称的文件计算文件大小 1. 获取当前路径 使用<Windows.h>中的GetCurrentDirectory方法实现&#xff0c;单独编写验证程序如下&#xff1a; #include<iostream> #include<Windows.h&g…

R语言基础入门

1.保存或加载工作空间 改变工作目录——进行文件读写&#xff0c;默认去指定文件进行操作。&#xff08;使用R时&#xff0c;最好先设定工作目录&#xff08;setwd(),getwd()&#xff09;&#xff09; setwd(“工作文件路径”)&#xff1a;建立工作目录 getwd&#xff08;&…

Linux的进程控制(创建和终止)

进程创建 fork 我们前面已经认识过fork函数&#xff0c; 用fork创建新进程后&#xff0c; 新建立的进程为子进程&#xff0c; 该进程为父进程。fork给父进程返回的是子进程的pid&#xff0c; 给子进程返回的是0&#xff0c; 出错时返回-1 进程调用fork后&#xff0c; 当控制…

IS-IS路由

概览&#xff1a; Intermediate System-to-Intermediate System&#xff0c;中间系统到中间系统协议 IS-IS--IGP--链路状态协议--AD值&#xff1a;115 IS--中间系统&#xff08;路由器&#xff09; ES--终端系统&#xff08;PC&#xff09; 在早期IS-IS的开发并不是为了IP…

安防监控视频汇聚平台EasyCVR启用图形验证码之后如何调用login接口?

视频综合管理平台EasyCVR视频监控系统支持多协议接入、兼容多类型设备&#xff0c;平台可以将区域内所有部署的监控设备进行统一接入与集中汇聚管理&#xff0c;实现对监控区域的实时高清视频监控、录像与存储、设备管理、云台控制、语音对讲、级联共享等&#xff0c;在监控中心…

3.25号arm

1. I2C总线 1.1 i2c概述 I2C总线是PHLIPS公司在八十年代初推出的一种串行的半双工总线&#xff0c;主要用于连接整体电路。 I2C总线为两线制&#xff0c;只有两根双向信号线。一根是数据线SDA&#xff0c;另一根是时钟线SCL。 I2C硬件结构简单&#xff0c;接口连接方便&…

【OpenModelica】1 OpenModelica项目架构

1 OpenModelica项目架构 文章目录 1 OpenModelica项目架构一、 架构总览图二、OpenModelica各部分作用 一、 架构总览图 OpenModelica 环境由几个相互连接的子系统组成&#xff0c;如图 1.1 所示。 其中包括&#xff1a; MDT Eclipse 插件图形模型编辑器/浏览器文本模型编辑器…

日本科技巨头富士通遭遇网络攻击,客户数据被窃

日本科技巨头富士通3月15日发布通告&#xff0c;宣称公司经历了一起网络攻击事件&#xff0c;客户个人数据已被黑客窃取。 富士通在一份通知中写道&#xff1a;“我们已经确认有几台商用计算机上存在恶意软件&#xff0c;并且经过我们的内部调查&#xff0c;发现包含个人信息和…

SAP前台处理:物料计价方式:价格控制与价格确定 - 02 <CKM3>

一、背景&#xff1a; 物料主数据中我们讲解到物料的计价方式&#xff0c;SAP应用到的主要计价方式有移动平均价和标准价格方式两种&#xff0c;但也有按照批次计价等方式&#xff0c;我们主要介绍最常用的V2移动平均价和S3的标准价格&#xff1b; 二、示例差异分析&#xff…

k8s入门到实战(二)—— windows安装minikube

minikube 安装 minikube 是一个用于在本地计算机上运行单个节点的 k8s 集群的工具。它允许开发人员可以在自己的计算机上进行本地的 k8s 开发和测试。通过minikube&#xff0c;您可以模拟一个完整的 k8s 集群环境&#xff0c;包括节点、Pod、服务和存储等组件。它是一个轻量级…

Xcode-双架构arm64 x86_64编译

要启用通用构建&#xff0c;在最新版本的 Xcode 中&#xff0c;请打开您的项目设置&#xff0c;然后依次选择&#xff1a; 1. “Build Settings” 选项卡。 2. 在顶部输入框中输入 “Architectures”。 3. 在 “Architectures” 下拉列表中选择 “Other”。 4. 在输入框中输入 …