您所在的位置: 首页>>读书频道>>设计开发>>.Net系列>>

6.4 运算符重载

http://book.51cto.com  2007-12-14 14:33  Christian Nagel等著 李铭 译 黄静 审校  清华大学出版社  我要评论(0)
  • 摘要:《C#2005&.NET_3.0高级编程》(第5版)第六章介绍的是基本语言元素和C#语言的扩展功能。本文主要介绍的是运算符重载。
  • 标签:C#  .NET  运算符  C++  C#2005&.NET_3.0高级编程

6.4  运算符重载

本节将介绍为类或结构定义的另一种类型的成员:运算符重载。

C++开发人员应很熟悉运算符重载。但是,因为这个概念对Java和VB开发人员来说是全新的,所以这里要解释一下。C++开发人员可以直接跳到主要示例上。

运算符重载的关键是在类实例上不能总是调用方法或属性,有时还需要做一些其他的工作,例如对数值进行相加、相乘或逻辑操作,如比较对象等。假定要定义一个类,表示一个数学矩阵,在数学中,矩阵可以相加和相乘,就像数字一样。所以可以编写下面的代码:

Matrix a, b, c;
// assume a, b and c have been initialized 
Matrix d = c * (a + b);

通过重载运算符,就可以告诉编译器,+和*对Matrix对象进行什么操作,以编写上面的代码。如果用不支持运算符重载的语言编写代码,就必须定义一个方法,以执行这些操作,结果肯定不太直观,如下所示。

Matrix d = c.Multiply(a.Add(b));

学习到现在,像+和*这样的运算符只能用于预定义的数据类型,原因很简单:编译器认为所有常见的运算符都是用于这些数据类型的,例如,它知道如何把两个long加起来,或者如何从一个double中减去另一个double,并生成合适的中间语言代码。但在定义自己的类或结构时,必须告诉编译器:什么方法可以调用,每个实例存储了什么字段等所有的信息。同样,如果要在自己的类上使用运算符,就必须告诉编译器相关的运算符在这个类中的含义。此时就要定义运算符重载。

要强调的另一个问题是重载不仅仅限于算术运算符。还需要考虑比较运算符 ==、<、>、!=、>=和<=。例如,语句if(a==b)。对于类,这个语句在默认状态下会比较引用a和b,检测这两个引用是否指向内存中的同一个地址,而不是检测两个实例是否包含相同的数据。对于string类,这种操作就会重写,比较字符串实际上就是比较每个字符串的内容。可以对自己的类进行这样的操作。对于结构,==运算符在默认状态下不做任何工作。试图比较两个结构,看看它们是否相等,就会产生一个编译错误,除非显式重载了==,告诉编译器如何进行比较。

在许多情况下,重载运算符允许生成可读性更高、更直观的代码,包括:

● 在数学领域中,几乎包括所有的数学对象:坐标、矢量、矩阵、张量和函数等。如果编写一个程序执行某些数学或物理建模,肯定会用类表示这些对象。

● 图形程序在计算屏幕上的位置时,也使用数学或相关的坐标对象。

● 表示大量金钱的类(例如,在财务程序中)。

● 字处理或文本分析程序也有表示语句、子句等的类,可以使用运算符把语句连接在一起(这是字符串连接的一种比较复杂的版本)。

另外,有许多类与运算符重载并不相关。不恰当地使用运算符重载,会使使用类型的代码很难理解。例如,把两个DateTime对象相乘,在概念上没有任何意义。

【责任编辑:董书 TEL:(010)68476606】

回书目   上一节   下一节
C++是垃圾语言?!
VC++基础开发专题
C#实用基础教程
专题:ASP.NET 2.0基础开发指南
.NET移动与嵌入式技术专题
 
 验证码: (点击刷新验证码)   匿名发表
  • Visual C++ 完全自学宝典

  • 作者:强锋科技,朱洪波
  • Visual C++ 6.0是微软公司为程序人员提供的Visual Studio 6.0工具套件中的重要组成部分。本书由浅入深地介绍使用Visual C++ 6.0..
Copyright©2005-2008 51CTO.COM 版权所有