为什么80%的码农都做不了架构师?>>>   

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

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

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

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


unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 = class(TForm)Button1: TButton;procedure Button1Click(Sender: TObject);end;varForm1: TForm1;implementation{$R *.dfm}typeTMyRec = recordname: string;age: Word;end;procedure TForm1.Button1Click(Sender: TObject);
varr1,r2: TMyRec;str: string;
beginr1.name := '张三'; r1.age := 18;r2.name := '李四'; r2.age := 81;if r1.age > r2.age thenstr := r1.nameelsestr := r2.name;ShowMessageFmt('%s年龄大', [str]); {李四年龄大}
end;end.

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

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

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

typeTMyRec = recordname: string;age: Word;class operator GreaterThan(a,b: TMyRec): Boolean;end;

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

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

下面是完整的代码:


unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 = class(TForm)Button1: TButton;procedure Button1Click(Sender: TObject);end;varForm1: TForm1;implementation{$R *.dfm}typeTMyRec = recordname: string;age: Word;class operator GreaterThan(a,b: TMyRec): Boolean;end;class operator TMyRec.GreaterThan(a,b: TMyRec): Boolean;
beginResult := a.age > b.age;
end;procedure TForm1.Button1Click(Sender: TObject);
varr1,r2: TMyRec;str: string;
beginr1.name := '张三'; r1.age := 18;r2.name := '李四'; r2.age := 81;if r1 > r2 thenstr := r1.nameelsestr := r2.name;ShowMessageFmt('%s年龄大', [str]); {李四年龄大}
end;end.

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


转载于:https://my.oschina.net/hermer/blog/321009

Delphi 的运算符重载(1)相关推荐

  1. Delphi 的运算符重载(2) - 可重载运算符列表

     类别  运算符 运算符标识 使用 转换 隐式转换  Implicit Implicit(a: type): resultType; 显式转换 Explicit Explicit(a: type): ...

  2. delphi 操作符重载_Delphi XE2中的运算符重载示例

    delphi 操作符重载 In my programming career I have only very rarely run into situations where operator ove ...

  3. Java为什么不提供运算符重载?

    从C ++到Java,一个显而易见的未解决问题是Java为什么不包括运算符重载? 不是Complex a, b, c; a = b + c;吗Complex a, b, c; a = b + c; C ...

  4. c++重载(以运算符重载为主)

    重载(OverLoading)是面向对象程序设计多态性的一种体现.所谓重载,是指"同一标识符"在同一作用域的不同场合具有不同的语义,这个标识符可以是函数名或运算符.也就是说,重载可 ...

  5. groovy–运算符重载

    Groovy支持运算符重载,各种运算符被映射到普通的java对象的方法调用,这就使得开发者可以利用运算符重载的优势来编写自己的Java或者groovy对象. 下面的表格描述了groovy中的操作符所映 ...

  6. c++运算符重载总结

    c++的一大特性就是重载(overload),通过重载可以把功能相似的几个函数合为一个,使得程序更加简洁.高效.在c++中不止函数可以重载,运算符也可以重载.由于一般数据类型间的运算符没有重载的必要, ...

  7. c++重载运算符_C/C++编程笔记:运算符重载丨重载C++中的New和Delete运算符

    new和delete运算符也可以像C ++中的其他运算符一样重载.New和Delete运算符可以全局重载,也可以在特定类中重载. (1)如果使用某个类的成员函数来重载这些运算符,则意味着这些运算符仅针 ...

  8. C++运算符重载形式--成员函数or友元函数?

    1.C++操作符重载形式-成员函数or友元函数 1.对运算符重载,需要坚持四项基本原则: 不可臆造运算符: 运算符原有操作数的个数.优先级和结合性不能改变: 操作数中至少一个是自定义类型: 保持重载运 ...

  9. C++中运算符重载需要遵循的规则

    一.C++中运算符重载需要遵循的规则 1.并不是所有的运算符都可以重载.能够重载的运算符包括: + - * / % ^ & | ~ ! = < > += -= *= /= %= ^ ...

最新文章

  1. 根据开源数据库选择合适的工具
  2. PHP无法编译undefined reference to `libiconv_open
  3. 关于外部存储器件对存储数据的管理。
  4. 利用mysql做信息管理_利用MySql实现学生信息管理系统的后台数据管理
  5. Ubuntu16.04-LTS升级到18.04
  6. 功能强大的TCGA再分析平台
  7. SQL 函数NULLIF、NULL、ISNULL、COALESCE、IIF
  8. document.documentElement.clientHeight与document.body.clientHeight的区别
  9. mysql判断身份证地址_mysql 语句根据身份证查询年龄,地址,性别
  10. 利用JS模拟排队系统
  11. Flutter | Sliver 系列
  12. 利用WireShark分析H264码流
  13. 微服务:高性能网关 ShenYu简介
  14. 小米打印机显示服务器出错,更换小米路由器后打印机无法工作解决办法
  15. 新基建必看系列——一文看懂爆火的智慧灯杆未来趋势及竞争格局
  16. 零基础过五门CPA的一些经验及教训分享
  17. JetBrains学生账号的申请
  18. 功率放大器TDA7851L
  19. 阿里云国际版账户无法登陆,账户被风控怎么办?
  20. 史上最全机器学习_深度学习毕设题目汇总——视频

热门文章

  1. Apache Derby-02通过IJ简单操作DERBY
  2. 阿里云安装JDK1.7
  3. windows update失败还原更改,无法开机
  4. Web服务技术协议:REST与SOAP
  5. c# 过滤HTML代码 源代码,案例 下载
  6. C++学习之路—继承与派生(四)拓展与总结
  7. No DataType in DataTemplate in Windows Phone(—)
  8. robots.txt文件里面怎样屏蔽蜘蛛
  9. CF628D Magic Numbers (数据大+数位dp)求[a,b]中,偶数位的数字都是d,其余为数字都不是d,且能被m整除的数的个数...
  10. 结对项目-WordCount