一、声明和实例化

  在使用一个对象之前,用class关键字声明一个对象。可以在一个程序或单元的type部分声明一个对象类型:

type
TFooObject = class;

  除了声明一个对象类型,通常还需要一个对象的变量,即实例。实例定义在var部分

var
FooObject; TFooObject;

  在Delphi中通过调用它的一个构造器来建立一个对象的实例,构造器主要是用来为对象创建实例并为对象中的域分配内存进行初始化使得对象处于可使用的状态

  Delphi的对象至少有一个构造器称为create(),但是一个对象可以有多个构造器。根据不同的对象类型,Create()可以有不同的参数

  不像在C++中,在Delphi中构造器不能自动调用,程序员必须自己调用构造器,调用构造器的语法如下

FooObject:= TFooObject.Create;

  注意这里调用构造器的语法有一点特殊,是通过类型来引用一个对象的Create()方法,而不是像其他方法那样通过实例来引用。这看上去有点奇怪,但是很有意义。变量FooObject在调用时还没有被定义,而TFooObject已经静态地存在于内存之中,静态调用它的Create()方法是合法的

  通过调用构造器来创建对象的实例,这就是所谓的实例化

  注意:当一个对象实例用构造器创建的时候,编译器将对对象的每一个域经行初始化,你可以放心地认为所有数字被赋值为0,所有指针赋值为NIL,所有字符串为空

二、析构

  当用完对象,应该调用这个实例的Free()方法来释放它。Free()首选进行检查保证这个对象实例不为NIL,然后调用对象的析构方法Destroy()。自然,析构进行与构造相反的工作,它释放所有分配的空间,并执行一些其他操作以保证对象能够适当地移除内存。语法

FooObject.free;

  不像调用Create(),这里是调用对象实例的Free()方法,记住不要直接调用Destroy(),而调用更安全的Free()方法,因为Free()首选进行检查保证这个对象实例不为NIL,然后调用对象的析构方法Destroy()

  警告:在C++中,一个静态声明的对象在离开它的作用域时自动调用它的析构方法,但是要对动态生成的对象手动调用析构方法。这个规则在Delphi里面也适用,所有使用Create()动态声明创建的对象即使离开创建它时候的作用域,它也不会被自动释放,必须使用Free()方法来动态的析构,除了在Delphi中的隐式动态创建的对象,所以一定要记住这个规则:凡是创建的,都需要释放。这个规则有两个重要的特例

1)当对象被其他对象拥有时,它将替你释放对象。

2)引用技术的对象,当最后一个引用释放时,它将被析构。

  

  你可能要问,这些方法是怎样进到对象中的,不需要为这些方法写代码,对吗?是的,刚才讨论的方法来自于Object Pascal的基类TObject对象。在Object Pascal中所有的对象都是TObject对象的后代,而不管它们是否是这样声明的。因此,下面的声明:

type
TFoo = class;

  相当于声明成

type
TFoo = class(TObject);

  

使用Delphi对象(声明、实例化、构造、释放)的更多相关文章

  1. delphi 中TStringList Clear 方法的时候该对象有没有被释放

    delphi 中TStringList 通过function AddObject(const S: string; AObject: TObject): Integer; 方法添加了一个对象,请问我在 ...

  2. Delphi 对象的创建(create)与释放(free/destory)

    Delphi 对象的创建(create)与释放(free/destory) 1.Create参数为:nil/self/application的区别,最好能看到实际效果的区别 例如: My := TMy ...

  3. 关于PHP面向对象中—类的定义与对象的实例化操作以及构造、析构函数的特殊用法

    类的定义与对象的实例化操作 <?php //类里面的成员是属于对象的class Hero{    public $name;//成员变量    //成员属性(存在于强类型语言中)    prot ...

  4. c# 中基类变量指向派生类对象的实例化

    这一篇文章转载自:http://www.xuebuyuan.com/390279.html 我对这篇文章进行了一一的验证,确实是这样子的,也明白了很多东西,觉得很有用,转载过来希望能够帮助大家. 1. ...

  5. Delphi对象变成Windows控件的前世今生(关键是设置句柄和回调函数)goodx

    ----------------------------------------------------------------------第一步,准备工作:预定义一个全局Win控件变量,以及一个精简 ...

  6. DELPHI语法基础学习笔记-Windows 句柄、回调函数、函数重载等(Delphi中很少需要直接使用句柄,因为句柄藏在窗体、 位图及其他Delphi 对象的内部)

    函数重载重载的思想很简单:编译器允许你用同一名字定义多个函数或过程,只要它们所带的参数不同.实际上,编译器是通过检测参数来确定需要调用的例程.下面是从VCL 的数学单元(Math Unit)中摘录的一 ...

  7. 教程-TObjectList.Clear、TStringList.Clear方法对象有没有被释放

    相关资料: http://www.cnblogs.com/rogge7/p/4631796.html delphiTStringList通过AddObject方法添加对象. object里存的只是指向 ...

  8. java对象的实例化过程

    简单类对象的实例化过程 1.在方法区加载类: 2.在栈内存申请空间,声明变量P: 3.在堆内存中开辟空间,分配对象地址: 4.在对象空间中,对对象的属性进行默认初始化,类成员变量显示初始化: 5.构造 ...

  9. ArrayList对象声明& arrayList.size()

    此程序用于测试 :每次for循环内重新定义一个Integer数组,赋值后加入arrayList.由于下一次的Integer对象重新定义,原来的对象是否会被释放? 解答:不会,因为原对象仍被引用(被ar ...

  10. 【JVM第六篇--对象】对象的实例化、内存布局和访问定位

    写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.对象的实例化 在平常写代码的过程中,我们用class关键字定义的类只是一个类的模 ...

随机推荐

  1. opencv图像操作

      cvAbs 计算数组中所有元素的绝对值 cvAbsDiff 计算两个数组差值的绝对值 cvAbsDiffs 计算数组和标量差值的绝对值 cvAdd 两个数组的元素级的加运算 cvAdds 一个数组 ...

  2. OpenCV中对图像进行二值化的关键函数——cvThreshold()。

    函数功能:采用Canny方法对图像进行边缘检测 函数原型: void cvThreshold( const CvArr* src, CvArr* dst, double threshold, doub ...

  3. PHP中九大缓存技术总结

    PHP缓存包括PHP编译缓存和PHP数据缓存两种.PHP是一种解释型语言,属于边编译边运行的那种.这种运行模式的优点是程序修改很方便,但是运行效率却很低下.PHP编译缓存针对这种情况做改进处理,使得P ...

  4. Android碎片(Fragment)简述

    碎片(Fragment)是一种可以嵌入活动当中的UI片段,它能让程序更加合理和充分地利用大屏幕的空间,因此碎片在平板上的应用非常广泛. 你可以将碎片理解成一个迷你型的活动,水平同样可能包含布局,同样都 ...

  5. Delphi实现窗体内嵌其他应用程序窗体

    实现原理是启动一个应用程序,通过ProcessID得到窗体句柄,然后对其设定父窗体句柄为本程序某控件句柄(本例是窗体内一个Panel的句柄),这样就达成了内嵌的效果. 本文实现的是内嵌一个记事本程序, ...

  6. COGS 2437 暗之链锁 II 题解

    [题意] 给出一个有n个点的无向图,其中有n-1条主要边且这些主要边构成一棵树,此外还有m条其他边,求斩断原图的一条主要边和k条其他边使得图不连通的方案数mod109+7的值. 注意,就算你切断一条主 ...

  7. Junit 测试 Spring

    在测试类上加上@RunWith,和@ContextConfiguration @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration ...

  8. bootstrap框架-----可见 隐藏

    可见框架-像素选择 -block-inline  :块内联元素 -inline-block将对象呈递为内联对象,但是对象的内容作为块对象呈递.旁边的内联对象会被呈递在同一行内,允许空格 可以设置宽度和 ...

  9. 基础知识《七》---Java多线程详解

  10. JQ引用

    <script type="text/javascript" src="http://files.cnblogs.com/914556495wxkj/jquery- ...