运算符重载

运算符优先级

以下运算符进行了分组,越往后的组,优先级越高:

关系运算符

运算符 说明
= 测试是否相等
<> 测试是否不相等
< 测试是否小于
> 测试是否大于
<= 测试是否小于或者等于
>= 测试是否大于或者等于
in 测试是否是集合中的成员
is 测试对象是否与类型兼容匹配

加、减、或 算术运算符

运算符 说明
+ 数值加、字符串连接、集合并集、指针偏移加
- 数值减、集合差集、指针偏移减
or 按位或、逻辑或
xor 按位异或、逻辑异或

乘除与位运算符

运算符 说明
* 数值乘、集合交集
/ 浮点数除法
div 整数除法
mod 整数取余
as 运行时类型检查并转换
and 按位与、逻辑与
shl 按位左移
shr 按位右移

一元运算符

运算符 说明
@ 取地址运算符(取变量或例程地址)
not 按位非、逻辑非(布尔非)

成员与指针运算符(优先级最高)

运算符 说明
. 取类、结构的成员
^ 解指针运算符

其他特殊符号:

  • & :用于内联汇编中,表示使用Delphi中的变量,例如:mov eax, &value1mov eax, &eax。在没有歧义的情况下, 操作符 & 是可以省略的
  • $ :用于表示十六进制数字,例如:$02 相当于C语言的 0x02
  • # :用于以数字来表示字符的字面量,例如 #65 相当于字符 'A'

在 Delphi 中,不是特殊符号的有:!"%?\_|~、反单引号

运算符重载

运算符重载是一种特殊的方法。只有记录可以定义运算符重载的方法。

只有一部分的运算符可以被重载。下面列出可以重载的运算符以及重载格式:

操作符 原型 符号
转换运算符
Implicit Implicit(a:type): resultType; 隐式转换
Explicit Explicit Explicit(a:type): resultType; 显示转换
一元操作符
Negative Negative(a:type): resultType; - (负号)
Positive Positive(a:type): resultType; + (正号)
Inc Inc(a:type): resultType; Inc
Dec Dec(a:type): resultType; Dec
LogicalNot LogicalNot(a:type): resultType; not
BitwiseNot BitwiseNot(a:type): resultType; not
Trunc Trunc(a:type): resultType; Trunc
Round Round(a:type): resultType; Round
比较操作符
Equal Equal(a:type; b:type): Boolean; =
NotEqual NotEqual(a:type; b:type): Boolean; <>
GreaterThan GreaterThan(a:type; b:type): Boolean; >
GreaterThanOrEqual GreaterThanOrEqual(a:type; b:type): Boolean; >=
LessThan LessThan(a:type; b:type): Boolean; <
LessThanOrEqual LessThanOrEqual(a:type; b:type): Boolean; <=
二元操作符
Add Add(a:type; b:type): resultType; +
Subtract Subtract(a:type; b:type): resultType; -
Multiply Multiply(a:type; b:type): resultType; *
Divide Divide(a:type; b:type): resultType; /
IntDivide IntDivide(a:type; b:type): resultType; div
Modulus Modulus(a:type; b:type): resultType; mod
LeftShift LeftShift(a:type; b:type): resultType; shl
RightShift RightShift(a:type; b:type): resultType; shr
LogicalAnd LogicalAnd(a:type; b:type): resultType; and
LogicalOr LogicalOr(a:type; b:type): resultType; or
LogicalXor LogicalXor(a:type; b:type): resultType; xor
BitwiseAnd BitwiseAnd(a:type; b:type): resultType; and
BitwiseOr BitwiseOr(a:type; b:type): resultType; or
BitwiseXor BitwiseXor(a:type; b:type): resultType; xor
托管的记录运算符号
Initialize Initialize(out Dest: record);
Finalize Finalize(var Dest: record);
Assign Assign(var Dest: record; const [ref] Src: record); :=

注: 表中 BitwiseXXX 表示位运算中的运算符,LogicalXXX 表示逻辑运算符

class operator 来表示当前方法是运算符重载,例如:

1
2
3
4
5
type
TPointRecord = record
public
class operator Add(a, b: TPointRecord): TPointRecord;
end

旧版本的托管记录都是由编译器自己管理的。 从 Delphi 10.4 开始,允许自定义托管记录,记录类型支持自定的初始化与终止程序。

开发人员可以把传统的纪录改写成自定的托管记录,只需要重载以下列出的运算符号(一或多个都可以):

  • 运算符 Initialize 会在内存空间分配完成后触发
  • 运算符 Finalize 会在内存空间被释放之前触发
  • 运算符 Assign 会在记录的数据需要被复制给另一个记录时触发