基于栈的对象
C++的对象是基于栈的,你可以像普通数据类型一样声明它,访问它的成员,调用它的方法,然后由编译器自动清理栈现场,C++的对象更像一个增强的结构。
而后来的许多面向对象语言如Java,C#等都采用了基于堆的对象机制。Object Pascal呢?毫无疑问它的对象也是基于堆的,当我们看到对象与指针进行转换的代码时,觉得很正常,因为OP对象本质上就是一个指针。
那么Delphi只有基于堆的对象吗?它会不会存在一种基于栈的对象呢?回答这个问题之前先来看看下面的代码:
var
People: TPeople;
begin
People.Name := 'Tom';
People.SayMyName;
end;
大多数人会认为这是错的,因为对象还没有创建,而实际上代码执行的结果是正确的,它弹出一个消息框,说自己叫TOM。
现在来揭开TPeople这个类的真面目:
type
TPeople = object
private
FName: string;
public
procedure SayMyName;
property Name: string read FName write Fname;
end;
{ TPeople }
procedure TPeople.SayMyName;
begin
ShowMessage('my name is: ' + FName);
end;
这个类声明为Object,这是一种向后兼容的类声明方法,现在几乎没有人使用这个关键字来声明类了。但它却表明了Delphi存在的另一种对象机制:基于栈的对象。
Object类的对象的确是基于栈的,从上面的代码可以看出,它不需要创建和消毁,你可以像一个记录一样使用它,只不过这个“记录”是可以带方法的。
与其他类型的指针一样,Object类的对象指针就是PPeople = ^TPeople,要创建一个对象指针,使用New函数,但使用方法稍有不同,请看下面的代码:
type
PPeople = ^TPeople;
TPeople = object
private
FName: string;
public
constructor Create;
destructor Destroy;
procedure SayMyName;
property Name: string read FName write FName;
end;
{ TPeople }
constructor TPeople.Create;
begin
ShowMessage('I am born');
end;
destructor TPeople.Destroy;
begin
ShowMessage('I am die');
end;
procedure TPeople.SayMyName;
begin
ShowMessage('my name is: ' + FName);
end;
procedure TForm1.btn1Click(Sender: TObject);
var
People: PPeople;
begin
New(People, Create);
People^.Name := 'Tom';
People^.SayMyName;
Dispose(People, Destroy);
end;
上面的使用方法就和平常所用的Class十分相似了,不过我倒觉得Object对象和C++的Class更像一些,只是在特性上弱了一些。
有几点要特别指出的:
1. Object类并不继承自TObject,像上面代码那样声明一个类,表明这个类没有父类。
2. 声明Object类的实例时,不会像C++一样调用构造函数;可以用对象指针来代替,如上面的代码。
3. Object类不能声明published成员,这表示它的类型信息非常弱,实际上它的类型信息是tkRecord,而tkRecord除了有个名字外,没有办法获得其他有用信息。
就像Delphi帮助里面说的,Object类只是出于兼容的考虑,并不推荐使用这种类型的类。尽管如此,我认为在某些场合还是可以考虑使用,因为它是基于栈的,因此在存取速度上必定要比基于堆的快很多,一些简单的对象可以考虑用这种类型。
另外,KOL使用Object类建立起了它自己体系结构,使得编译出来的Exe尺寸大幅减小。
分享到:
相关推荐
在这个“基于栈的C++计算器”项目中,我们将探讨如何使用C++实现一个简单的计算器,它利用了数据结构中的栈来处理运算。 栈是一种特殊的线性数据结构,遵循“后进先出”(LIFO)原则。在计算器的上下文中,栈可以...
本项目专注于使用C#语言实现一个基于栈架构的表达式计算器。栈是一种特殊的数据结构,具有后进先出(LIFO)的特点,非常适合处理逆波兰表示法(RPN,也称为后缀表达式)或中缀表达式的计算。 1. **C#语言基础** C#...
在本项目中,我们关注的是一个使用C++编程语言实现的基于栈的表达式计算器。这个计算器能够处理包含括号的数学表达式,并且能够正确处理小数点,支持多位小数的运算。以下是关于这个项目的详细知识点: 1. **栈...
文章《基于分布式对象存储的媒体资源管理系统建设研究》由康欣欣撰写,探讨了如何建设这样一个系统,以提升校园内教学资源的存储管理水平和质量,从而满足校园长期持续发展的教学资源建设需求。研究中还提到了具体的...
总结来说,这个“QT实现基于栈的网页信息检索”项目涵盖了QT GUI设计、网络编程、数据结构(栈的应用)和面向对象编程等多个IT领域的知识。通过这个项目,学习者可以深入理解如何在实际应用场景中结合这些技术,开发...
数据结构,C++实现基于链栈的简单算术表达式求值,本项目的目标是实现一个简单的算术表达式求解器,它能够处理基本的加、减、乘、除运算,并使用链栈数据结构进行求值。设计内容:对带括号的任意算术表达式求值。设计...
通常,这里会有创建顺序栈对象、执行一系列压栈和弹栈操作、打印栈的状态等示例,以验证栈的正确性。通过包含`sequentialstack.h`,主程序可以使用顺序栈类提供的接口。 在C++中,实现顺序栈的效率主要取决于内存...
4. **主函数**:在主函数中创建链表栈对象,并进行压栈、弹栈等操作,以验证栈的正确实现。 ```cpp int main() { LinkedListStack stack; stack.push(1); stack.push(2); stack.push(3); while (!stack....
CanFestival是基于CANopen协议栈的一个开源实现,其源码对于理解CANopen协议以及进行相关开发具有极高的学习价值。 CANopen是CAN(Controller Area Network)网络上的一种应用层协议,由CiA(CAN in Automation)...
本文实例讲述了PHP实现基于栈的后缀表达式求值功能。分享给大家供大家参考,具体如下: 后缀表达式概述 后缀表达式,指的是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右...
在这个主题中,“数据结构 栈的模板类线性表实现”指的是使用C++编程语言设计一个泛型模板类,用于实现栈的功能,基于线性表的概念。线性表是数据结构中最基础的一种,它是由n(n>=0)个相同类型元素构成的有限序列...
Java栈是一种基于后进先出(LIFO)原则的数据结构,它在计算机科学和编程中具有广泛的应用。本文将深入探讨Java中栈的实现以及其在实际应用中的使用。 首先,我们来理解栈的基本概念。栈是一种特殊类型的线性数据...
- 支持栈对象间的深拷贝,确保每个栈对象都拥有独立的数据副本,避免数据共享带来的潜在问题。 5. **遍历操作**: - 提供了`traverse`函数,允许用户定义一个访问函数`visit`,以此来对栈中的每一个元素执行特定...
基于Java技术的一种modbus TCP协议栈的实现 本文对modbus TCP协议栈的实现进行了详细的分析和研究,介绍了基于Java技术的modbus TCP协议栈的构造,并结合了当前工业发展的需要,旨在实现远程监控工业机器与移动互联...
### 基于JSON的对象序列化算法 #### 摘要 随着Web应用程序系统的不断发展,XML作为数据交换格式被广泛采用,特别是在基于Ajax(异步JavaScript和XML)的技术框架下。然而,作为一种结构化的文档,XML在服务器端与...
总的来说,这个工程包展示了C++如何利用模版类实现面向对象的设计,同时通过多态接口来统一管理和测试不同类型的栈。这种设计模式在实际开发中非常常见,尤其是在需要处理不同类型数据的场景下。通过阅读和理解这个...
面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它以对象作为基本单元,强调对象的封装、继承和多态。Java和Python都是面向对象的编程语言,但它们在继承和多态的实现上各有特色,此外,垃圾...
在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 库来开发一个基于栈结构的计算器。MFC 是微软提供的一套C++库,它简化了Windows应用程序的开发,尤其是用户界面部分。栈是一种数据结构,具有...
STM32是一款基于ARM Cortex-M内核的微控制器系列,广泛应用于嵌入式系统设计。下面将详细介绍Bacnet协议栈及其在STM32上的应用和移植。 **Bacnet协议简介** BACnet(Building Automation and Control Networks)是...