• 谈谈Delphi中的类和对象1---介绍几个概念 && 对象是一个地地道道的指针


    参考:http://blog.163.com/liang_liu99/blog/static/88415216200952123412180/

    以下的介绍主要针对的是Delphi的面向对象的知识,可能和C++、Java、PHP……其他面向对象的编程语言有一些出入 

    一、介绍几个概念

      说到类和对象,我们不能不提及这样几个概念:类、对象、实例。谈谈“我”的简单理解

      对象指的是泛称,自然界的任何实体都可以看成是一个对象

      类是以这些对象某些特征而分成的一系列的种类

      实例则是特质属于某一个类的一个对象

      例子:

    var
        ABtn: TButton;
    

      ABtn是属于TButton类的一个对象,但是ABtn不能输是一个实例,因为它还没有创建,所以我么说这是定义了一个对象,如果说定义了一个实例,多多少少有一些不够确切

      要想创建一个实例(也就是在内存中实际创建一个存在的类的实例),参见

    var
        ABtn: TButton;    //这并没有创建一个类的实例
    begin
        ABtn:= TButton.Create(Self);    //这才是创建了一个实例,这才真正在内存中存在
        ABtn.Caption:= 'Button';
        ABtn.Free;    //这是将创建的实例释放(Free先判断这个对象实例ABtn是否为NIL,再决定是不是调用析构方法Destroy)
    end;
    

      

    二、对象变量是一个地地道道的指针

      从物理角度看,对象就是一段地址空间,这段地址空间的标志就是我们定义的类“变量”。所以我们可以把对象变量看成是一个类的指针(指向内存中的真正的对象实体或者为nil)。

      大家也知道,要想访问一个指针,必须要对指针初始化。对象既然是一个指针,也必须对它进行初始化。

      如何对对象初始化呢?还是先看看指针的初始化吧。对于一个指针可以有以下两种方法进行初始化

    1)直接分配

    var
        Pint: ^Integer;
    begin
        New(Pint);
        Pint^ := 12;    
        DisPose(Pint);
    end;
    

    2)指向别的已分配空间的变量

    var
        Pint: ^integer;
        i: Integer;
    begin
        i:= 12;
        Pint:= @i;
    end;
    

      有趣的是,对象这种“指针”也有两种方法初始化

    1)直接分配

    var
        AForm: TForm;
    begin
        AForm:= TForm.Create(Self);
        AForm.ShowModal;
        AForm.Free;
    end;
    

    2)指向别的已经分配空间的实例

    var
        AForm: TForm;
    begin
        AForm:= Self;
        AForm.Caption:='???';
    end;
    

      上面这段代码,AForm和它所指向的Form实例共用同一段地址单元,所有对AForm的操作都将反映到它所对应的Form实例之上

      说到这里,我们就能很好的解释为什么过程(函数)的对象参数传递时候,有这样的格式

    procedure SetEdit(var Edit: TEdit);
    begin
        Edit.Text:= '11';
    end;
    

      和

    procedure SetEdit(Edit: TEdit);
    begin
        Edit.Text:='11';
    end;
    

      这两种方式从最终的效果上来看是一样的。第一种是吧TEdit作为参数引用的形式进行参数传递,第二种是把一个TEdit的对象‘指针’作为参数传递

  • 相关阅读:
    泛型
    HDU 4917 Permutation
    OC本学习笔记Foundation框架NSString与NSMutableString
    HDU 5095 Linearization of the kernel functions in SVM(模拟)
    大约Java有点感悟---开发商根本上感悟学习
    Codeforces 442B Andrey and Problem(贪婪)
    mysql数据库优化课程---15、mysql优化步骤(mysql中最常用最立竿见影的优化是什么)
    mysql数据库优化课程---14、常用的sql技巧
    mysql数据库优化课程---13、mysql基础操作(mysql如何复制表)
    mysql数据库优化课程---12、mysql嵌套和链接查询(查询user表中存在的所有班级的信息?)
  • 原文地址:https://www.cnblogs.com/xumenger/p/4437231.html
Copyright © 2020-2023  润新知