@[TOC]
第九章 运算符重载
Delphi中所有的运算符都对应一个函数名;
调用运算符实际上是调用这些函数;源码中只能使用运算符的符号;
运算符的重载其实是重载这些函数;
与一般函数不同,Delphi只允许重载记录类型的操作符;
同时也只有一部分运算符能够被重载;
(表格P165
重载运算符声明举例
type
RecName = record
class operator conversionOp(a: Type): resultType;
class operator unaryOp(a: Type): resultType;
class operator comparisonOp(a: Type; b: Type): resultType;
class operator binaryOp(a: Type; b: Type): resultType;
end;
重载运算符使用class operator声明;
以上分别重载了转换运算符、一元运算符、比较运算符、二元运算符;
重载转换运算符时,参数a或返回类型有且只能由一个是RecName类型,另一个是其他类型;
它表示参数a的类型转换成resultType类型;
重载一元运算符,参数a只能是RecName,返回值任意,但是对于Inc和Dec,返回值必须是RecName;
重载比较运算符时,ab两个参数至少有一个是RecName类型,返回值boolean类型;
重载二元运算符时,ab两个参数至少有一个是RecName类型,返回值任意类型;
两个参数的时候,参数的顺序决定了运算时操作数的顺序,顺序不一致是不合法的;
返回值的类型不匹配也是不合法的;
一个完整的实例
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils, Dialogs;
type
T2 = record
i: Integer;
s: string;
end;
T1 = record
i: Integer;
s: string;
class operator Implicit(a: Integer): T1;
class operator Negative(a: T1): string;
class operator Equal(a: T1; b: string): Boolean;
class operator Subtract(a: T1; b: Integer): T1;
end;
var
i: Integer;
{ T1 }
class operator T1.Equal(a: T1; b: string): Boolean;
begin
if a.s = b then
Result := True;
end;
class operator T1.Implicit(a: Integer): T1;
begin
Result.i := a;
Result.s := '';
end;
class operator T1.Negative(a: T1): string;
begin
Result := a.s;
end;
class operator T1.Subtract(a: T1; b: Integer): T1;
begin
Result.i := a.i - b;
Result.s := a.s;
end;
var
obj: T1;
begin
obj.i := 100;
obj.s := 'Delphi';
if obj='Delphi' then Writeln('True');
obj := T1(78);
Writeln(obj.i);
obj.s := 'Delphi';
Writeln(-obj);
Writeln((obj-47).i);
Readln;
end.
结果
True
78
Delphi
31