Object Pascal 中类型

2021年关于Delphi/Object Pascal编程语言的现状和历史 关于Delphi/Object Pascal Delphi是一种基于 Object Pascal 的编程语言,用于桌面、移动、Web 和控制台软件开发。在 1995 年首次亮相之前的最初开发过程中,Delphi 是一种尚未命名的产品的代号。 function DigitSum(AValue: Int64): Integer; begin if AValue mod 10 = AValue then Result := AValue else Result := (AVa.. 阅读详情
Object Pascal 中类型的一些注意
2010-04-16 14:15

---------------------------------------------------------

原创文章,如转载,请注明出处

---------------------------------------------------------

以下内容为备忘,你可能早已知道或者早已注意。

1, 区分类的forward声明和继承自TObject的子类
例如:
type
TFirst = class;   //forward声明, 类TFirst的具体声明在该声明区域后部
TSecond = class   //一个完整的类定义,定义了类型TSecond
end;
TThird = class(TObject); //同样是一个完整的类型定义,定义了类型TThird,
     //这个类不包含任何数据成员和方法

2, constructor 与 destructor
我谈两点:用对象名和类名调用create的不同、构造和析构的虚与实
首先需要说的是,对象被动态分配内存块,内存块结构由类型决定,同时类型也决定了对该类型的“合法”操作!
一个对象的构造函数用来得到这个内存块。
<1>, 用对象名和类名调用create的不同
构造函数是一个类方法,通常应该由类来调用,如下:
AMan := TMan.Create;
这条语句,会在堆中分配内存块(当然,它不仅仅干这些,实际上它还会把类型中所有的有序类型字段置0,
置所有字符串为空,置所有指针类型为nil,所有variant为Unassigned;实际上,构造函数只是把内存块进行
了清零,内存块清零意味着对所有的数据成员清零),并把这个内存块的首地址给AMan。
但如果你用下面的方式调用,
AMan2 := AMan.Create; //假设AMan已经被构造, 如未被构造,会产生运行时异常,
         //本质上,对未构造的对象的操作是对非法内存的操作,结果不
         //可预知!
这实际上相当于调用一个普通的方法,不会分配内存块,当然也不会自动初始化。这和你调用下面的方法
类似,
        AMan.DoSomething; //DoSomething 为类 TMan的普通方法
当然,构造函数毕竟是函数,它会有一个返回值,这个返回值就是对象的地址,所以AMan2和AMan指向同
一地址。
Note:不要试图通过用对象名调用create方法来实现对象初始化!!因为把构造函数当做普通的方法来调用
并不会实现自动初始化,所以用对象名来调用create方法就显得很鸡肋了,当然,某些场合,这是一种技巧。
<2>, 构造和析构的虚与实
构造函数和析构函数应该是虚的还是实的?这很疑惑!
看代码:
---------------------------------
type
TMan = class(TObject)
public
   constructor Create;
   destructor Destroy;
end;

TChinese = class(TMan)
public
   constructor create;
   destructor Destroy;
end;

TBeijing = class(TChinese)
public
   constructor Create;
   destructor Destroy;
end;
....
        var
   AMan, AMan2, AMan3: TMan;
   AChinese: TChinese;
   ABeijing: TBeijing;
begin
   AMan := TChinese.Create;
   AMan2 := TMan.Create;
   AMan3 := TBeijing.Create;
  
   AMan.Free;
   AMan2.Free;
   AMan3.Free;
end;
如果构造都是“实”的,无论如何,对于上面的用法,对象都可以被正确构造。但是对于析构,上述代码有
问题!如果加入测试代码,你会发现所有的析构方法根本不会被执行。知道,Free方法继承自TObject,其
源码如下:
procedure TObject.Free;
begin
   if Self <> nil then
   Destroy;
end;
constructor TObject.Create;
begin
end;

destructor TObject.Destroy;
begin
end;
Note:通常,self内置参数是指向对象本身,而在类方法中self是指向类本身。
很显然,在前面的代码中, AMan, AMan2, AMan3不是nil,free方法执行了。但是很遗憾的是,它所执行的
Destroy其实是基类TObject.Destroy; 而TObject.Destroy什么也不做。要理解这一点,需要理解类的内存组织
结构,理解“隐藏”的概念。所谓隐藏,指的是基类和子类有同名的方法(不考虑虚、动态的情况), 子类的该名
方法隐藏基类的方法名。运行时,到底调用哪一个方法取决于调用者类型。如下代码:
type
TCountry = class
public
   procedure Test;
end;
TChina = class(TCountry)
public
   procedure Test;
end;

....

var
   ACoun, ACoun1: TCountry;
   AChina: TChina;
begin
   ACoun := TCountry.Create;
   ACoun1 := TChina.Create;
   AChina := TChina.Create;

   ACoun.Test; //调用TCountry.Test
   ACoun1.Test; //调用TCountry.Test
   AChina.Test; //调用TChina.Test

   ACoun.Free;
   AChina.Free;
end;
对于隐藏的情况,具体调用哪一个方法,取决于调用者本身的类型。
很显然,一个实的析构方法有问题!可能会造成内存泄露。那么它们是虚的好了。问题来了,
type
TMan = class(TObject)
public
   constructor Create;
   destructor Destroy; virtual; override;
end;

TChinese = class(TMan)
public
   constructor create;
   destructor Destroy; virtual; override;
end;

TBeijing = class(TChinese)
public
   constructor Create;
   destructor Destroy; virtual; override;
end;
语法错误!上述的代码编译器会提示语法错误。ok,正确的应该是下面
TMan = class(TObject)
public
   constructor Create;
   destructor Destroy; override;
end;

TChinese = class(TMan)
public
   constructor create;
   destructor Destroy; override;
end;

TBeijing = class(TChinese)
public
   constructor Create;
   destructor Destroy; override;
end;
疑问来了,不是只有virtual 和 dynamic 才能被覆盖么?在Delphi中为了保证对象被完全的析构,
所有的Destroy方法“天生”为虚方法,可以在任何地方被覆盖!虽然这破坏了语言语法上的一致性,
但这保证一个对象不管从哪里(继承)来,都只有唯一的析构方法。但是,编译器不会强制你使用
override关键字,所以,你可以像下面这样来定义析构。
TChinaese = class(TMan)
public
   destructor Destroy;
end;
这可能会带来问题,虽然不总是会带来问题。因为在TChinese类中存在多个Destroy方法,分别是:
TObject.Destroy;
TMan.Destroy;
TChinese.Destroy;
所以,结论是,无论在什么地方定义Destroy,覆盖它!!以确保整个类谱中只有一个Destroy;

****
至此,我们确信:一个实的构造方法可以工作,一个实的析构会有问题,析构应该总被override!
****
那么,虚的构造可以正常工作么?看代码:
type
TMan = class(TObject)
public
   constructor Create; virtual;
end;

TChinese = class(TMan)
public
   constructor create; override;
end;

TBeijing = class(TChinese)
public
   constructor Create; override;
end;
....
        var
   AMan, AMan2, AMan3: TMan;
   AChinese: TChinese;
   ABeijing: TBeijing;
begin
   AMan := TChinese.Create;
   AMan2 := TMan.Create;
   AMan3 := TBeijing.Create;
  
   AMan.Free;
   AMan2.Free;
   AMan3.Free;
end;
Ok,可以,工作正常。原因在于我们对对象的使用方法。我们总是用"确定"的类名来构建的,这总可以保证
我们调用正确的方法。但如果我们使用类引用的话,情况不同了,如下:

type
   TManClass = class of TMan;
var
   AManClass: TManClass;
   AObj, AObj2, AObj3: TMan;
begin
   AManClass := TMan;   //AManClass is TMan
   AObj := AManClass.Create; //调用TMan.create

   AManClass := TChinese; //AManClass is TChinese
   AObj2 := AManClass.Create;    //调用那一个create??

   AManClass := TBeijing;
   AObj3 := AManClass.Create;   //which create???

   ....
end;
和前面讨论析构的情况类似,这取决于方法的内存布局,注意我在最初提到过类型决定布局。方法的内存布局
取决于它是virtual, override, overload, dynamic.当TMan.create 是virtual, 并且,TChinese.create是
override时,AObj2 := AManClass.Create 调用的是 TChinese.Create; 如果不是,则是TMan.Create;

上面的解释仍然是疑惑的,问题的关键在于什么是“类引用”!从语义上说,类引用是这样一个类型:它代表了
一系列相关的存在继承关系的类型,一个类引用变量代表一系列类型。区别于一般的变量,一般的变量表示的
是一系列实体,如:var count: integer; 意思是你定义了一个实例count,它的类型是integer; count 对应
于堆或栈中的一个内存块,count是数据。这是一般情况下我们定义一个变量所隐含的意思。但类引用变量稍有
不同,如上,AManClass变量,它代表的是一系列和TMan兼容的“类型”,它的类型是TManClass,它没有内存块
(你没办法说,一个类型的类型对应什么内存块),实际上,可以认为类引用类型指向了一个“代码块”。类引用
变量的值是“类”!这很重要(稍后会进一步解释)!Delphi对类引用的实现实际上就是一个32位的指针(一个普通
指针),它指向了类的虚方法表(VMT).
类引用的值是“类”,这决定了任何时候使用类引用变量只能调用类方法!一个构造函数是类方法,所以使用类
引用调用Create方法是合理的,但是你不可以使用类引用调用非类方法,比如Destroy方法,实际上在类引用中
你也找不到Free方法。
需要提及的是,构造函数虽然很接近于类方法,甚至于你也可以使用类方法来模拟构造函数:
TMan = class
public
   class function Create: TMan;
end;

class function TMan.Create: TMan; //模拟构造函数
begin
   result := inherited Create;
end;
但构造函数做的更多,除了前面提到的自动初始化外,构造函数还会在构造对象时将对象的VMT指针指向类的VMT。
此外,构造函数中的self指的是对象本身,类方法中self指的是类本身。总之,我们可以认为构造函数是一个
特殊的类函数。

Ok,到此,我们确信:类引用可以调用类方法,构造函数可以使用类引用来调用。
问题产生:由于类引用表示的是“一系列”类型,那么调用构造方法的时候,到底调用的是那一个构造方法呢?
对于TManClass类型变量而言,它只能调用的一定是TMan类的create方法,但如果TMan类的子类覆盖了TMan的create
方法,调用TMan类的create方法实际上就是调用子类的create方法。这里的关键是理解“覆盖”的概念。这实际上意味
着对使用类引用调用构造方法,虚的构造方法和实的构造方法是不同的。对于前面的例子而言,
AManClass := TChinese;
AObj2 := AManClass.create; //调用了TChinese.Create;

AManClass := TBeijing;
AObj3 := AManClass.create; //调用了TBeijing.Create;
但如果构造不是覆盖虚函数,那么它们统统是调用TMan.Create;显然这不是我们期望的。
Note:每个类有一个虚方法表(VMT),而不是每个对象有一个!

结论:构造函数是可以被类本身、类引用、对象调用,在这三种情况下构造函数的表现是不同的,在使用类引用的情况
下虚的构造通常是必要的。

那么,构造函数总是虚的是否更合理呢?我个人倾向于总是虚的更合理,因为这样可以保证一个对象总是被正确的构造。
实际上,VCL中组件继承的大多Create都被声明成虚方法了。但Delphi并未将TObject的构造实现为虚,也许是出于兼容的
考虑,我不太清楚。我听说,Java中的构造总是虚的。当然,总是虚的也有弊端,例如:你不可以通过调用Create方法来
只初始化父类的成员,因为在类的继承体系中只有一个Create方法。但是静态的构造可以实现父类的成员初始化。私下里,
我猜想也许是因为构造函数承担了太多的义务,使得Delphi设计者没有像析构那样以总是虚来处理。

另,在C++中有一条法则,不要在构造中使用虚!但在Delphi中可以随便,根本原因在于RTTI(运行时类型信息),Delphi在
运行时保存了完整的类型信息。这是C++和Delphi的重要不同之处。

 

总结:对析构函数而言,无论是否声明为virtual,它总是虚的,你总需要使用override;对构造函数而言,虚和实取决
于的使用方法,但一般而言使用虚更安全,在使用类引用的情况下一定要保证子类覆盖基类的构造方法。

5、Object Pascal中的数据类型、变量和常量 本文详细介绍了Object Pascal中的数据类型、变量和常量的基础知识,包括简单类型、结构化类型、变体类型的使用方法及转换规则,以及线程本地变量的特性。通过学习这些内容,开发者可以更好地管理和优化程序中的数据,提高代码的可读性和维护性。 阅读详情

相关推荐

9、Object Pascal 数据类型与特性深入解析

本文深入解析了Object Pascal中的核心数据类型与特性,包括指针与指针类型的使用、标准指针类型、字符指针的处理方式;过程类型的定义、兼容性规则及使用注意事项;变体类型的灵活性和局限性,以及变体数组和OleVariant的使用;还探讨了类型同一性、类型兼容性和赋值兼容性等关键概念,帮助开发者更好地理解和运用Object Pascal编程语言。

1a2s3d4f5g的博客 87

基本算法(用 PASCAL 描述)

基本算法(用 PASCAL 描述)基本算法(用 PASCAL 描述)1.数论算法 求两数的最大公约数 function gcd(a,b:integer):integer; begin if b=0 then gcd:=a else gcd:=gcd (b,a mod B); end; 求两数的最小公倍数 function lcm(a,

降龙十八炒 1153

7、Object Pascal 数据类型与字符串操作详解

本文详细介绍了Object Pascal中的数据类型和字符串操作,涵盖通用实数类型(如Real、Double、Real48、Extended)、字符串类型(包括ShortString、AnsiString和WideString)的特性与使用场景,以及扩展字符集(单字节、多字节和Unicode)的处理方法。同时,文章还讲解了以空字符结尾的字符串、结构化类型(集合、数组、记录等)的内存管理,以及集合操作和字符串性能优化技巧。通过学习这些内容,开发者可以更好地掌握Object Pascal的数据类型体系,提高程序

1a2s3d4f5g的博客 80

1.Delphi/Object Pascal简介——《跟老吕学Delphi/Object Pascal》

Delphi/Object Pascal 是一种高级编程语言,由 Borland(现为 Embarcadero Technologies)开发,结合了 Pascal 语言的严谨性和面向对象的编程特性。Delphi 主要用于开发 Windows 应用程序,但也可以跨平台运行。Object Pascal 是 Delphi 的核心编程语言,它扩展了传统的 Pascal 语法,支持类、对象、继承等面向对象的特性。

Python老吕的博客 1646

8、Object Pascal结构化类型与指针使用全解析

本文深入解析了Object Pascal中的结构化类型,包括静态数组与动态数组的声明与操作、记录类型与变体部分的使用、文件类型的定义与应用,以及指针的基本操作和注意事项。文章还提供了实际代码示例,帮助开发者更好地理解和应用这些核心编程概念。

1a2s3d4f5g的博客 68

全面的Object Pascal参考手册

本文还有配套的精品资源,点击获取 简介:Pascal语言是一种结构化编程语言,Delphi是基于Pascal的集成开发环境,而Object Pascal是Pascal的面向对象扩展。这份参考手册深入介绍了Pascal和Object Pascal的基础语法、面向对象的特性如类、对象、继承、封装和多态性。手册详细讲解了动态数组、接口、枚举等高级数据类型,以及VCL组件、异常处理...

weixin_31139479的博客 1732

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

2.Object Pascal 数据类型 Object Pascal是一种强类型语言,对数据类型的定义、声明以及数据赋值和传递操作等有严格的语法规则。Object Pascal的数据类型可以分为标准数据类型和高级数据类型,还支持自定义类型。本节主要来学习标准数据类型。 标准数据类型: Integer 整型 Real 浮点型 Charactor 字符型 String 字符串型 Boolean 布尔型 高级数据类型: Enumerated 枚举型 Su

chenhaiy的博客 803

Object pascal中文参考手册(可打印版)

Object pascal中文参考手册(可打印版)Object pascal中文参考手册(可打印版)

Object Pascal中String类型的内幕探讨

 在Object Pascal中,String(准确的说是AnsiString)是一种可变长度的字符串,通过PChar(AString)可以将其转换为与Windows API相兼容的字符指针类型。事实上,String类型就是一个指针,你可以用Sizeof去读取它的大小,不论字符串的实际长度是多少,Sizeof(AString)永远是4。String与一般的Null-Terminated字符指针

weizhisheng的专栏 1651

VBOX 3iS实战:如何用GNSS+IMU搞定车辆动态坡度测量(附避坑指南)

本文详细介绍了VBOX 3iS在车辆动态坡度测量中的高阶应用,通过GNSS+IMU融合技术和卡尔曼滤波算法,有效解决了传统测量方法在动态环境中的局限性。文章提供了设备配置、实战策略和数据后处理的实用指南,帮助工程师提升测量精度和效率。

weixin_42520796的博客 321

光学仿真案例(1) 铌酸锂非线性波导仿真模拟 FDTD仿真

在过去几年里,许多集成光子学应用往往需要多个相干可调谐光源,而且从外部激光器引入额外的光输入增加了芯片封装的复杂性,如果使用基于III-V族、氮化硅(SiN)或铌酸锂(LNO)的集成光源又大大增加了制造复杂性和成本。然而,通过非线性谐波相互作用产生的光源不需要额外的制造工艺来产生增益、反馈和外部电路,即可支持许多应用。在下面的案例中,演示了一种基于Luo[1]的铌酸锂波导频率转换集成系统。该案例主要仿真了利用温度调制实现高效相位匹配的铌酸锂纳米光子波导的二次谐波产生。

q895235273的博客 4143

Object Pascal 基本数据类型

注:以下标红的表示最常用的数据类型整数类型Integer实数类型Real字符类型Char字符串类型String布尔类型Boolean其他基本类型枚举类型子界类型示例代码。

weixin_43754657的博客 1153

BEVFormer与TensorRT的完美结合:如何实现4倍推理加速?

本文详细解析了如何通过TensorRT的量化技术和自定义插件实现BEVFormer模型的4倍推理加速,同时保持精度损失小于1%。文章从模型架构与部署挑战入手,深入探讨了计算图优化、自定义插件开发和量化校准策略,并提供了完整的部署流程和性能调优技巧,为自动驾驶领域的实时3D感知提供了高效解决方案。

bean的博客 221

Object Pascal语言中的“指针类型”

⒈指针类型的声明 指针类型的声明 指针类型在任何语言中都是比较难理解也是比较灵活的一种数据类型,指针通常是它所指的变量的内存地址。 声明指针类型的语法如下: Type 指针类型标识符=^基类型; 程序示例如下: Type  BytePtr=^Byte;  WordPtr=^Word; 上例中,声明了两个指针类型,一个是bytePtr,指向byte类型的数据,另一个是WordPtr,指向

thinkray的专栏 1252

6.5 构网型储能系统的协同控制策略

本文系统阐述了构网型储能系统的协同控制策略,重点分析了多机组群协同运行面临的功率分配不均、动态响应失配等挑战。研究提出了改进型下垂控制与虚拟阻抗法、基于一致性算法的分布式协同控制等解决方案,探讨了构网型储能与同步发电机在惯性响应、一次调频等方面的协同机制,以及与跟网型电源在电压支撑、阻抗重塑等方面的互补作用。文章构建了分层控制架构,为实现多类型电源的全局优化运行提供了技术路径,对提升高比例新能源电力系统的稳定性具有重要意义。

技术工作者 1002

别再盯着那 100 条数据了,RAP OData 分页机制到底在保护什么

摘要: SAP BTP ABAP Environment 的 OData 服务默认采用分页保护机制,未指定 $top 时仅返回100条数据并附带下一页链接。这种设计旨在防止资源滥用,而非服务故障。客户端应遵循OData协议规范,直接使用服务端返回的 next link 进行分页请求,而非自行构造URL。当指定 $top 参数时,若数值超过5000仍会被强制分页。该机制在SAPUI5控件中被自动处理,但自定义客户端需主动实现分页逻辑。对于自定义实体(Custom Entity),开发者需在Query Prov

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 861

(delphi11最新学习资料) Object Pascal 学习笔记---第5章第4节( 变体类型 )

虽然这个名称让人联想到变体记录(前面提到过)并且实现方式与开放式数组形参有些相似,但变体是一种独立的语言特性,有非常特殊的实现方式(在Windows开发之外的语言中不太常见)。总的来说,你可以将使用变体的代码部分视为解释型代码,因为与解释型代码一样,许多操作要到运行时才能解析,这会影响代码的运行速度。​ 在我的手机上,这段代码花费的时间是在Windows上的6倍多,但事实上,两者之间的净差异超过7秒,使得基于变体的实现对用户而言明显较慢,而基于Int64的实现仍然非常快(用户几乎不会注意到十分之一秒)。

langfengyl的专栏 1960

[游戏排查] Baldur‘s Gate 3 加载完成即崩溃?五步排查帮你快速定位问题

《博德之门3》加载崩溃问题解决方案:针对游戏进度条走完后闪退的情况,提供五步排查法。首先清除LevelCache缓存(成功率最高),其次检查Mod兼容性,然后切换Vulkan/DX11渲染API,再排查存档损坏问题,最后可删除配置目录(需备份存档)。重点提示Steam验证无法解决此类问题,建议按步骤顺序排查,多数情况下前两步即可解决问题。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 3261

(delphi11最新学习资料) Object Pascal 学习笔记---第2章第六节(类型转换)

Object Pascal手册是Delphi编程语言的完整指南。这本书由著名的 Delphi 大师马可·坎图(Marco Cantu)撰写,他著有数十本关于 Delphi 的书籍,他是不断发展的Embarcadero Technologies RAD Studio的 Delphi 产品经理之一。有了这本书,你可以了解 Delphi 的所有基础知识,并对你将用来创建本机Windows应用程序的Delphi编程语言有一个全面的了解。

langfengyl的专栏 531

你知道几种数字地与模拟地连接方式及优缺点?

频率选择性:磁珠的阻抗特性随频率变化,只对某个频点的噪声有显著抑制作用,对于频率不确定或无法预知的情况,可能不是最佳选择。在实际应用中,选择合适的连接方式需要根据具体的电路频率、信号类型、设计要求等因素综合考虑,以达到最佳的电磁兼容效果.高频信号干扰:在高频电路中,单点接地可能导致信号回流路径过长,增加地线电感,从而引入高频噪声。限制噪声电流:0欧姆电阻相当于一个非常窄的电流通路,能够有效地限制环路电流,使噪声得到抑制。抑制高频信号:电感对高频信号有较大的阻碍作用,可以有效抑制高频噪声。

linkking27的博客 801

万字长文介绍ARINC 653,以及在综合模块化航空电子设备(IMA)中的作用

ARINC 653 在综合模块化航空电子设备(IMA)的发展进程中扮演着极为关键的角色。从行业应用的实际情况来看,空客 A380 和波音 787 等先进飞机的航电系统套件充分体现了行业对 IMA 的高度重视和积极投入。在 IMA 架构下,核心软件具备强大的能力,能够支持多个航空电子应用程序的同时运行。这些应用程序可以并行开发,并高效地部署在同一个计算平台上,极大地提高了开发效率和系统集成度。ARINC 653 的出现为航空电子行业创造了一个充满活力和竞争力的商业环境。

2956

Object Pascal 概要——指针类型

  指针类型声明:    type      指针类型名 = ^基类型;  指针变量声明:    var      指针变量名: 指针类型名;  直接声明指针变量:    var      指针变量名: ^基类型;  每个指针都需要用New分配空间,当应用程序的堆上没有足够的空间时,将触发EOutOfMemory异常。不再使用的指针需要用Dispose释放空间。  nil指针是空指针,不能用它来访

石子资料库 1063

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Object Pascal 概要——记录类型

  记录类型的声明:    类型名 = record      域名1: 类型;      域名2: 类型;      ……      域名n: 类型;    end;  记录类型可以用 记录变量名.记录域名 的形式访问,或者先用 with 记录变量名 do 语句,然后直接用 记录域名 来访问。

石子资料库 2478

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

(delphi11最新学习资料) Object Pascal 学习笔记---第6章第2节(重温字符类型)

令人惊讶的是,如果将该值转换为字符,并再次显示,数字表示法将变为正确的表示法。事实上,RTL 的经典 UpCase 函数仅适用于 ANSI 表示法中的 26 个英语字符,而对某些具有特定大写表示法的 Unicode 字符则不起作用(并非所有字母都有大写表示法,因此这不是一个通用概念)。这种类型很少使用,因为通常很难证明所需的额外内存是合理的,但是,正如你很快会看到的,字符单元(接下来会介绍)也包含了对这种数据类型的一些操作。,定义了各种空格(是的,空格不止一种)、连字符和分隔符的族。​ 回到Char类型。

langfengyl的专栏 938

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

(delphi11最新学习资料) Object Pascal 学习笔记---第6章第5节( 其他字符串类型 )

在 Delphi 10.1 Berlin 中,UTF8String 类型和低级的 RawByteString 类型被正式重新引入,随后的 Delphi 10.4 也在移动设备上启用了所有桌面字符串类型。掌握多个字符串类型会更加复杂,可能会产生不必要的副作用(如大量的自动转换调用会降低程序的运行速度),而且维护多个版本的字符串管理和处理函数的成本也很高。显而易见的缺点是,这种字符串占用的内存是 UTF-16 字符串的两倍(UTF-16 字符串占用的内存已经是 ANSI 字符串的两倍)。

langfengyl的专栏 401

Object Pascal 数据类型

数据类型与定义变量 Object Pascal 语言的最大特点是对数据类型的要求非常严谨。传递给过程或函数的参数值必须与形参的类型一致。在Object Pascal 语言中不会看到像C 语言编译器提示的“可疑的指针转换”等警告信息。由于Object Pascal 语言对数据类型比较严谨,因此它会对代码进行严格检查,以确保不会出现错误。变量是程序代码中代表一个内存地址的标识符,那么...

weixin_30832143的博客 432
上一篇: 有关 Form 的一些代码的标准写法
下一篇: Javascript 类型转换
一剑平江湖
博客等级 码龄18年 207粉丝 1070原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值