运算符重载
运算符优先级
以下运算符进行了分组,越往后的组,优先级越高:
关系运算符
运算符 | 说明 |
---|---|
= |
测试是否相等 |
<> |
测试是否不相等 |
< |
测试是否小于 |
> |
测试是否大于 |
<= |
测试是否小于或者等于 |
>= |
测试是否大于或者等于 |
in |
测试是否是集合中的成员 |
is |
测试对象是否与类型兼容匹配 |
加、减、或 算术运算符
运算符 | 说明 |
---|---|
+ |
数值加、字符串连接、集合并集、指针偏移加 |
- |
数值减、集合差集、指针偏移减 |
or |
按位或、逻辑或 |
xor |
按位异或、逻辑异或 |
乘除与位运算符
运算符 | 说明 |
---|---|
* |
数值乘、集合交集 |
/ |
浮点数除法 |
div |
整数除法 |
mod |
整数取余 |
as |
运行时类型检查并转换 |
and |
按位与、逻辑与 |
shl |
按位左移 |
shr |
按位右移 |
一元运算符
运算符 | 说明 |
---|---|
@ |
取地址运算符(取变量或例程地址) |
not |
按位非、逻辑非(布尔非) |
成员与指针运算符(优先级最高)
运算符 | 说明 |
---|---|
. |
取类、结构的成员 |
^ |
解指针运算符 |
其他特殊符号:
&
:用于内联汇编中,表示使用Delphi
中的变量,例如:mov eax, &value1
,mov 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 | type |
旧版本的托管记录都是由编译器自己管理的。 从 Delphi 10.4 开始,允许自定义托管记录,记录类型支持自定的初始化与终止程序。
开发人员可以把传统的纪录改写成自定的托管记录,只需要重载以下列出的运算符号(一或多个都可以):
- 运算符 Initialize 会在内存空间分配完成后触发
- 运算符 Finalize 会在内存空间被释放之前触发
- 运算符 Assign 会在记录的数据需要被复制给另一个记录时触发