初探Object Pascal的类(七)
关于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的类(七)相关推荐
- 初探Object Pascal的类(三)
类的构造函数 Object Pascal中的类有一种特殊的方法叫构造函数. 构造函数是一种用来建立实例类的方法. 构造函数用来初始化任何类成员变量,为类分配所必须的内存,或者做任何其他初始化工作. 在 ...
- 七:Object:常用类
七:Object:常用类 7.1克隆方法clone() 格式: 类名.clone(); protected Object clone() throws CloneNotSupportedExcepti ...
- Delphi的编程语言Object Pascal(3)
1. Object Pascal数据类型 l 数据类型描述了变量和常量的使用情况 l Object Pascal是一种强类型的语言,它可以区分不同的数据类型,而不能 ...
- Object Pascal 中类型
Object Pascal 中类型的一些注意 2010-04-16 14:15 --------------------------------------------------------- 原创 ...
- 浅谈Object Pascal的指针[引用 Nicrosoft]
浅谈Object Pascal的指针 Nicrosoft(nicrosoft@sunistudio.com) -- 2001.8.26 http://www.sunistudio.com/ni ...
- 常用类 (七) ----- 包装类
相关文章: <常用类 (一) ----- Arrays数组工具类> <常用类 (二) ----- Math类> <常用类 (三) ----- BigDecimal和Big ...
- 浅谈Object Pascal的指针
浅谈Object Pascal的指针 作者:Nicrosoft 时间:2001-8-26 来源:Nicrosoft个人网站 大家都认为,C语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上 ...
- Delphi/Object Pascal开源跨平台3D和2D(台式机,移动设备,游戏主机)游戏引擎Castle Game Engine正式发布7.0预览版
Castle Game Engine,是一种用于3D和2D游戏的开源跨平台(台式机,移动设备,游戏机)游戏引擎.我们的目标是创建一个功能强大的游戏引擎,该引擎完全免费且永远开源. 我们支持许多3D和2 ...
- 【2.Delphi语法基础】2.Object Pascal数据类型
2.Object Pascal 数据类型 Object Pascal是一种强类型语言,对数据类型的定义.声明以及数据赋值和传递操作等有严格的语法规则.Object Pascal的数据类型可以分为标准数 ...
- Object Pascal语言
Object Pascal语言 控制串由一个或多个控制字符组成,由"#"开头,后面紧跟一个范围在0-255的无符号的整数,用于代表相应的ASCII字符. 下面再列出一些变量声明的例 ...
最新文章
- The Apply method of function object
- DPDK架构与特点(转)
- Linux常用测试命令
- ASP.NET vs MVC vs WebForms
- linux系统运行pbs出现ntf,Linux系统启动故障修复
- 《HTML5+CSS3网页设计入门必读》——1.13 测验
- devops定义_Coffee Shop DevOps:明确定义和传达团队目标
- JQueryDOM之属性操作
- iOS关于setContentOffset的一些细节问题
- 河南科技大学Oracle作业,机械制图作业集第四章答案河南科技大学.ppt
- aspUpload有组件上传文件
- iphone禁止自动连接wifi操作方法「苹果教程」
- 为什么Rust语言正在兴起
- PC端实现浏览器点击分享到QQ好友,空间,微信,微博等
- uniapp 图片上传与展示
- oracle安装文件拒绝访问,oracle数据库的listener.ora文件拒绝访问,求解决!!!
- 论文阅读:Contextual Translation Embedding for Visual Relationship Detection and SGG(PAMI2020)
- [转]int转string string转int
- 一些基于新闻表示和用户表示的新闻推荐模型总结:NPA/ NAML/ LSTUR/ NRMS
- 机器学习----成本函数
热门文章
- 阻止事件冒泡(event.stopPropagation())/阻止默认事件(event.preventDefault())
- js实现页面滚动,菜单固定
- ExecutorService中submit和execute、Runnable和Callable
- Windows下Cesium Terrain Builder编译 (VS2015)
- Java基础Lambda表达式【四】
- 每日一道剑指offer-两个栈来实现一个队列
- c# 存储图片到oracle,c# winform 读取oracle中blob字段的图片并且显示到pictureBox里 保存进库...
- (day 45 - 中序遍历 ) 剑指 Offer 54. 二叉搜索树的第k大节点
- centos php管理面板,CentOS Web Panle控制面板PHP Version Switcher
- 过拟合和欠拟合_TensorFlow教程-过拟合和欠拟合