关于Self

所有的类都有一个隐含的字段叫Self,在内存中Self是一个指向类实例的指针

首先我们来看看,如果Self不是隐含字段的话,那么TMyRec类到底是一个什么样子:

  TMyRect = classprivateSelf: TMyRect; { Self隐含字段}Left: Integer;Top: Integer;Right: Integer;Bottom: Integer;Text: PChar; publicfunction GetWidth: Integer;function GetHeight: Integer;procedure SetRect(ALeft, ATop, ARight, ABottom: Integer);constructor Create;  constructor CreateVal(ALeft, ATop, ARight, ABottom: Integer);destructor Destroy; override; end;

对于编译器来说,这就是实际TMyRect类的样子。当类对象建立时,Self指针会自动初始化为内存中类的地址:

  Rect1 := TMyRect.CreateVal(100, 100, 500, 500);{ 现在Rect1和Rect1.Self具有相同的值,因为两者都包含对象在内存中的地址}

Self到底是什么意思?

记住每个类实例都会得到各自的类字段拷贝,但所有类实例享有类的相同方法集(没有必要为每个实例都复制代码),这样编译器怎么识别哪个实例调用哪个方法呢?所有类方法都有一个隐含Self参数,为了声明这一点,假设有一个TMyRect类的函数叫GetWidth,其表现如下:

function TMyRect.GetWidth: Integer;
beginResult := Right - Left;
end;

对大家来说,这个就是这个样子的,但是对于编译器来说,其表现形式应如下:

function TMyRect.GetWidth: Integer;
beginResult := Self.Right - Self.Left;
end;

看来Self是在幕后工作的,我们不必担心其是怎样发生的只要只奥它发生了就行。

Caution

绝不要修改Self指针,可以用它把一个指向类的指针传送给其他方法,或者作为构造其他类的参数,但不要改变它的值,要学会把Self当作一个只读变量。

Note

前面讨论过类方法(class method)不能存取类字段,这正是因为类方法没有一个隐含的Self参数,而普通的方法可以存取类字段。如果没有Self,普通方法就不能存取类字段。

现在还不要太担心怎样使用Self,当开始使用VCL时,就需要在Delphi应用程序中用Self,这样很快就会明白它的用法。

转载于:https://www.cnblogs.com/pchmonster/archive/2011/12/30/2306880.html

初探Object Pascal的类(七)相关推荐

  1. 初探Object Pascal的类(三)

    类的构造函数 Object Pascal中的类有一种特殊的方法叫构造函数. 构造函数是一种用来建立实例类的方法. 构造函数用来初始化任何类成员变量,为类分配所必须的内存,或者做任何其他初始化工作. 在 ...

  2. 七:Object:常用类

    七:Object:常用类 7.1克隆方法clone() 格式: 类名.clone(); protected Object clone() throws CloneNotSupportedExcepti ...

  3. Delphi的编程语言Object Pascal(3)

    1. Object Pascal数据类型 l          数据类型描述了变量和常量的使用情况 l          Object Pascal是一种强类型的语言,它可以区分不同的数据类型,而不能 ...

  4. Object Pascal 中类型

    Object Pascal 中类型的一些注意 2010-04-16 14:15 --------------------------------------------------------- 原创 ...

  5. 浅谈Object Pascal的指针[引用 Nicrosoft]

    浅谈Object Pascal的指针 Nicrosoft(nicrosoft@sunistudio.com) -- 2001.8.26     http://www.sunistudio.com/ni ...

  6. 常用类 (七) ----- 包装类

    相关文章: <常用类 (一) ----- Arrays数组工具类> <常用类 (二) ----- Math类> <常用类 (三) ----- BigDecimal和Big ...

  7. 浅谈Object Pascal的指针

    浅谈Object Pascal的指针 作者:Nicrosoft 时间:2001-8-26 来源:Nicrosoft个人网站 大家都认为,C语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上 ...

  8. Delphi/Object Pascal开源跨平台3D和2D(台式机,移动设备,游戏主机)游戏引擎Castle Game Engine正式发布7.0预览版

    Castle Game Engine,是一种用于3D和2D游戏的开源跨平台(台式机,移动设备,游戏机)游戏引擎.我们的目标是创建一个功能强大的游戏引擎,该引擎完全免费且永远开源. 我们支持许多3D和2 ...

  9. 【2.Delphi语法基础】2.Object Pascal数据类型

    2.Object Pascal 数据类型 Object Pascal是一种强类型语言,对数据类型的定义.声明以及数据赋值和传递操作等有严格的语法规则.Object Pascal的数据类型可以分为标准数 ...

  10. Object Pascal语言

    Object Pascal语言 控制串由一个或多个控制字符组成,由"#"开头,后面紧跟一个范围在0-255的无符号的整数,用于代表相应的ASCII字符. 下面再列出一些变量声明的例 ...

最新文章

  1. The Apply method of function object
  2. DPDK架构与特点(转)
  3. Linux常用测试命令
  4. ASP.NET vs MVC vs WebForms
  5. linux系统运行pbs出现ntf,Linux系统启动故障修复
  6. 《HTML5+CSS3网页设计入门必读》——1.13 测验
  7. devops定义_Coffee Shop DevOps:明确定义和传达团队目标
  8. JQueryDOM之属性操作
  9. iOS关于setContentOffset的一些细节问题
  10. 河南科技大学Oracle作业,机械制图作业集第四章答案河南科技大学.ppt
  11. aspUpload有组件上传文件
  12. iphone禁止自动连接wifi操作方法「苹果教程」
  13. 为什么Rust语言正在兴起
  14. PC端实现浏览器点击分享到QQ好友,空间,微信,微博等
  15. uniapp 图片上传与展示
  16. oracle安装文件拒绝访问,oracle数据库的listener.ora文件拒绝访问,求解决!!!
  17. 论文阅读:Contextual Translation Embedding for Visual Relationship Detection and SGG(PAMI2020)
  18. [转]int转string string转int
  19. 一些基于新闻表示和用户表示的新闻推荐模型总结:NPA/ NAML/ LSTUR/ NRMS
  20. 机器学习----成本函数

热门文章

  1. 阻止事件冒泡(event.stopPropagation())/阻止默认事件(event.preventDefault())
  2. js实现页面滚动,菜单固定
  3. ExecutorService中submit和execute、Runnable和Callable
  4. Windows下Cesium Terrain Builder编译 (VS2015)
  5. Java基础Lambda表达式【四】
  6. 每日一道剑指offer-两个栈来实现一个队列
  7. c# 存储图片到oracle,c# winform 读取oracle中blob字段的图片并且显示到pictureBox里 保存进库...
  8. (day 45 - 中序遍历 ) 剑指 Offer 54. 二叉搜索树的第k大节点
  9. centos php管理面板,CentOS Web Panle控制面板PHP Version Switcher
  10. 过拟合和欠拟合_TensorFlow教程-过拟合和欠拟合