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

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.rhkb.cn/news/286002.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用uniapp 的 plus.sqlite 操作本地数据库报错:::table xxx has no column named xxxx

背景: 1、使用uniapp 的 plus.sqlite 进行APP本地数据库操作 2、SQLite 模块用于操作本地数据库文件,可实现数据库文件的创建,执行SQL语句等功能。 遇到:在之前创建的表上进行新增字段的操作时候,出现问题&#xff1a…

API 接口渗透测试

1 API 接口介绍 1.1 RPC(远程过程调用) 远程过程调用(英语:Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无…

css的active事件在手机端不生效的解决方法

需求:需求就是实现点击图中的 “抽奖” 按钮,实现一个按钮Q弹的放大缩小动画 上面是实现的效果,pc端,点击触发 :active 问题:但是这种方式在模拟器上可以,真机H5一调试就没生效了,下面是简单…

力扣438. 找到字符串中所有字母异位词

Problem: 438. 找到字符串中所有字母异位词 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.编写辅助函数bool same(vector& need, vector& matched): 1.1 以need为标准,循环对比need和matched的每一个位置的元素值是否相等 2.获…

redis实际应用场景及并发问题的解决

业务场景 接下来要模拟的业务场景: 每当被普通攻击的时候,有千分之三的概率掉落金币,每回合最多爆出两个金币。 1.每个回合只有15秒。 2.每次普通攻击的时间间隔是0.5s 3.这个服务是一个集群(这个要求暂时不实现) 编写接口&…

【工作中问题解决实践 十二】线上如何排查CPU100%的情况

当我们把服务发布到服务器器,可能会因为一些问题造成我们的服务器CPU被打满甚至超过100%,那如果我们想知道到底上在做什么操作导致CPU持续过高呢?因为在线上只能通过日志看问题,或者排查到哪个进程或者哪个线程持续占用CPU。然后才…

Avue框架实现图表的基本知识 | 附Demo(全)

目录 前言1. 柱状图2. 折线图3. 饼图4. 刻度盘6. 仪表盘7. 象形图8. 彩蛋8.1 饼图8.2 柱状图8.3 折线图8.4 温度仪表盘8.5 进度条 前言 以下Demo,作为初学者来说,会相应给出一些代码注释,可相应选择你所想要的款式 对于以下Demo&#xff0c…

【云开发笔记No.9】Kanban与敏捷开发

Kanban看板起源于丰田。 看板(Kanban)一词来自日文,本义是可视化卡片。如下图所示,看板工具的实质是:后道工序在需要时,通过看板向前道工序发出信号——请给我需要数量的输入,前道工序只有得到看…

C# 特性(Attribute)

C# 特性(Attribute) 文章目录 C# 特性(Attribute)Obsolete语法示例代码 创建自定义特性(Attribute) Obsolete 这个预定义特性标记了不应被使用的程序实体。它可以让您通知编译器丢弃某个特定的目标元素。例…

五、初识Django

初识Django 1.安装django2.创建项目2.1第一种方式:在终端2.2第二种方式:Pycharm 3.创建app4.快速上手4.1再写一个页面4.2templates模板4.3静态文件4.3.1static目录4.3.2引用静态文件 5.模板语法案例:伪联通新闻中心6.请求和相应案例&#xff…

图像变换(python)

前言 这个Python没学过,写的是真的不方便,有很多问题还没解决,暂时不想写了,感兴趣的同学可以完善一下。设计的思路就是摆几个控件然后将对应的函数实现,这个Python的坐标放置以及控件的大小我没弄懂,算出…

3月份的倒数第二个周末有感

坐在图书馆的那一刻,忽然感觉时间的节奏开始放缓。今天周末因为我们两都有任务需要完成,所以就选了嘉定图书馆,不得不说嘉定新城远香湖附近的图书馆真的很有感觉。然我不经意回想起学校的时光,那是多么美好且短暂的时光。凝视着窗…

如何进行Modbus转Profinet网关的调试与故障排除

Modbus转Profinet网关(XD-MDPN100)带有网口和串口很大限度地解决了设备接口不统一的问题,支持485和232,可以实现从Modbus通信协议到Profinet通信协议的无缝转换,为不同协议之间的互联互通提供了便利。 Modbus转Profine…

时间戳的转换-unix时间戳转换为utc时间(python实现)

import datetimetimestamp = 1711358882# 将时间戳转换为UTC时间 utc_time = datetime.datetime.utcfromtimestamp(timestamp)# 格式化并输出时间 formatted_time = utc_time.strftime(%Y-%m-%d %H:%M:%S) print(formatted_time)同样:UTC如何转换为unix时间戳 from datetime …

Axure案例分享—折叠面板(附下载地址)

今天和大家分享的Axure案例是折叠面板 折叠面板是移动端APP中常见的组件之一,有时候也称之为手风琴。咱们先看下Axure画出的折叠面板原型效果,然后再对该组件进行详细讲解。 一、功能介绍 折叠或展开多个面板内容,默认为展开一项内容&…

K8s-网络原理-中篇

引言 本文是《深入剖析 K8s》的学习笔记,相关图片和案例可从https://github.com/WeiXiao-Hyy/k8s_example中获取,欢迎 ⭐️! 上篇主要介绍了 Flannel 插件为例,讲解了 K8s 里容器网络和 CNI 插件的主要工作原理。还有一种“纯三层”的网络方…

C语言程序与设计——预处理命令

宏 在C语言中宏有三种形式: 定义符号常量定义傻瓜表达式定义代码段 在使用宏的过程中需要注意的是,宏的作用仅仅是在预处理阶段对代码进行替换,而非进行运算,所以在使用时,如果出现了我们预期之外的结果,很有可能是宏…

Java代码基础算法练习-搬砖问题-2024.03.25

任务描述: m块砖,n人搬,男搬4,女搬3,两个小孩抬一砖,要求一次全搬完,问男、 女、小孩各若干? 任务要求: 代码示例: package M0317_0331;import java.util.S…

【Android】图解View事件分发机制

文章目录 View事件分发机制dispartchTouchEvent()dispatchTouchEvent() 方法主要负责什么? onTouchEvent(event) 点击事件分发的传递规则自上而下自下而上 View事件分发机制 View的事件分发机制是Android中非常核心的一个概念,它负责处理触摸事件&#…

SpringMVC | Spring MVC中的“拦截器”

目录: 一、拦截器 :1. 拦截器的 “概述”2. 拦截器的 “定义” (创建“拦截器”对象)3. 拦截器的 “配置” (让“拦截器”对象生效)4. 拦截器的 “执行流程”“单个拦截器”的执行流程“多个拦截器”的执行流程 二、应用案例一实现用户登录权限验证 作者简介 &#…