(delphi11最新学习资料) Object Pascal 学习笔记---第7章第2节( 对象引用模型 )

7.2 对象引用模型

​ 在某些 OOP 语言(如 C++)中,声明一个类类型的变量就会创建该类的一个实例(与 Object Pascal 中的记录差不多)。本地对象的内存来自堆栈,并在函数结束时释放。不过,在大多数情况下,你必须明确地使用指针和引用,才能更灵活地管理对象的生命周期,这就增加了很多额外的复杂性。

​ Object Pascal 语言则基于对象引用模型,与 Java 或 C# 完全相同。其原理是,类类型的每个变量并不保存对象的实际值及其数据(例如,存储日、月和年)。相反,它只包含一个引用或指针,用来指示存储实际对象数据的内存位置。

注解: 在我看来,采用对象引用模型是编译器团队在语言早期做出的最佳设计决策之一,当时这种模型在编程语言中并不常见(事实上,那时还没有Java,也没有C#)。

​ 因此,在这些语言中,您需要显式创建一个对象并将其赋值给变量,因为对象不会自动初始化。换句话说,当你声明一个变量时,你并没有在内存中创建一个对象,你只是为对象的引用保留了内存位置。对象实例必须手动和显式地创建,至少对于你定义的类的对象是这样。(不过,在 Object Pascal 中,运行库会自动创建放置在窗体上的组件实例)。

​ 在 Object Pascal 中,要创建对象的实例,我们可以调用其特殊的 Create 方法,即类本身定义的构造函数或其他自定义构造函数。以下是代码:

ADay := TDate.Create;

​ 正如你所看到的,构造函数应用于类(类型),而不是对象(变量)。这是因为你要求类创建一个其类型的新实例,而结果是一个你通常会赋值给变量的新对象。

Create方法从何而来呢?它是 TObject 类的构造函数,所有其他类都继承自该构造函数(下一章将讨论该主题)。不过,在类中添加自定义构造函数是很常见的,我们将在本章后面的章节中看到。

7.2.1 释放对象

​ 在使用对象引用模型的语言中,您需要一种方法在使用对象之前创建该对象,同时还需要一种方法在不再需要该对象时释放其占用的内存。如果不对其进行清理,就会导致不再需要的对象占满内存,造成内存泄漏问题。为了解决这个问题,C# 和 Java 等基于虚拟执行环境(或虚拟机)的语言都采用了垃圾回收机制。虽然这让开发人员变得更轻松,但这种方法却受到一些复杂的性能问题的制约,而这些问题在解释 Object Pascal 时其实并不重要。因此,尽管这些问题很有趣,但我不想在此深入探讨。

​ 在 Object Pascal 中,一般通过调用对象特殊的 Free 方法(同样是 TObject 的方法,在每个类中都可用)来释放对象的内存。在调用对象的析构函数(可能有特殊的清理代码)后,Free 会将对象从内存中删除。因此,您可以将上面的代码片段补充为:

var
  ADay: TDate;
begin
  // 创建
  ADay := TDate.Create;
  // 使用(略)
  // 释放内存
  ADay.Free;
end;

​ 虽然这是标准的做法,但组件库还增加了像对象所有权这样的概念,大大减少了手动内存管理的影响,使这一问题的处理相对简单。使这个问题的处理相对简单。

注解: 稍后我们将看到,当使用接口引用对象时,编译器采用了一种自动引用计数(ARC)内存管理形式。几年来,Delphi 移动编译器中的常规类类型变量也采用了这种方式。从 10.4 版(也称为 Sydney 版)开始,内存管理模型得到了统一,所有目标平台都采用了经典的桌面 Delphi 内存管理。

​ 需要了解的内存管理知识还有很多;但鉴于这是一个相当重要的主题,而且并不简单,我决定在这里只提供简短的介绍,并用一整章(即第 13 章)专门讨论这一主题。在这一章中,我将向你详细介绍你可以使用的不同技巧。

7.2.2 什么是"nil"?

​ 如前所述,变量可以引用某个类的对象。但变量可能还没有初始化,或者曾经引用的对象可能已经不可用了。这时可以使用 nil。这是一个常量值,表示变量没有引用任何对象。其他编程语言使用符号 null 来表达相同的概念。

​ 当类类型的变量没有值时,您可以通过以下方式初始化它:

ADay := nil;

​ 要检查对象是否已赋值给变量,可以编写以下任一表达式:

if ADay <> nil then ...
if Assigned(ADay) then ...

​ 切勿错误地将 nil 赋值给对象,从而将其从内存中删除。将对象引用设置为 nil 和释放它是两种不同的操作。因此,通常需要同时释放一个对象并将其引用设置为 nil,或者调用一个同时执行这两种操作的特殊过程,称为 FreeAndNil。同样,更多信息和一些实际演示将在以内存管理为重点的第 13 章中介绍。

7.2.3 记录与的内存模型对比

​ 正如我前面提到的,记录与对象的主要区别之一在于它们的内存模型。记录类型的变量使用本地内存,默认情况下是以传值形式传递参数给调用函数,并且在赋值时是进行 “值复制”。而类类型变量是在动态的堆内存上分配的,按引用传递,并在赋值时进行 "引用复制 "(因此复制的是内存中同一对象的引用,而不是实际数据)。

注解: 这种不同的内存管理模型的结果是,记录缺乏继承和多态性,这是我们将在下一章中重点关注的两个特性。

​ private访问说明符表示类的字段和方法在声明该类的单元(源代码文件)之外不可访问。

​ 例如,当您在堆栈上声明记录变量时,可以立即开始使用,而无需调用其构造函数(除非它们是自定义托管记录)。这意味着记录变量比常规对象在内存管理上更精简、更高效,因为它们不参与动态内存管理。这是使用记录而不是对象来处理小型和简单数据结构的关键原因。

​ 关于记录和对象在作为参数时传递方式不同,默认情况下是复制代表记录的内存块(包括其所有数据)或对象的引用(数据不会被复制)。当然,您可以使用var或const修饰的记录类型参数来改变传递记录类型参数的默认行为,从而避免任何复制。

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

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

相关文章

硬件基础:带缓启动MOS管电源开关电路

电源开关电路&#xff0c;经常用在各“功能模块”电路的电源通断控制&#xff0c;是常用电路之一。 本文要讲解的电源开关电路&#xff0c;是用MOS管实现的&#xff0c;且带缓开启功能&#xff0c;非常经典。 一、电路说明 电源开关电路&#xff0c;尤其是MOS管电源开关电路…

2024-3-18-C++day6作业

1>思维导图 2>试编程 要求: 封装一个动物的基类&#xff0c;类中有私有成员&#xff1a;姓名&#xff0c;颜色&#xff0c;指针成员年纪 再封装一个狗这样类&#xff0c;共有继承于动物类&#xff0c;自己拓展的私有成员有&#xff1a;指针成员&#xff1a;腿的个数&a…

蓝桥杯-24点-搜索

题目 思路 --暴力递归全组合的方法。只有4个数&#xff0c;4种计算方式&#xff0c;共有4 * 3 * 2 * 1 * 4种不同的情况&#xff0c;可以写递归来实现。 --每次计算都是两个数之间的运算&#xff0c;因此4个数需要3次计算&#xff0c;第一次计算前有4个数&#xff0c;第二次有…

Mysql与MyBatis

1 Sql语句 增删改查 1.1 建表 -- cmd展示数据库 show databases ; -- cmd登录数据库 mysql localhost -u root -p-- auto_increment 自动增长&#xff0c;每添加一个表项id自动增1 -- char定长字符串 0-255&#xff0c;不足十个字符按十个字符算&#xff0c; varchar变长字符串…

阿里云服务器“地域”,这么选择就对了!

阿里云服务器地域选择方法&#xff0c;如何选择速度更快、网络延迟更低的地域节点&#xff0c;地域指云服务器所在的地理位置区域&#xff0c;地域以城市划分&#xff0c;如北京、杭州、深圳及上海等&#xff0c;如何选择地域&#xff1f;建议根据用户所在地区就近选择地域&…

预防近视的台灯有哪些?多款专家说好的护眼台灯推荐

现在的儿童青少年近视率真的非常高&#xff01;据统计&#xff0c;我国儿童青少年的总体近视率为52.7%&#xff0c;其中6岁儿童为14.3%&#xff0c;小学生为35.6%&#xff0c;初中生为71.1%&#xff0c;高中生为80.5%。而造成如此高近视率的原因主要还是长时间过度用眼导致的疲…

【Qt问题】使用QSlider创建滑块小部件无法显示

问题描述&#xff1a; 使用QSlider创建滑块小部件用于音量按钮的时候&#xff0c;无法显示&#xff0c;很奇怪&#xff0c;怎么都不显示 一直是这个效果&#xff0c;运行都没问题&#xff0c;但是就是不出现。 一直解决不了&#xff0c;最后我在无意中&#xff0c;在主程序中…

LabVIEW飞行器螺旋桨性能测试与数据监控

LabVIEW飞行器螺旋桨性能测试与数据监控 开发LabVIEW的电动飞行器螺旋桨性能测试与数据监控系统&#xff0c;专门针对电动飞行器螺旋桨在运行过程中的性能测试和监控需求。通过采集转速、转矩、拉力和温度等关键参数&#xff0c;系统能够实时监测和分析螺旋桨的状态&#xff0…

AI - 集成学习

目录 集成学习概念 集成学习器性能评估 随机森林 AdaBoost &#x1f606;&#x1f606;&#x1f606;感谢大家的阅读&#x1f606;&#x1f606;&#x1f606; 集成学习概念 &#x1f48e;集成学习是机器学习中的一种思想&#xff0c;它通过多个模型的组合形成一个精度…

【Spring MVC】Spring MVC拦截器(Interceptor)

目录 一、拦截器介绍 二、拦截器 Interceptor 定义 2.1 HandlerInterceptor接口 2.2 Spring MVC中提供的一些HandlerInterceptor接口实现类 1、AsyncHandlerInterceptor 2、WebRequestInterceptor 3、MappedInterceptor 4、ConversionServiceExposingInterceptor 三、拦…

力扣题单(小白友好)

力扣题单 算法小白自用题单,目前对于一些简单的数据结构感觉掌握的还可以,但是力扣很多题还是需要看题解,不够熟练;故整理了一份题单,用于巩固练习; 网上确实有很多对于算法分类讲解的网站,but:有一丢丢选择困难症,每天不知道该刷什么题,再加上网站对于一类题一般就有十几道题目…

人工智能技术的不当利用与风险

目录 前言1 视频篡改技术的滥用1.1 虚假信息传播与社会动荡1.2 对公众信任的破坏与舆论混乱 2 隐私泄露与监视风险2.1 个人信息安全与数据滥用风险2.2 社会稳定与个人自由权利的平衡 3 虚假评论与信息传播3.1 舆论操纵与社会意识形态的影响3.2 对信息可信度与公众信任的威胁 结…

雷龙发展Nand flash芯片试用体验

一、项目背景 最近自己开始准备了一个智能家居控制系统项目,需要包含室内的温湿度、空气质量、烟雾浓度以及气体含量,能够存储相应的数据,并进行显示。 Nand-flash存储器是flash存储器的一种,其内部采用非线性宏单元模式,为固态大容量内存的实现提供了廉价有效的解决方案…

阿里云ecs服务器配置反向代理上传图片

本文所有软件地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/12OSFilS-HNsHeXTOM47iaA 提取码&#xff1a;dqph 为什么要使用阿里云服务器&#xff1f; 项目想让别人通过外网进行访问就需要部署到我们的服务器当中 1.国内知名的服务器介绍 国内比较知名的一些…

一招让你的Mac重获新生!CleanMyMac专业软件助你清理系统垃圾,保障安全!

一、Mac用户必备神器——CleanMyMac 随着Mac的使用时间越来越长&#xff0c;系统中的垃圾文件也会越来越多&#xff0c;不仅占用宝贵的硬盘空间&#xff0c;还会影响系统的运行速度。这时候&#xff0c;一款专业的清理软件就显得尤为重要。CleanMyMac作为荣获多项大奖的清理软件…

录视频的软件推荐,助力视频内容创作

随着网络技术的发展和在线教育的兴起&#xff0c;录制视频教程的需求日益增加。无论是制作教学课程、分享办公技巧&#xff0c;还是录制游戏过程&#xff0c;一款好用的录屏软件都至关重要。本文将深入介绍三款录视频的软件&#xff0c;帮助读者了解它们的特点和操作步骤&#…

【Linux】回顾 C 文件接口

文章目录 1. 写文件2. 读文件3. 输出信息到显示器的几个方法4. stdin / stdout / stderr5. 打开文件的方式 1. 写文件 int main() {FILE* fp fopen("myfile", "w");if (!fp){printf("fopen error!\n");}const char* msg "hello world!\n…

自己录的视频怎么配上字幕?推荐几种方法

自己录的视频怎么配上字幕&#xff1f;在数字化时代&#xff0c;视频已经成为人们获取信息、娱乐消遣的重要形式。而对于许多内容创作者来说&#xff0c;为自己的视频添加字幕不仅能提升观众的观看体验&#xff0c;还能增加视频的专业度和吸引力。那么&#xff0c;如何为自己的…

初次文件包含漏洞

1.文件包含漏洞介绍 1.1.文件包含漏洞解释   文件包含漏洞就是使用函数去包含任意文件的时候&#xff0c;当包含的文件来源过滤不严谨的时候&#xff0c;当存在包含恶意文件后&#xff0c;就可以通过这个恶意的文件来达到相应的目的。 1.2.文件包含漏洞原理    其实原理就…

数据之谜:解读Facebook的用户行为

在当今数字化时代&#xff0c;社交媒体平台已经成为人们生活中不可或缺的一部分&#xff0c;而Facebook作为全球最大的社交网络之一&#xff0c;其背后隐藏着许多数据之谜。本文将深入探讨Facebook的用户行为&#xff0c;并试图解读其中的奥秘。 用户行为数据的收集 Facebook作…