运算符重载
运算符优先级
以下运算符进行了分组,越往后的组,优先级越高:
关系运算符
| 运算符 | 说明 |
|---|---|
= |
测试是否相等 |
<> |
测试是否不相等 |
< |
测试是否小于 |
> |
测试是否大于 |
<= |
测试是否小于或者等于 |
>= |
测试是否大于或者等于 |
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 会在记录的数据需要被复制给另一个记录时触发