• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Delphi 的运算符重载(1)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

其实 Delphi 2006 就已经支持运算符重载了, 不过 for Win32 的版本只是在 record 里支持.

运算符重载有什么用处呢? 举个例子:
譬如 "张三"、"李四" 两人一起来拜见你, 你可能会问: "你们两个谁大?"
其实你是在问: "你们两个谁的年龄大?"; 但生活中人们一般都不这么罗嗦.

在程序中能否这样简化呢? 这只能通过 "运算符重载" 做到!

先按 "你们两个谁的年龄大?" 写出原始例子吧:


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
  TMyRec = record
    name: string;
    age: Word;
  end;

procedure TForm1.Button1Click(Sender: TObject);
var
  r1,r2: TMyRec;
  str: string;
begin
  r1.name := '张三'; r1.age := 18;
  r2.name := '李四'; r2.age := 81;

  if r1.age > r2.age then
    str := r1.name
  else
    str := r2.name;

  ShowMessageFmt('%s年龄大', [str]); {李四年龄大}
end;

end.


上面是用 r1.age > r2.age 对比年龄, 如果能用 r1 > r2 来对比的话, 那就相当于: "你们两个谁大?" 了.

这样我们需要重载运算符 ">" ; 所谓重载运算符就是赋予某个运算符新的含义、新的功能.
我们可以重载的运算符只能是 Delphi 已有的运算符(还不是全部); C++ 也是这样.
需要用对应的指示字来表示这个运算符, 譬如: ">" 要用 GreaterThan 表示; C++ 不是这样.
重载运算符是通过方法实现的, 不过方法的指示字是 class operator (而非 function 或 proceture).

譬如上面的 record 可以这样声明:

type
  TMyRec = record
    name: string;
    age: Word;
    class operator GreaterThan(a,b: TMyRec): Boolean;
  end;


还得有方法的实现(遗憾的是有些不能用 Ctrl+Shift+C 自动建立, 那就复制吧):

class operator TMyRec.GreaterThan(a,b: TMyRec): Boolean; {注意复制后再加上方法名: "TMyRec."}
begin
  Result := a.age > b.age;
end;


下面是完整的代码:


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
  TMyRec = record
    name: string;
    age: Word;
    class operator GreaterThan(a,b: TMyRec): Boolean;
  end;

class operator TMyRec.GreaterThan(a,b: TMyRec): Boolean;
begin
  Result := a.age > b.age;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  r1,r2: TMyRec;
  str: string;
begin
  r1.name := '张三'; r1.age := 18;
  r2.name := '李四'; r2.age := 81;

  if r1 > r2 then
    str := r1.name
  else
    str := r2.name;

  ShowMessageFmt('%s年龄大', [str]); {李四年龄大}
end;

end.


这个测试里面有一些漏洞, 譬如: 年龄相等怎么办? 不必较真, 只是借此说明一个道理而已.


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
两个MATLAB在线工具,画图啥的都不用安装了发布时间:2022-07-18
下一篇:
Delphi StyleControls之标题栏按钮发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap