自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(104)
  • 资源 (8)
  • 收藏
  • 关注

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第10章第1节(属性实现了封装)

然而,鉴于用户将通过属性访问数据,类开发人员随时可以更改底层数据类型并引入getter和setter,而不会影响使用它的代码。另一方面,这展示了Object Pascal的务实一面,它允许程序员在适当的情况下选择更简单的方式(以及更快的代码执行),以及在需要时平稳过渡到"真正的面向对象编程"方式。同时,如果你只想允许用户访问类的某些字段,你可以轻松地将这些字段以属性形式发布,而不是将它们设置为public。然后,即使你用方法访问取代了直接的数据访问,你也根本不需要更改使用这些属性的源代码。

2024-04-20 06:00:00 50

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第10章第1节( 对比其他编程语言中的属性)

​ 尽管我不想深入讨论不同编程语言中属性的相对优点,但正如我在本章引言中提到的,我认为明确定义属性是一个有用的概念,而不需要一个额外的方法就将属性映射到某个字段,从而获得一个更进一步的抽象层次也是一个非常不错的补充。​ 如果你将这与Java或C#进行比较,在这两种语言中,属性都映射到方法,但是Java中是一种隐式的映射(属性基本上是一种约定),而不是显式的编程元素。与Java类似,C#属性也映射到相应的getter和setter方法,但属性是明确定义的编程元素。

2024-04-19 06:00:00 57

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第10章第1节(定义属性)

​ 什么是属性?属性可以被描述为标识符,它们允许您访问和修改对象的状态,可能会触发在幕后执行的代码。在Object Pascal中,属性通过字段或方法抽象和隐藏数据访问,使其成为封装的主要实现方式。可以用一种方式来描述属性,那就是"最大程度的封装"。​ 从技术上讲,属性是一个带有数据类型的标识符,通过read和write说明符映射到某些实际数据。

2024-04-18 06:00:00 327

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第9章第6节(拦截异常)

​ 该方法的作用是记录一些异常信息、修改异常消息,然后调用基类的标准处理方法(嵌套异常机制的运行需要)。事实上,通过重载该方法,我们就有了一个单一的后创建函数,无论使用哪个构造函数创建异常,该函数都会被调用。换句话说,你可以避免为异常类定义自定义构造函数,而是让用户调用基本异常类多个构造函数中的一个,并仍然拥有自定义行为。​ 异常类中的函数实现管理着内部异常(通过调用内部的 SetInnerException),这也许解释了为什么要在引入内部异常机制的同时引入该函数。该虚函数将在异常即将发生前被调用。

2024-04-17 06:00:00 316

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第8章第4节(继承和类型兼容性)

是一种严格类型的语言,这意味着值必须是相同的数据类型,操作才有效。如果你声明了一个类(如 TAnimal),并派生了一个新类(如 TDog),你就可以将 TDog 类型的对象赋值给 TAnimal 类型的变量。​ 如图 8.2 所示,该示例的窗体有两个单选按钮(由面板托管),用于选择一个或另一个类的对象。然而,继承的真正威力在于它能以统一的方式处理不同类的对象,这在面向对象编程语言中通常被称为多态性(polymorphism)或延迟绑定(late binding)。然而,反过来是不合法的;

2024-04-16 22:01:47 340

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第9章第6节(嵌套异常和 InnerException机制)

在异常处理程序中,您可以创建并引发一个新的异常,同时仍然保持当前异常对象的活动状态,并将其连接到新的异常。其次,虽然新异常的消息只包含实际消息,但通过调用 ToString,可以访问所有嵌套异常的合并消息,并用 sLineBreak 分隔(如 Exception.ToString 方法的代码所示)。​ 从用户的角度来看,要在保留现有异常的同时引发异常,应调用 RaiseOuterException 类方法(或相同的 ThrowOuterException 方法,后者使用面向 C++ 的命名)。

2024-04-16 06:00:00 719

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第9章第5节(异常与构造函数)

同样,如果在构造函数中颠倒顺序(先创建字符串列表,后引发异常),一切都能正常工作,因为析构函数确实需要释放字符串列表。​ 这一点很重要,因为它意味着一个部分初始化的对象可能会被调用析构函数。如果想当然地认为内部对象存在于析构函数中,因为它们是在构造函数中创建的,那么在出现实际错误时,可能会陷入一些危险的境地(即在第一个异常处理完毕之前引发另一个异常)。当运行这段代码时,异常会在构造函数中出现,发生在创建字符串列表之前,系统会立即调用析构函数,试图清除不存在的列表,从而引发访问违规或类似错误。

2024-04-15 06:00:00 240

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第9章第4节(全局异常处理)

这确实是控制台应用程序或其他特殊用途代码结构的情况,而大多数可视化应用程序(包括基于 VCL 或 FireMonkey 库的应用程序)都有一个全局消息处理循环,它将每次执行都包裹在一个 try-except 块中,这样如果在事件处理器中引发异常,就会被捕获。:请注意,如果在激活消息循环之前启动代码中出现异常,异常通常不会被库捕获,程序将以错误结束。​ 在执行过程中出现异常的一般情况下,会发生什么取决于库,但一般都有一种编程方式,可以用全局处理器拦截这些异常,或者有一种显示错误信息的方式。

2024-04-14 06:00:00 270

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第9章第3节( 真实世界中的异常处理)

​ 相反,在日常代码中极为重要和常见的是使用finally代码块来保护异常发生时的资源。最后,finally 语句能让程序在出现异常时保持稳定,允许用户继续使用或(在出现更严重问题时)有序关闭应用程序。​ 例如,如果对一个文件名不确定,一般认为在打开文件前检查文件是否存在比使用异常处理文件缺失的情况要好。不过,在向文件写入内容之前检查磁盘空间是否足够,这种检查在所有地方都做意义不大,因为这种情况极为罕见。​ 一种说法是,程序应该检查常见的错误条件,而把不常见和意外的错误留给异常处理机制。

2024-04-13 06:00:00 179

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第9章第2节(finally代码块)

​ 要保护资源分配或定义要还原的临时配置,可以使用托管记录来代替显式的 try-finally 块,这需要编译器添加一个固有的 finally 块。这样,即使在定义记录时需要付出一些初始努力,保护资源或恢复配置的代码编写量也会减少。​ 需要还原的临时配置设置的一个例子是沙漏光标,它在长时间操作中显示,并在操作结束后还原为原来的光标。​ 由于算法中存在错误(因为变量 I 的值可以达到 0,而且还用于除法),程序会中断,但不会重置窗体标题。​ 当程序执行该函数时,无论是否出现(任何类型的)异常,都会重置游标。

2024-04-12 06:00:00 267

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第9章第1节(引发异常)

由于处理异常的代码位置与异常发生的代码位置不同,因此最好能知道异常究竟是在哪个方法中发生的。虽然有一些方法可以在异常发生时获得堆栈跟踪,并在处理程序中提供该信息,但这确实是一个高级话题,我不打算在这里介绍。​ 在 Object Pascal 编程中遇到的大多数异常都是由系统生成的,但当你在运行时发现无效或不一致的数据时,你也可以在自己的代码中引发异常。​ 在大多数情况下,对于自定义异常,你需要定义自己的异常类型。​ 在大多数情况下,不需要为新的异常类增加任何方法或字段,声明一个空的派生类就足够了。

2024-04-11 06:00:00 296

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第9章第1节(异常类的层次结构)

​ 现在,您已经看到了核心异常类的层次结构,我可以在前面关于 Except-on 语句的描述中补充一条信息:这些语句将依次进行评估,直到系统找到与异常对象类型相匹配的异常类为止。如果你希望在处理更细粒度的异常(层次结构中的低级类)的同时,也能处理更通用的异常,以防前面的异常都不匹配,那么你就必须从更具体的异常到更通用的异常(或者从子异常类到父类)列出处理程序块。:我不知道你是怎么想的,但我仍然需要弄清楚我认为最奇怪的异常类–有趣的 EProgrammerNotFound 异常—的确切使用场景!

2024-04-10 06:00:00 238

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第9章第1节(Try-Except块)

当然,这通常是你想要的,因为你想知道异常发生的位置,并逐步查看处理程序的调用过程。如果出现错误,试图处理错误条件并返回到导致错误的语句是非常危险的,因为此时程序的状态很可能是未定义的。​ 像上面的代码那样 "沉默 "异常并将结果设置为零,在实际应用中并没有太大意义(因为向用户掩盖这样的错误通常是不好的做法),但这段代码的目的是帮助你理解简单场景中的核心机制。​ 正如您所看到的,程序使用随机生成的值,因此当您点击按钮时,您可能处于有效状态(3 次中的 2 次),也可能处于无效状态。

2024-04-09 06:00:00 761

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第9章(异常处理)

否则,异常就会传递给它的调用代码,如此循环。最后,如果你的代码中没有任何部分处理异常,系统一般会通过显示标准错误信息并尝试继续运行程序来处理异常。如果你的代码是在任何异常处理块之外执行的,那么引发异常将导致程序终止,这种情况不太常见。​ 异常处理的理念是以一种简单、统一的方式添加处理软件或硬件错误(以及任何其他类型的错误)的功能,使程序更加健壮。这在 Object Pascal 中也是一样的,你向 raise 语句传递一个异常对象,你接收它作为 except on 语句的参数。

2024-04-08 06:00:00 419

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第8章第7节(可视化窗体继承)

如果它有许多窗体,其中有些窗体彼此非常相似,或者只是包含了共同的元素,那么你就可以将共同的组件和共同的事件处理程序放在基本窗体中,然后将特定的行为和组件添加到子类中。在这里可以选择要继承的窗体。通过这个示例,你可以探索可视化窗体继承的一些特性,但要想看到它的真正威力,你还需要研究更复杂的实际示例,而本书没有足够的空间来进行探索。​ 但鲜为人知的是,即使是经验丰富的开发人员,也可以从已创建的窗体继承一个新窗体,这种功能通常被称为可视化窗体继承(这也是 Object Pascal 开发环境所特有的)。

2024-04-07 06:00:00 542

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第8章第6节(安全类型转换运算符)

通过显式类型转换,我们可能会导致令人讨厌的运行时错误(或者更糟糕的是,出现微妙的内存覆盖问题),因为编译器无法确定对象的类型是否正确,以及我们调用的方法是否确实存在。:使用类型转换操作符会对性能产生轻微的负面影响,因为它必须遍历类的层次结构,以查看类型转换是否正确。​ 正如我们之前所见,子类的语言类型兼容性规则允许你在期望祖先类的地方使用子类。转换的区别在于,后者会检查对象的实际类型,并在类型与试图转换的类型不兼容时引发异常。运算符的参数是一个对象和一个类类型,结果是一个“转换”为新的类类型的对象。

2024-04-06 06:00:00 398

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)

final方法是虚方法,您在继承类中无法进一步覆盖。同样,虽然它们在 Java 中是有意义的(在 Java 中,所有方法默认都是虚方法,而final方法得到了显著优化),但在 C# 中却被采用了,因为在 C# 中,虚函数是显式标记的,其重要性要低得多。最初的目标之一也是为了提高运行时的安全性,这在完全编译的语言(如 Object Pascal)中一般是不需要的。因此,Java 语言引入了一些概念,如不能继承的类(封闭类)和不能在派生类中覆盖的方法(final方法或非虚拟方法)。

2024-04-05 06:00:00 233

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(抽象方法)

在 TAnimal 类中添加虚方法定义是解决问题的典型方案,因为所有动物都吃东西,而且abstract关键字的存在也有利于这种选择。上面的代码看起来很丑陋,而避免这样的代码正是使用多态性的原因,而且在这种情况下,它也代表了我们的实现所模拟的真实世界。同样,在 Object Pascal 中,这不会阻止你创建该类的实例,所以在这种语言中,抽象类声明的用处相当有限。中,您可以创建具有抽象方法的类的实例。​ 除非父类至少具有此方法的声明(以抽象方法的形式),否则无法调用由子类提供的方法。原因在于多态性的运用。

2024-04-04 06:00:00 366

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第8章第4节(虚方法与动态方法)

在其他语言(如C++、C#或Java)中,对基类构造函数的调用是隐式和强制性的(当必须向基类构造函数传递参数时),而在Object Pascal中,调用基类构造函数并不是强制性的。在调用虚方法时,编译器会生成代码,跳转到存储在对象虚方法表第 n 个槽中的地址。​ 玩笑归玩笑,这两种方法都有很好的理由,但特别是对于语言初学者来说,我建议始终调用基类构造函数,这是一种良好的编程习惯,能促进更安全的编码。在解释了这两种模式的区别后,有必要强调的是,在大多数情况下,应用程序开发人员使用的是虚方法而不是动态方法。

2024-04-03 06:00:00 935

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第8章第4节(覆盖、重新定义和重新引入方法)

​ 正如我们刚才所看到的,要在子类中覆盖一个延迟绑定的方法,需要使用override关键字。只有当该方法在祖先类中被定义为虚方法时,才能进行重载。如果该方法被定义为动态(dynamic)方法(我们稍后将介绍另一个关键字),也可以覆盖该方法。否则,如果该方法未被标记为virtual或dynamic,,则会被视为静态方法,除了修改祖先类的代码外,不能使用延迟绑定对其进行修改。

2024-04-02 06:00:00 371

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第8章第4节(延迟绑定和多态性)

在新版本中,TAnimal 和 TDog 类都有一个新方法: Voice(声音),它可以输出所选动物发出的声音,既可以是文本,也可以是声音。现在你可以将此方法应用于一个通用变量,如 FMyAnimal,该变量在运行时可以引用 TAnimal 类的一个对象,也可以引用 TDog 类的一个对象。​ 调用 FMyAnimal.Voice 将对 TAnimal 类的任何子类的实例对象有效,即使是在此方法调用后定义的或在其作用域之外的类。你可以使用层次结构中的类编写代码,而不需要知道该层次结构中的具体类。

2024-04-01 07:00:00 329

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第8章第4节(继承和类型兼容性)

是一种严格类型的语言,这意味着值必须是相同的数据类型,操作才有效。如果你声明了一个类(如 TAnimal),并派生了一个新类(如 TDog),你就可以将 TDog 类型的对象赋值给 TAnimal 类型的变量。​ 如图 8.2 所示,该示例的窗体有两个单选按钮(由面板托管),用于选择一个或另一个类的对象。然而,继承的真正威力在于它能以统一的方式处理不同类的对象,这在面向对象编程语言中通常被称为多态性(polymorphism)或延迟绑定(late binding)。然而,反过来是不合法的;

2024-03-31 06:00:00 335

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第8章第3节(保护字段和封装)

然而,这违反了封装的理念。​ 鉴于单元保护的工作原理,除非使用strict protected 关键字,否则即使是当前单元中声明的类的基类的受保护成员也可以被直接访问。同样,原因是 TTestAccess 类自动继承了 TTest 基类的受保护字段,而且由于 TTestAccess 类与试图访问继承字段中数据的代码位于同一单元,因此受保护的数据是可访问的。​ 请记住,protected字段与private字段具有相同的访问规则,因此同一单元中的任何其他类都可以访问其他类的protected成员。

2024-03-30 06:00:00 1498

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)

​ 在这种情况下,你的类继承自一个名为 TObject 的基类。换句话说,Object Pascal 有一个单根类层次结构,其中所有的类都直接或间接地继承自一个共同的祖先类。关于这个基本类(既可视为语言的一部分,也可视为运行时库的一部分)的完整描述及其所有方法的参考资料,请参阅第 17 章。:一个共同祖先类的概念在 C# 和 Java 语言中也存在,在这两种语言中,共同祖先类的名字简称为Object。而 C++ 语言则没有这样的概念,一个 C++ 程序通常有多个独立的类层次结构。

2024-03-29 06:00:00 203

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第8章第1节(继承)

​ 如果一个类有两个相似的版本,一种典型的老式方法是复制原始类型定义,修改代码以支持新特性,然后给生成的类取一个新名字。​ 作为演示继承的一个简单示例,我们可以对上一章的 ViewDate 示例稍作修改,从 TDate 派生一个新类,并修改其中的一个函数 GetText。此外,如果该类最初是由其他人编写的(而你是从库中找到的),你可能希望将自己的修改分开。​ 诚然,继承是一种非常强的约束,会导致代码的紧密耦合,这是现在不推荐的做法,但继承也为开发人员提供了巨大的能力(是的,同时也带来了更多的责任)。

2024-03-28 06:00:00 779

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第7章第6节( 嵌套类型和嵌套常量)

语言中使用嵌套类有什么好处?但如果内部类在单元的接口部分被引用(例如,因为它被用于一个字段或例程的参数),则必须在相同的接口部分声明,并最终可见。​ 嵌套类可以直接在类中使用(如列表中所示),也可以在类外使用(如果在公共部分声明),但必须使用全称 TOne.TInside。类的全名也会在嵌套类方法的定义中使用,在本例中就是 TOne.TInside。​ 一个相关的语法是允许您定义一个嵌套常量,即与类关联的常量值(如果是private,则仅在内部可用,如果为public,则可由程序的其它部分使用)。

2024-03-27 06:00:00 205

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第7章第5节(完整的TDate类)

​ 在这种特殊情况下,创建一个新对象并销毁现有对象并不是最好的方法,因为当我们只需要更改对象的值时,这样做会产生大量的开销。当你将一个对象赋值给另一个对象时,编译器会简单地将内存中的对象引用复制到新的对象引用中。具体的Date对象在窗体创建时创建(建立了我们之前看到的在person类和Date子对象之间相同的关系),然后随着窗体一起被销毁。这个窗体比书中的其他窗体要复杂一些,它有一个显示日期的标题和六个按钮,可以用来修改对象的值。​ 我们已经在前面的章节中看到了大部分的方法,所以我就不提供完整的列表了;

2024-03-26 06:00:00 446

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第7章第5节(构造函数和析构函数)

还要注意的是,在方法声明中使用了 override,但在方法实现代码中没有使用。:从历史上看,C++专门增加了重载功能,以允许使用多个构造函数,因为构造函数必须具有相同的名称(类的名称)。在Object Pascal中,这个功能可能被认为是不必要的,仅仅是因为多个构造函数可以有不同的具体名称,但重载还是被添加到了语言中,因为它在许多其他场景中也很有用。​ 在这一简单步骤之后,我为该类添加了两个单独的Create构造函数,一个没有参数,它隐藏了默认构造函数,另一个带有初始化值。这是使用析构函数最常见的情况。

2024-03-25 06:00:00 281

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第7章第5节(构造函数)

​ 一般情况下,虽然构造函数可以使用任何名称,但请记住,如果您使用的名称不是 Create,那么基类 TObject 类的 Create 构造函数仍然可用。通过定义一个带有某些参数(或不带参数,如上例)的 Create 构造函数,你就可以用一个新的构造函数替换默认定义,并强制使用它。在 OOP 语言中,构造函数还可以是虚构造函数,这是该语言的另一个非常特殊的功能。​ 与默认的Create构造函数不同,默认的Destroy析构函数是虚函数的,强烈建议开发人员覆盖这个虚析构函数(虚方法在下一章中介绍)。

2024-03-24 10:49:20 429

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第7章第4节(Self 标识符)

​ 如图 7.2 所示,这段代码的作用是在鼠标点击的位置创建按钮,并用标题标明具体位置(在本项目中,我禁用了 FMX 移动预览,以显示本地风格的 Windows 按钮,因为这样更清晰)。​ 一个典型的例子是在运行时创建一个组件,在这种情况下,你必须将组件的所有者传给它的 Create 构造函数,并将相同的值赋给它的 Parent 属性。​ 当您创建同一类的多个对象时,这个额外的隐藏参数是必需的,以便每次将方法应用于其中一个对象时,该方法将仅操作该特定对象的数据,而不影响同一类的其他对象。

2024-03-23 06:00:00 1442

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)

另一方面,当你更改类字段的表示方法时,只需要修改该类中引用给定字段的某些方法的代码,而不需要修改其他代码。首先,数据(NClicks)不与窗体的特定实例相关联,而是与整个程序关联。​ 第二个问题是,如果将数据定义为全局变量或窗体的公共字段,那么将来就无法在不影响使用数据的代码的情况下修改其实现。该项目的窗体还有两个按钮,一个用于创建相同类型的新窗体,另一个用于关闭它(这样你可以将焦点返回到以前的窗体)。简而言之,此项目的窗体有两个按钮和顶部的标签,大部分表面留给用户点击(或轻点)。

2024-03-22 06:00:00 334

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(private访问说明符)

这些函数只需返回相应的私有数据,但并不总是需要类似的直接数据访问函数。只有当访问函数是类的逻辑接口的一部分时,才应该提供访问函数,而不是因为有匹配的字段。​ 第二个新方法是Increase过程,它将日期增加一天。为了简化编码,我将更改类的内部实现,使用。:在这个新版本的类中,字段的标识符以字母 "F "开头。​ 请注意,由于对类的唯一更改在类的私有部分,因此你不必修改任何已使用该类的现有程序。请注意,你的输出可能有所不同,因为日期的格式根据系统的语言环境设置而变化。,它是一个返回包含日期的字符串的函数。

2024-03-21 06:00:00 302

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(访问说明符)

但是,为了实现良好的面向对象方法,数据应隐藏或封装在使用它的类中。使用方法访问对象的内部表示可以限制产生错误情况的风险,因为方法可以检查日期是否有效,如果无效,则拒绝修改新值。然而,当你使用对象时,它们的大部分代码都是隐藏的。​ 作为一条通用规则,您应尽量避免使用public字段,而应提供一些使用属性直接访问数据的方法,我们将在第 10 章中详细介绍。访问说明符表示在类的任何方法(包括同一单元中其他类的方法)之外都不能访问的字段和方法,这与大多数其他 OOP 语言中 private 关键字的行为一致。

2024-03-20 06:00:00 1452

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第7章第2节( 对象引用模型 )

​ 如前所述,变量可以引用某个类的对象。但变量可能还没有初始化,或者曾经引用的对象可能已经不可用了。这时可以使用 nil。这是一个常量值,表示变量没有引用任何对象。其他编程语言使用符号 null 来表达相同的概念。​ 切勿错误地将 nil 赋值给对象,从而将其从内存中删除。将对象引用设置为 nil 和释放它是两种不同的操作。因此,通常需要同时释放一个对象并将其引用设置为 nil,或者调用一个同时执行这两种操作的特殊过程,称为 FreeAndNil。

2024-03-19 06:00:00 824

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第7章第1节(创建对象 )

在大多数基于 C 语言语法的编程语言中,调用不带参数的方法需要使用括号,如 ADay.LeapYear()。这与许多语言中的做法大相径庭,在许多语言中,对函数或方法的引用不带括号,返回的是函数地址。正如我们在第 4 章 "过程类型 "一节中所看到的,Object Pascal 使用相同的符号来调用函数或读取其地址,这取决于表达式的上下文。我们可以编写一个复杂的函数(比如LeapYear),然后访问每个TDate对象的值,就像这个类型是原始数据类型一样。用于访问属性的表示法也是相同的。

2024-03-18 08:00:00 148

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第7章第2节(释放对象 )

​ 在使用对象引用模型的语言中,您需要一种方法在使用对象之前创建该对象,同时还需要一种方法在不再需要该对象时释放其占用的内存。​ 在 Object Pascal 中,一般通过调用对象特殊的 Free 方法(同样是 TObject 的方法,在每个类中都可用)来释放对象的内存。在调用对象的析构函数(可能有特殊的清理代码)后,Free 会将对象从内存中删除。​ 虽然这是标准的做法,但组件库还增加了像对象所有权这样的概念,大大减少了手动内存管理的影响,使这一问题的处理相对简单。使这个问题的处理相对简单。

2024-03-17 06:00:00 166

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第7章第2节(对象引用模型 )

换句话说,当你声明一个变量时,你并没有在内存中创建一个对象,你只是为对象的引用保留了内存位置。不过,在大多数情况下,你必须明确地使用指针和引用,才能更灵活地管理对象的生命周期,这就增加了很多额外的复杂性。​ 在 Object Pascal 中,要创建对象的实例,我们可以调用其特殊的 Create 方法,即类本身定义的构造函数或其他自定义构造函数。在我看来,采用对象引用模型是编译器团队在语言早期做出的最佳设计决策之一,当时这种模型在编程语言中并不常见(事实上,那时还没有Java,也没有C#)。

2024-03-16 06:00:00 330

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第7章第1节(创建对象 )

在大多数基于 C 语言语法的编程语言中,调用不带参数的方法需要使用括号,如 ADay.LeapYear()。这与许多语言中的做法大相径庭,在许多语言中,对函数或方法的引用不带括号,返回的是函数地址。正如我们在第 4 章 "过程类型 "一节中所看到的,Object Pascal 使用相同的符号来调用函数或读取其地址,这取决于表达式的上下文。我们可以编写一个复杂的函数(比如LeapYear),然后访问每个TDate对象的值,就像这个类型是原始数据类型一样。用于访问属性的表示法也是相同的。

2024-03-15 06:00:00 157

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第7章第1节(类的方法 )

​ 与大多数其他面向对象的编程语言不同,Object Pascal对方法的定义显式区分了过程和函数的不同,这取决于是否存在返回值。

2024-03-14 06:00:00 151

原创 (delphi11最新学习资料) Object Pascal 学习笔记---第7章第1节( 其他面向对象语言中的类 )

​ 在Java和C#中,方法的代码在类定义中;而在Object Pascal中,类中声明的方法在包含类定义的同一单元的实现部分中定义。换句话说,在Object Pascal中,一个类总是完全定义在一个单元中(当然,一个单元可以包含多个类)。相比之下,虽然在C++中方法是单独实现的,就像在Object Pascal中一样,但包含类定义的头文件与方法代码的实现文件没有严格的对应关系。

2024-03-13 06:00:00 226

Introduction to Java Programming and Data Structures, Comprehensive Version 11e

Introduction to Java Programming and Data Structures, Comprehensive Version, Global Edition,11ed,梁勇教授(Y.Daniel Liang)最新的教材,第11版,全网独家资源。原版高清pdf,可以打印,非扫描版,内含全部奖励章节。

2018-08-24

win32 api编程简明教程

一份很好的win32 api编程的教材,开发语言是C语言。

2010-05-30

windows system programming 4th source code

windows system programming 4th 的源代码

2010-04-08

Accelerated C++.chm

C++之父极力推崇的C++程序设计入门书。本书从C++标准库中的高级抽象开始,可以很快的进入编程的状态,开门见山,而非曲径通幽。另外本书篇幅不大,但是分量却很充足。本书不像其它C++大部头著作那样不可避免地告诉你很多你并不需要的知识,它只教给你C++语言最核心的功能。本书的一个审校是一位用C++编写大型商业系统的主要程序员,他說本书基本上覆盖了他们工作中所使用到的所有技术。希望大家能够喜欢。

2009-02-17

计算机程序设计与解释

麻省理工学院的计算机程序设计入门课程。这是这门课程的教材。

2008-12-17

Think+In+Python

很好的一本Python指南,希望大家能够喜欢

2008-05-14

Rootkits Subverting the Windows Kernel.chm

一本不错的rookit教程,共感兴趣的哥们参考。

2007-05-27

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除