https://www.yiibai.com/csharp/csharp_operator_overloading.html

在C#中,可以重新定义或重载大多数内置运算符。 因此,程序员也可以使用具有用户定义类型的运算符。重载运算符是具有特殊名称的功能,关键字operator后跟定义运算符的符号。 类似于任何其他函数定义,重载运算符具有返回类型和参数列表。

例如,通过以下示例函数:

public static Box operator+ (Box b, Box c)
{Box box = new Box();box.length = b.length + c.length;box.breadth = b.breadth + c.breadth;box.height = b.height + c.height;return box;
}

C#

上述函数为用户自定义Box类实现加法运算符(+)。它实现相加两个Box对象的属性,并返回生成的Box对象。

实现操作符重载

以下程序显示了完整的实现:

using System;
namespace OperatorOvlApplication
{class Box{private double length;   // Length of a boxprivate double breadth;  // Breadth of a boxprivate double height;   // Height of a boxpublic double getVolume(){return length * breadth * height;}public void setLength(double len){length = len;}public void setBreadth(double bre){breadth = bre;}public void setHeight(double hei){height = hei;}// Overload + operator to add two Box objects.public static Box operator +(Box b, Box c){Box box = new Box();box.length = b.length + c.length;box.breadth = b.breadth + c.breadth;box.height = b.height + c.height;return box;}}class Tester{static void Main(string[] args){Box Box1 = new Box();   // Declare Box1 of type BoxBox Box2 = new Box();   // Declare Box2 of type BoxBox Box3 = new Box();   // Declare Box3 of type Boxdouble volume = 0.0;    // Store the volume of a box here// box 1 specificationBox1.setLength(60.0);Box1.setBreadth(70.0);Box1.setHeight(50.0);// box 2 specificationBox2.setLength(121.0);Box2.setBreadth(133.0);Box2.setHeight(110.0);// volume of box 1volume = Box1.getVolume();Console.WriteLine("Volume of Box1 : {0}", volume);// volume of box 2volume = Box2.getVolume();Console.WriteLine("Volume of Box2 : {0}", volume);// Add two object as follows:Box3 = Box1 + Box2;// volume of box 3volume = Box3.getVolume();Console.WriteLine("Volume of Box3 : {0}", volume);Console.ReadKey();}}
}

C#

当编译和执行上述代码时,会产生以下结果:

Volume of Box1 : 210000
Volume of Box2 : 1770230
Volume of Box3 : 5878880

Shell

可重载和不可重载的运算符

下表描述了 C# 中重载的运算符:

操作符 描述
+, -, !, ~, ++, -- 这些一元运算符需要一个操作数,并且可以重载。
+, -, *, /, % 这些二进制运算符取一个操作数并且可以重载。
==, !=, <, >, <=, >= 这些比较运算符都可以重载
&&, // 条件逻辑运算符不能直接重载。
+=-=,*=/=%= 赋值运算符不能被重载。
=, ., ?:, ->, new, is, sizeof, typeof 这些运算符不能重载。

示例

根据上述讨论,我们来扩展上面的例子,并且重载更多的运算符:

using System;
namespace OperatorOvlApplication
{class Box{private double length;    // Length of a boxprivate double breadth;   // Breadth of a boxprivate double height;    // Height of a boxpublic double getVolume(){return length * breadth * height;}public void setLength( double len ){length = len;}public void setBreadth( double bre ){breadth = bre;}public void setHeight( double hei ){height = hei;}// Overload + operator to add two Box objects.public static Box operator+ (Box b, Box c){Box box = new Box();box.length = b.length + c.length;box.breadth = b.breadth + c.breadth;box.height = b.height + c.height;return box;}public static bool operator == (Box lhs, Box rhs){bool status = false;if (lhs.length == rhs.length && lhs.height == rhs.height && lhs.breadth == rhs.breadth){status = true;}return status;}public static bool operator !=(Box lhs, Box rhs){bool status = false;if (lhs.length != rhs.length || lhs.height != rhs.height || lhs.breadth != rhs.breadth){status = true;}return status;}public static bool operator <(Box lhs, Box rhs){bool status = false;if (lhs.length < rhs.length && lhs.height < rhs.height && lhs.breadth < rhs.breadth){status = true;}return status;}public static bool operator >(Box lhs, Box rhs){bool status = false;if (lhs.length > rhs.length && lhs.height > rhs.height && lhs.breadth > rhs.breadth){status = true;}return status;}public static bool operator <=(Box lhs, Box rhs){bool status = false;if (lhs.length <= rhs.length && lhs.height <= rhs.height && lhs.breadth <= rhs.breadth){status = true;}return status;}public static bool operator >=(Box lhs, Box rhs){bool status = false;if (lhs.length >= rhs.length && lhs.height >= rhs.height && lhs.breadth >= rhs.breadth){status = true;}return status;}public override string ToString(){return String.Format("({0}, {1}, {2})", length, breadth, height);}}class Tester{static void Main(string[] args){Box Box1 = new Box();   // Declare Box1 of type BoxBox Box2 = new Box();   // Declare Box2 of type BoxBox Box3 = new Box();   // Declare Box3 of type BoxBox Box4 = new Box();double volume = 0.0;    // Store the volume of a box here// box 1 specificationBox1.setLength(6.0);Box1.setBreadth(7.0);Box1.setHeight(5.0);// box 2 specificationBox2.setLength(12.0);Box2.setBreadth(13.0);Box2.setHeight(10.0);//displaying the Boxes using the overloaded ToString():Console.WriteLine("Box 1: {0}", Box1.ToString());Console.WriteLine("Box 2: {0}", Box2.ToString());// volume of box 1volume = Box1.getVolume();Console.WriteLine("Volume of Box1 : {0}", volume);// volume of box 2volume = Box2.getVolume();Console.WriteLine("Volume of Box2 : {0}", volume);// Add two object as follows:Box3 = Box1 + Box2;Console.WriteLine("Box 3: {0}", Box3.ToString());// volume of box 3volume = Box3.getVolume();Console.WriteLine("Volume of Box3 : {0}", volume);//comparing the boxesif (Box1 > Box2)Console.WriteLine("Box1 is greater than Box2");elseConsole.WriteLine("Box1 is  greater than Box2");if (Box1 < Box2)Console.WriteLine("Box1 is less than Box2");elseConsole.WriteLine("Box1 is not less than Box2");if (Box1 >= Box2)Console.WriteLine("Box1 is greater or equal to Box2");elseConsole.WriteLine("Box1 is not greater or equal to Box2");if (Box1 <= Box2)Console.WriteLine("Box1 is less or equal to Box2");elseConsole.WriteLine("Box1 is not less or equal to Box2");if (Box1 != Box2)Console.WriteLine("Box1 is not equal to Box2");elseConsole.WriteLine("Box1 is not greater or equal to Box2");Box4 = Box3;if (Box3 == Box4)Console.WriteLine("Box3 is equal to Box4");elseConsole.WriteLine("Box3 is not equal to Box4");Console.ReadKey();}}
}

C#

当编译和执行上述代码时,会产生以下结果:

Box 1: (6, 7, 5)
Box 2: (12, 13, 10)
Volume of Box1 : 210
Volume of Box2 : 1560
Box 3: (18, 20, 15)
Volume of Box3 : 5400
Box1 is not greater than Box2
Box1 is less than Box2
Box1 is not greater or equal to Box2
Box1 is less or equal to Box2
Box1 is not equal to Box2
Box3 is equal to Box4

//原文出自【易百教程】,商业转载请联系作者获得授权,非商业转载请保留原文链接:https://www.yiibai.com/csharp/csharp_operator_overloading.html

【转】C#运算符重载**相关推荐

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

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

  2. groovy–运算符重载

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

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

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

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

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

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

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

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

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

  7. C++中的运算符重载基础

    1.C++中的运算符重载基础 所谓重载,就是赋予新的含义.函数重载(Function Overloading)可以让一个函数名有多种功能,在不同情况下进行不同的操作.运算符重载(Operator Ov ...

  8. C++中的运算符重载

    1.Cpp中的重载运算符和重载函数 C++允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载.重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但 ...

  9. C++搞懂深拷贝初始化=与赋值(运算符重载)=的区别

    C++搞懂深拷贝初始化=与赋值(运算符重载)=的区别 C++构造函数用=与()不完全一样,注意使用=时c++中临时变量不能作为非const的引用参数,不论是=运算符重载还是构造函数,否则可能出现以下错 ...

  10. C++——运算符重载operator

    C++--运算符重载operator C++ prime plus第11章,运算符重载是C++的一种多态.运算符重载格式如下: operator运算符(argument-list) 1.做普通函数重载 ...

最新文章

  1. 机器学习知识点(三)方差和标准差Java实现
  2. 正式发布python版本的年份_飞书首次举办产品发布会,新版本“”正式发布
  3. 电路邱关源第五版pdf_硬件狗教你学电路【二】:电路分析方法
  4. 【翻译】Ext JS 4——Ajax和Rest代理处理服务器端一场和消息的方法
  5. python爬取网页有乱码怎么解决_Python爬取网页requests乱码
  6. python os.system
  7. Java中利用package机制实现条件编译
  8. vue.js基础知识篇(1):简介、数据绑定
  9. coolfire文章之五
  10. it人才计算机知识题,Excel试题_电脑基础知识_IT/计算机_专业资料
  11. 自己用qt编写的图片查看器
  12. logline: 是时候聊一聊前端的日志了
  13. oracle 查表里的字段名称和备注名称
  14. js 实现按指定个数分割数组
  15. HTTP、HTTPS
  16. 单机斗地主之完整功能初版
  17. ESP-IDF遇到的关于环境变量的问题
  18. 搞一下AP AUTOSAR应用 | A1 从SOA-RM 到 SOA 到 AP AUTOSAR 应用
  19. 【GNSS】GNSS处理中的时间系统
  20. 【新产品】钰泰推出新料号ETA9030,双向通讯,高耐压,还有TWS传奇料号三合一ETA9698/ETA6093

热门文章

  1. HBase 2.0版本正式发布
  2. python 主函数 输入
  3. Jmeter_http request的简单设置和应用
  4. 安防摄像头Onvif、RTSP、GB28181转web无插件直播卡顿分析
  5. UE3客户端服务器GamePlay框架
  6. ASP.NET MVC5(一):ASP.NET MVC概览
  7. Swift3 Scanner用法之判断是否数字、提取字符串里的数字
  8. DevExpress.Utils.ToolTipLocation
  9. 什么是CouchDB?
  10. java jlabel里面加button_在Java Swing中通过JLabel覆盖JButton?