Delphi9 运算符重载

@[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