使用Delphi编写游戏,唯一没有C++方便的就是不支持运算符重载。当你编写有关向量或者矩阵计算的程序时,不支持运算符重载的Delphi使用起来是很费劲的。
但是Delphi 2006改变了这种局面,新的Delphi内核已经支持运算符重载了!
本文将介绍如何使用Delphi的运算符重载功能

注意:只有Delphi 2006 和 免费版的 Turbo Delphi 支持这一功能!

Delphi for Win32 只支持 record 类型的运算符重载,而 Delphi .NET 还支持 class 类型的运算符重载
下面是Delphi支持的可重载运算符

运算符       类型       声明语法                                          应用符号
Implicit     转换       Implicit(a: type): resultType;                    隐式转换

Explicit     转换       Explicit(a: type): resultType;                    显式转换

负           一元运算   Negative(a: type): resultType;                    -

正           一元运算   Positive(a: type): resultType;                    +

递增         一元运算   Inc(a: type): resultType;                         Inc

递减         一元运算   Dec(a: type): resultType;                         Dec

逻辑非       一元运算   LogicalNot(a: type): resultType;                  not

按位非       一元运算   BitwiseNot(a: type): resultType;                  not

截取         一元运算   Trunc(a: type): resultType;                       Trunc

舍入         一元运算   Round(a: type): resultType;                       Round

等于         比较       Equal(a: type; b: type) : Boolean;                =

不等于       比较       NotEqual(a: type; b: type): Boolean;              <>

大于         比较       GreaterThan(a: type; b: type) Boolean;            >

大于等于     比较       GreaterThanOrEqual(a: type; b: type): resultType;>=

小于         比较       LessThan(a: type; b: type): resultType;           <

小于等于     比较       LessThanOrEqual(a: type; b: type): resultType;    <=

加           二元运算   Add(a: type; b: type): resultType;                +

减           二元运算   Subtract(a: type; b: type): resultType;           -

乘           二元运算   Multiply(a: type; b: type): resultType;           *

除           二元运算   Divide(a: type; b: type): resultType;             /

整除         二元运算   IntDivide(a: type; b: type): resultType;          div

模           二元运算   Modulus(a: type; b: type): resultType;            mod

左移         二元运算   ShiftLeft(a: type; b: type): resultType;          shl

右移         二元运算   ShiftRight(a: type; b: type): resultType;         shr

逻辑与       二元运算   LogicalAnd(a: type; b: type): resultType;         and

逻辑或       二元运算   LogicalOr(a: type; b: type): resultType;          or

逻辑异或     二元运算   LogicalXor(a: type; b: type): resultType;         xor

按位与       二元运算   BitwiseAnd(a: type; b: type): resultType;         and

按位或       二元运算   BitwiseOr(a: type; b: type): resultType;          or

按位异或     二元运算   BitwiseXor(a: type; b: type): resultType;         xor

在具体介绍如何使用运算符重载前,我先说说Delphi里record的新功能。
Delphi2006 里,record已经和class 很类似了,例如
type
   TMyRecord = record
   private
     x : Integer;
   public
     constructor Create(val : Integer);
     procedure Change(arg : integer); overload;
     procedure Change(arg1, arg2 : Integer);overload;
   end;

record和class的区别是:
record 不支持继承
record 包含可变部分;class没有(关于可变部分,请参考Delphi2006的帮助文件)
record 是值类型;class是引用类型(具体的情况,同样请参考Delphi2006的帮助文件)
record 允许在Win32 和 .Net平台都支持运算符重载;class只在.NET里支持
record 是自动构造的,使用的是默认的无参数构造函数,class必须显式构造;由于record拥有默认的无参数构造函数,所以用户定义的构造函数至少要有一个参数
record 没有析构函数
record 不支持虚方法
record 在Win32里不支持interface的实现,在.NET里可以支持

好了,该看看运算符重载是如何实现的了
首先是定义,句法如下:
type
    typeName = [class | record] //只有使用.NET时,才能用class
        class operator conversionOp(a: type): resultType;
        class operator unaryOp(a: type): resultType;
        class operator comparisonOp(a: type; b: type): Boolean;
        class operator binaryOp(a: type; b: type): resultType;
    end;

实现部分的句法如下:
class operator typeName.conversionOp(a: type): resultType;
class operator typeName.unaryOp(a: type): resultType;
class operator typeName.comparisonOp(a: type; b: type): Boolean;
class operator typeName.binaryOp(a: type; b: type): resultType;

还是看看具体的例子吧 :)
type
   TVector = record
     x : Single;
     y : Single;
     z : Single;
   public
     constructor Create(x1, y1, z1); //这个构造函数可以不用写,原因稍后告知
     class operator Add(V1, V2 : TVector): TVector;            //重载运算符 +
     class operator Implicit(i : Single): TVector; overload;   //隐式转换
     class operator Implicit(i : TVector): TVector; overload; //同上
   end;

//具体的实现
{ TVector }

constructor TVector.Create(x1, y1, z1: Single);
begin
   x := x1;
   y := y1;
   z := z1;
end;

class operator TVector.Add(V1, V2: TVector): TVector;
begin
   Result.x := v1.x + v2.x;
   Result.y := v1.y + v2.y;
   Result.z := v1.z + v2.z;
   Result.w := v1.w + v2.w;
end;

class operator TVector.Implicit(i: Single): TVector;
begin
   Result.x := i;
   Result.y := i;
   Result.z := i;
   Result.w := i;
end;

class operator TVector.Implicit(i: TVector): TVector;
begin
   Result.x := i.x;
   Result.y := i.y;
   Result.z := i.z;
   Result.w := i.w;
end;

//调用方法
...
var
   v1, v2 : TVector;
begin
...
   v1.Create(1, 2, 3);
//也可以用如下的方法给x,y,z赋值
//   v1.x := 1;
//   v1.y := 2;
//   v1.z := 3;
//所以说刚才的Create函数可以不要
//和class不同,record可以自动给成员初始化
//这个例子里,x,y,z的初始化值为 0
   v2 := 1;   //调用了class operator Implicit(i : TVector): TVector
             //这时v2所有成员都被赋值成1
   v2 := v1; //调用了class operator Implicit(i : TVector): TVector

v2 := v1 + v2; //调用了class operator Add(V1, V2 : TVector): TVector;

v2 := v2 + 1;   //   class operator Add(V1, V2 : TVector): TVector
                  //和class operator Implicit(i : TVector): TVector的复合调用

end;

Delphi的这种实现方式显然比C++要方便,因为你不用考虑内存释放;也可以不用定义构造函数。

转载于:https://www.cnblogs.com/moon25/archive/2011/06/03/2072211.html

[转]Delphi的运算符重载相关推荐

  1. Delphi 的运算符重载(1)

    为什么80%的码农都做不了架构师?>>>    其实 Delphi 2006 就已经支持运算符重载了, 不过 for Win32 的版本只是在 record 里支持. 运算符重载有什 ...

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

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

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

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

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

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

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

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

  6. groovy–运算符重载

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

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

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

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

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

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

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

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

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

最新文章

  1. 【通俗理解线性代数】 -- 理解二次型
  2. Springboot项目中配置tomcta监控日志
  3. JAVA基础知识总结8(设计模式)
  4. aws v2.2.exe_如何使用Python 3.6在AWS EC2上创建运行uWSGI,NGINX和PostgreSQLDjango服务器...
  5. Python编程 | 新手必会的 9 个 Python 技巧
  6. 组网胖模式_胖瘦AP组网优劣对比,你知道吗?
  7. PHP extension mcrypt must be loaded.
  8. NYOJ题目1045看美女
  9. CSS与CSS3美化页面
  10. uniapp-页面内/页面间数据的流动传递-this-that
  11. IDEA GitToolBox插件安装教程
  12. spring boot 访问路径404是会转到/error路径,倒是拦截器失效
  13. jQuery悬浮菜单
  14. 群体遗传分析—LD连锁不平衡
  15. java中的同步与异步
  16. 软件 黑苹果盒盖不休眠_怎么解决苹果电脑合盖自动休眠问题?
  17. 保持好距离才会保持好爱情!情侣间最好的距离!很值得一看!
  18. ArcGIS坡度的提取
  19. 解析:百度算法之飓风算法3.0
  20. CIO40知识星球—读书系列3(听书习惯)

热门文章

  1. python实现 Floyd算法求解最短路径距离问题
  2. 深度学习软件资源列表
  3. 2021-08-08 事务的提交,回滚
  4. java热门框架_java今年最流行的3大框架
  5. PHP中的e标签和em标签一样吧,html em标签的作用
  6. java双向链表结构_【Java数据结构】2.3双向链表的迭代实现
  7. c# 标准正太分布函数_数据处理中0-1规范化和标准化
  8. Java--ArrayList的遍历
  9. 中柏平板电脑安linux,中柏平板电脑重装系统
  10. web 前端签名插件_10款前端开发神器,助你成前端高手?