您可以重定义或重载 C# 中内置的运算符。因此,程序员也可以使用用户自定义类型的运算符。重载运算符是具有特殊名称的函数,是通过关键字 operator 后跟运算符的符号来定义的。与其他函数一样,重载运算符有返回类型和参数列表。

  1. public static Box operator+ (Box b, Box c)
  2. {
  3. Box box = new Box();
  4. box.length = b.length + c.length;
  5. box.breadth = b.breadth + c.breadth;
  6. box.height = b.height + c.height;
  7. return box;
  8. }

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

可重载和不可重载运算符

运算符

描述

+, -, !, ~, ++, --

这些一元运算符只有一个操作数,且可以被重载。

+, -, *, /, %

这些二元运算符带有两个操作数,且可以被重载。

==, !=, <, >, <=, >=

这些比较运算符可以被重载。

&&, ||

这些条件逻辑运算符不能被直接重载。

+=, -=, *=, /=, %=

这些赋值运算符不能被重载。

=, ., ?:, ->, new, is, sizeof, typeof

这些运算符不能被重载。

  1. using System;
  2.  
  3. namespace OperatorOvlApplication
  4. {
  5. class Box
  6. {
  7. private double length; // 长度
  8. private double breadth; // 宽度
  9. private double height; // 高度
  10.  
  11. public double getVolume()
  12. {
  13. return length * breadth * height;
  14. }
  15. public void setLength( double len )
  16. {
  17. length = len;
  18. }
  19.  
  20. public void setBreadth( double bre )
  21. {
  22. breadth = bre;
  23. }
  24.  
  25. public void setHeight( double hei )
  26. {
  27. height = hei;
  28. }
  29. // 重载 + 运算符来把两个 Box 对象相加
  30. public static Box operator+ (Box b, Box c)
  31. {
  32. Box box = new Box();
  33. box.length = b.length + c.length;
  34. box.breadth = b.breadth + c.breadth;
  35. box.height = b.height + c.height;
  36. return box;
  37. }
  38.  
  39. public static bool operator == (Box lhs, Box rhs)
  40. {
  41. bool status = false;
  42. if (lhs.length == rhs.length && lhs.height == rhs.height
  43. && lhs.breadth == rhs.breadth)
  44. {
  45. status = true;
  46. }
  47. return status;
  48. }
  49. public static bool operator !=(Box lhs, Box rhs)
  50. {
  51. bool status = false;
  52. if (lhs.length != rhs.length || lhs.height != rhs.height
  53. || lhs.breadth != rhs.breadth)
  54. {
  55. status = true;
  56. }
  57. return status;
  58. }
  59. public static bool operator <(Box lhs, Box rhs)
  60. {
  61. bool status = false;
  62. if (lhs.length < rhs.length && lhs.height
  63. < rhs.height && lhs.breadth < rhs.breadth)
  64. {
  65. status = true;
  66. }
  67. return status;
  68. }
  69.  
  70. public static bool operator >(Box lhs, Box rhs)
  71. {
  72. bool status = false;
  73. if (lhs.length > rhs.length && lhs.height
  74. > rhs.height && lhs.breadth > rhs.breadth)
  75. {
  76. status = true;
  77. }
  78. return status;
  79. }
  80.  
  81. public static bool operator <=(Box lhs, Box rhs)
  82. {
  83. bool status = false;
  84. if (lhs.length <= rhs.length && lhs.height
  85. <= rhs.height && lhs.breadth <= rhs.breadth)
  86. {
  87. status = true;
  88. }
  89. return status;
  90. }
  91.  
  92. public static bool operator >=(Box lhs, Box rhs)
  93. {
  94. bool status = false;
  95. if (lhs.length >= rhs.length && lhs.height
  96. >= rhs.height && lhs.breadth >= rhs.breadth)
  97. {
  98. status = true;
  99. }
  100. return status;
  101. }
  102. public override string ToString()
  103. {
  104. return String.Format("({0}, {1}, {2})", length, breadth, height);
  105. }
  106.  
  107. }
  108.  
  109. class Tester
  110. {
  111. static void Main(string[] args)
  112. {
  113. Box Box1 = new Box(); // 声明 Box1,类型为 Box
  114. Box Box2 = new Box(); // 声明 Box2,类型为 Box
  115. Box Box3 = new Box(); // 声明 Box3,类型为 Box
  116. Box Box4 = new Box();
  117. double volume = 0.0; // 体积
  118.  
  119. // Box1 详述
  120. Box1.setLength(6.0);
  121. Box1.setBreadth(7.0);
  122. Box1.setHeight(5.0);
  123.  
  124. // Box2 详述
  125. Box2.setLength(12.0);
  126. Box2.setBreadth(13.0);
  127. Box2.setHeight(10.0);
  128.  
  129. // 使用重载的 ToString() 显示两个盒子
  130. Console.WriteLine("Box1: {0}", Box1.ToString());
  131. Console.WriteLine("Box2: {0}", Box2.ToString());
  132.  
  133. // Box1 的体积
  134. volume = Box1.getVolume();
  135. Console.WriteLine("Box1 的体积: {0}", volume);
  136.  
  137. // Box2 的体积
  138. volume = Box2.getVolume();
  139. Console.WriteLine("Box2 的体积: {0}", volume);
  140.  
  141. // 把两个对象相加
  142. Box3 = Box1 + Box2;
  143. Console.WriteLine("Box3: {0}", Box3.ToString());
  144. // Box3 的体积
  145. volume = Box3.getVolume();
  146. Console.WriteLine("Box3 的体积: {0}", volume);
  147.  
  148. //comparing the boxes
  149. if (Box1 > Box2)
  150. Console.WriteLine("Box1 大于 Box2");
  151. else
  152. Console.WriteLine("Box1 不大于 Box2");
  153. if (Box1 < Box2)
  154. Console.WriteLine("Box1 小于 Box2");
  155. else
  156. Console.WriteLine("Box1 不小于 Box2");
  157. if (Box1 >= Box2)
  158. Console.WriteLine("Box1 大于等于 Box2");
  159. else
  160. Console.WriteLine("Box1 不大于等于 Box2");
  161. if (Box1 <= Box2)
  162. Console.WriteLine("Box1 小于等于 Box2");
  163. else
  164. Console.WriteLine("Box1 不小于等于 Box2");
  165. if (Box1 != Box2)
  166. Console.WriteLine("Box1 不等于 Box2");
  167. else
  168. Console.WriteLine("Box1 等于 Box2");
  169. Box4 = Box3;
  170. if (Box3 == Box4)
  171. Console.WriteLine("Box3 等于 Box4");
  172. else
  173. Console.WriteLine("Box3 不等于 Box4");
  174.  
  175. Console.ReadKey();
  176. }
  177. }
  178. }
  1. Box1 (, , )
  2. Box2 (, , )
  3. Box1 的体积:
  4. Box2 的体积:
  5. Box3 (, , )
  6. Box3 的体积:
  7. Box1 不大于 Box2
  8. Box1 小于 Box2
  9. Box1 不大于等于 Box2
  10. Box1 小于等于 Box2
  11. Box1 不等于 Box2
  12. Box3 等于 Box4

注意:一般重载过“==”和“!=”运算符的类,也要重写Object.GetHashCode()和Object.Equals(object o),上例中未实现。

[No0000F9]C# 运算符重载的更多相关文章

  1. C++ 运算符重载时,将运算符两边对象交换问题.

    在C++进行运算符重载时, 一般来讲,运算符两边的对象的顺序是不能交换的. 比如下面的例子: #include <iostream> using namespace std; class ...

  2. C#高级编程笔记2016年10月12日 运算符重载

    1.运算符重载:运算符重重载的关键是在对象上不能总是只调用方法或属性,有时还需要做一些其他工作,例如,对数值进行相加.相乘或逻辑操作等.例如,语句if(a==b).对于类,这个语句在默认状态下会比较引 ...

  3. C++运算符重载

    C++运算符重载 基本知识 重载的运算符是具有特殊名字的函数,他们的名字由关键字operator和其后要定义的运算符号共同组成. 运算符可以重载为成员函数和非成员函数.当一个重载的运算符是成员函数时, ...

  4. 标准C++之运算符重载和虚表指针

    1 -> *运算符重载 //autoptr.cpp     #include<iostream> #include<string> using namespace std ...

  5. python运算符重载

    python运算符重载就是在解释器使用对象内置操作前,拦截该操作,使用自己写的重载方法. 重载方法:__init__为构造函数,__sub__为减法表达式 class Number: def __in ...

  6. PoEduo - C++阶段班【Po学校】-Lesson03-5_运算符重载- 第7天

    PoEduo - Lesson03-5_运算符重载- 第7天 复习前面的知识点 空类会自动生成哪些默认函数 6个默认函数    1  构造  2  析构   3  赋值  4 拷贝构造  5 oper ...

  7. 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换

    [源码下载] 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 运算符重载 自 ...

  8. 我的c++学习(8)运算符重载和友元

    运算符的重载,实际是一种特殊的函数重载,必须定义一个函数,并告诉C++编译器,当遇到该运算符时就调用此函数来行使运算符功能.这个函数叫做运算符重载函数(常为类的成员函数). 方法与解释 ◆ 1.定义运 ...

  9. c/c++面试题(6)运算符重载详解

    1.操作符函数: 在特定条件下,编译器有能力把一个由操作数和操作符共同组成的表达式,解释为对 一个全局或成员函数的调用,该全局或成员函数被称为操作符函数.该全局或成员函数 被称为操作符函数.通过定义操 ...

随机推荐

  1. unix缓冲

    目的:尽量减少read,write调用的次数. 标准IO提供3种IO: 1.全缓冲.在填满IO缓冲区后才进行实际的IO操作. 2.行缓冲.当输入和输出遇到换行符时,执行IO操作.(设计终端) 3.不带 ...

  2. Eureka微服务ID

    Instance ID用于唯一标识注册到Eureka Server上的微服务实例.我们可在Eureka Server的首页直观地看到各个微服务的Instance ID.例如,图11-1中的itmuch ...

  3. PHP —— 识别运算符实现逻辑比较

    最近遇到一个功能的开发,大致意思就是根据用户输入的条件,进行相关的比较操作.本来打算使用用户选择运算符的方式,但是后来结合项目实际,发现需要使用用户输入的自定义运算比较现实一点.大致意思就是: 1.用 ...

  4. CentOS 7 配置HTTPS加密访问SVN

    上一篇文章已经介绍了如何在CentOS7环境下安装SVN并整合HTTP访问 http://www.cnblogs.com/fjping0606/p/7581093.html 那么本文则介绍如何添加HT ...

  5. SpringBoot普通类中如何获取其他bean例如Service、Dao(转)

    工具类 import org.springframework.beans.BeansException; import org.springframework.context.ApplicationC ...

  6. spring data jpa 查询自定义字段,转换为自定义实体

    目标:查询数据库中的字段,然后转换成 JSON 格式的数据,返回前台. 环境:idea 2016.3.4, jdk 1.8, mysql 5.6, spring-boot 1.5.2 背景:首先建立 ...

  7. Retrofit/Okhttp API接口加固技术实践(上)

    作者:Tamic 地址:http://blog.csdn.net/sk719887916/article/details/61914609 写这篇文章,我纠结了非常久,究竟是属于app安全系列,还是属 ...

  8. json 字符串包含数组转换为object对象是报异常java.lang.ClassCastException: net.sf.ezmorph.bean.MorphDynaBean cannot be cast to

    前台传到后台的json字符串 前台实现这种格式json字符串方式: function contentFun(){ respType = respTypeFun(); return "{\&q ...

  9. mysql delete两种关联删除方式

    基本格式:  DELETE t1 FROM t1,t2 WHERE t1.id=t2.id 或 DELETE FROM t1 USING t1,t2 WHERE t1.id=t2.id  示例应用: ...

  10. 浅谈JavaScript对象数组根据某属性sort升降序排序

    1.自定义一个比较器,其参数为待排序的属性. 2.将带参数的比较器传入sort(). var data = [ {name: "Bruce", age: 23, id: 16, s ...