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

news/2024/4/24 4:56:04/

7.5 构造函数

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

ADay := TDate.Create;

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

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

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

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

constructor TDate.Create;
beginFDate := Date; // 今天
end;constructor TDate.CreateFromValues(M, D, Y: Integer);
beginFDate := 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关键字标记。顺便提一下,静态方法调用虚方法是一种非常常见的编程风格,称为模板模式。在析构函数中,一般只需编写资源清理代码。尽量避免可能引发异常或耗费大量时间的复杂操作,以免给对象清理带来麻烦,而且许多析构函数都是在程序终止时调用的,因此要尽可能保持快速。


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

相关文章

【新版】系统架构设计师 - 新版架构备考索引<附2023年11月原题回忆>

个人总结,仅供参考,欢迎加好友一起讨论 文章目录 架构 - 新版架构备考索引机考详情备考索引与方向(个人观点,仅供参考)总结附:2023年11月改版机试原题简单回忆 架构 - 新版架构备考索引 首先,此…

算法打卡day15

今日任务: 1)110.平衡二叉树 2)257. 二叉树的所有路径 3)404.左叶子之和 110.平衡二叉树 题目链接:110. 平衡二叉树 - 力扣(LeetCode) 给定一个二叉树,判断它是否是高度平衡的二叉树…

管理自由,体验简单,使用安全 | 详解威联通全套多用户多权限管理方案【附TS-466C产品介绍】

管理自由,体验简单,使用安全 | 详解威联通全套多用户多权限管理方案【附TS-466C产品介绍】 哈喽小伙伴们好,我是Stark-C~。今天我们来解决一个之前评论区多次被提及的问题--多用户权限管理。 对于我们NAS用户来说,基本都会面临这…

【深度学习】pytorch,MNIST手写数字分类

efficientnet_b0的迁移学习 import torch import torch.nn as nn import torch.optim as optim import torchvision.transforms as transforms from torchvision.datasets import MNIST from torch.utils.data import DataLoader from torchvision import models import matplo…

NIO详解

前期处理 对应的思维导图地址: https://www.processon.com/view/link/62247e810e3e74108ca1b5d7 对应的 Github地址: https://github.com/yuejianli/NIO 依赖 全局 pom.xml 依赖 <dependencies><dependency\><groupId\>junit</groupId\><artif…

python—接口编写部分

最近准备整理一下之前学过的前端小程序知识笔记&#xff0c;形成合集。顺便准备学一学接口部分&#xff0c;希望自己能成为一个全栈嘿嘿。建议关注收藏&#xff0c;持续更新技术文档。 目录 前端知识技能树http请求浏览器缓存 后端知识技能树python_api&#xff1a;flaskflask…

DPDK系列之四十二DPDK应用网络编程之TCP编程

一、TCP编程 上一篇文章分析了基本的网络编程和TCP相关的编程框架。在实际应用中&#xff0c;TCP编程还是应用的相当广泛的。DPDK其实完全可以不走寻常路&#xff0c;自己搞定网络编程&#xff0c;但实际情况是大量的实际存在的工程和广泛被接受的TCP/IP协议和网络模型&#x…

Python学习从0到1 day18 Python可视化基础综合案例 1.折线图

我默记这段路的酸楚&#xff0c;等来年春暖花开之时再赏心阅读 —— 24.3.24 python基础综合案例 数据可视化 — 折线图可视化 一、折线图案例 1.json数据格式 2.pyecharts模块介绍 3.pyecharts快速入门 4.数据处理 5.创建折线图 1.json数据格式 1.什么是json 2.掌握如何使用js…

人工智能之Tensorflow批标准化

批标准化&#xff08;Batch Normalization,BN&#xff09;是为了克服神经网络层数加深导致难以训练而诞生的。 随着神经网络的深度加深&#xff0c;训练会越来越困难&#xff0c;收敛速度会很慢&#xff0c;常常会导致梯度消失问题。梯度消失问题是在神经网络中&#xff0c;当前…

JavaEE企业级分布式高级架构师课程

教程介绍 本课程主要面向1-5年及以上工作经验的Java工程师&#xff0c;大纲由IT界知名大牛 — 廖雪峰老师亲自打造&#xff0c;由来自一线大型互联网公司架构师、技术总监授课&#xff0c;内容涵盖深入spring5设计模式/高级web MVC开发/高级数据库设计与开发/高级响应式web开发…

Web前端—浏览器渲染原理

浏览器渲染原理 浏览器渲染原理渲染时间点渲染流水线1. 解析HTML—Parse HTML2. 样式计算—Recalculate Style3. 布局—Layout4. 分层—Layer5. 绘制—Paint6. 分块—Tiling7. 光栅化—Raster8. 画—Draw完整过程 面试题1. 浏览器是如何渲染页面的&#xff1f;2. 什么是 reflow…

每日一题 --- 反转链表[力扣][Go]

反转链表 题目&#xff1a;206. 反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&a…

电脑不能读取移动硬盘,但是可以读取U盘解决方法

找到此电脑 右键设备管理器&#xff0c;找到其中的通用串行总线控制器。 注意&#xff0c;凡是插入到电脑当中不能读取的U盘或者移动硬盘&#xff0c;都会在通用串行总线控制器当中显示为USB大容量存储设备 鼠标选中“USB大容量存储设备”&#xff0c;右键卸载它。此时&#x…

nodejs+vue超市货品信息管理系统pythonflask-django-php

随着世界经济信息化、全球化的到来和互联网的飞速发展&#xff0c;推动了各行业的改革。若想达到安全&#xff0c;快捷的目的&#xff0c;就需要拥有信息化的组织和管理模式&#xff0c;建立一套合理、动态的、交互友好的、高效的超市货品信息管理系统。当前的信息管理存在工作…

修改二方库源码的两种方式

说明&#xff1a;在阿里巴巴《Java开发手册(黄山版)》附2中相关解释如下&#xff1a; 一方库&#xff1a;本工程内部子项目模块依赖的库&#xff08;jar包&#xff09;&#xff1b; 二方库&#xff1a;公司内部发布到中央仓库&#xff0c;可供公司内部其他应用依赖的库&#x…

Spark RDD 基本操作

Spark RDD 基本操作 在前面已经介绍过Spark RDD的两种操作分别是&#xff1a; Transformation&#xff08;转换操作&#xff09; Action&#xff08;行动操作&#xff09; 下面以例子的方式详细介绍Spark RDD的这两种操作涉及的函数。 Transformation&#xff08;转换操作&…

Rust egui(3) 增加多个tab

话说不知道咋写&#xff0c;要不直接上git patch吧。代码都是移植的官方demo&#xff0c;核心改动就是把原来的line_demo换成了plot_demo&#xff0c;里面实现多个ui&#xff0c;然后点击tab标题会切换不同的ui。 如下图&#xff0c;Lines和Markers两个不同的标签对应不同的ui。…

Python入门(六)

参数传递 1.普通传参 通过判断对应位置来传递。 2.关键字传参 用关键字(Keyword&#xff09;的方式来传递参数。在定义函数时&#xff0c;我们给了形参一个符号标记&#xff0c;即参数名。关键字传递是根据参数名来让数据与符号对应上。因此&#xff0c;如果在调用时使用关键…

is ignored, because it exists, maybe from xml file

1、问题概述&#xff1f; springboot整合mybatisplus启动的时候报错信息如下&#xff1a; 2024-03-20 10:12:19.239 ERROR 17840 --- [ main] c.b.m.core.MybatisConfiguration : mapper[com.hazq.hazqoa.mapper.DutyTrunsMapper.dutyTrunsExistence] is …

PyQT5学习--新建窗体模板

目录 1 Dialog 2 Main Window 3 Widget Dialog 模板&#xff0c;基于 QDialog 类的窗体&#xff0c;具有一般对话框的特性&#xff0c;如可以模态显示、具有返回值等。 Main Window 模板&#xff0c;基于 QMainWindow 类的窗体&#xff0c;具有主窗口的特性&#xff0c;窗口…