C# 运算符重载

  您可以重定义或重载 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;

  }

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

  运算符重载的实现

  下面的程序演示了完整的实现:

  using System;

  namespace OperatorOvlApplication

  {

  class Box

  {

  private double length; // 长度

  private double breadth; // 宽度

  private double height; // 高度

  public 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;

  }

  // 重载 + 运算符来把两个 Box 对象相加

  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(); // 声明 Box1,类型为 Box

  Box Box2 = new Box(); // 声明 Box2,类型为 Box

  Box Box3 = new Box(); // 声明 Box3,类型为 Box

  double volume = 0.0; // 体积

  // Box1 详述

  Box1.setLength(6.0);

  Box1.setBreadth(7.0);

  Box1.setHeight(5.0);

  // Box2 详述

  Box2.setLength(12.0);

  Box2.setBreadth(13.0);

  Box2.setHeight(10.0);

  // Box1 的体积

  volume = Box1.getVolume();

  Console.WriteLine("Box1 的体积: {0}", volume);

  // Box2 的体积

  volume = Box2.getVolume();

  Console.WriteLine("Box2 的体积: {0}", volume);

  // 把两个对象相加

  Box3 = Box1 + Box2;

  // Box3 的体积

  volume = Box3.getVolume();

  Console.WriteLine("Box3 的体积: {0}", volume);

  Console.ReadKey();

  }

  }

  }

  当上面的代码被编译和执行时,它会产生下列结果:

  Box1 的体积: 210

  Box2 的体积: 1560

  Box3 的体积: 5400

  可重载和不可重载运算符

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

  运算符描述

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

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

  ==, !=, <, >, <=, >=这些比较运算符可以被重载。

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

  +=, -=, *=, /=, %=这些赋值运算符不能被重载。

  =, ., ?:, ->, new, is, sizeof, typeof这些运算符不能被重载。

  实例

  针对上述讨论,让我们扩展上面的实例,重载更多的运算符:

  using System;

  namespace OperatorOvlApplication

  {

  class Box

  {

  private double length; // 长度

  private double breadth; // 宽度

  private double height; // 高度

  public 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;

  }

  // 重载 + 运算符来把两个 Box 对象相加

  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(); // 声明 Box1,类型为 Box

  Box Box2 = new Box(); // 声明 Box2,类型为 Box

  Box Box3 = new Box(); // 声明 Box3,类型为 Box

  Box Box4 = new Box();

  double volume = 0.0; // 体积

  // Box1 详述

  Box1.setLength(6.0);

  Box1.setBreadth(7.0);

  Box1.setHeight(5.0);

  // Box2 详述

  Box2.setLength(12.0);

  Box2.setBreadth(13.0);

  Box2.setHeight(10.0);

  // 使用重载的 ToString() 显示两个盒子

  Console.WriteLine("Box1: {0}", Box1.ToString());

  Console.WriteLine("Box2: {0}", Box2.ToString());

  // Box1 的体积

  volume = Box1.getVolume();

  Console.WriteLine("Box1 的体积: {0}", volume);

  // Box2 的体积

  volume = Box2.getVolume();

  Console.WriteLine("Box2 的体积: {0}", volume);

  // 把两个对象相加

  Box3 = Box1 + Box2;

  Console.WriteLine("Box3: {0}", Box3.ToString());

  // Box3 的体积

  volume = Box3.getVolume();

  Console.WriteLine("Box3 的体积: {0}", volume);

  //comparing the boxes

  if (Box1 > Box2)

  Console.WriteLine("Box1 大于 Box2");

  else

  Console.WriteLine("Box1 不大于 Box2");

  if (Box1 < Box2)

  Console.WriteLine("Box1 小于 Box2");

  else

  Console.WriteLine("Box1 不小于 Box2");

  if (Box1 >= Box2)

  Console.WriteLine("Box1 大于等于 Box2");

  else

  Console.WriteLine("Box1 不大于等于 Box2");

  if (Box1 <= Box2)

  Console.WriteLine("Box1 小于等于 Box2");

  else

  Console.WriteLine("Box1 不小于等于 Box2");

  if (Box1 != Box2)

  Console.WriteLine("Box1 不等于 Box2");

  else

  Console.WriteLine("Box1 等于 Box2");

  Box4 = Box3;

  if (Box3 == Box4)

  Console.WriteLine("Box3 等于 Box4");

  else

  Console.WriteLine("Box3 不等于 Box4");

  Console.ReadKey();

  }

  }

  }

  当上面的代码被编译和执行时,它会产生下列结果:

  Box1: (6, 7, 5)

  Box2: (12, 13, 10)

  Box1 的体积: 210

  Box2 的体积: 1560

  Box3: (18, 20, 15)

  Box3 的体积: 5400

  Box1 不大于 Box2

  Box1 小于 Box2

  Box1 不大于等于 Box2

  Box1 小于等于 Box2

  Box1 不等于 Box2

  Box3 等于 Box4

  本文转载自:w3cschool(编辑:雷林鹏 来源:网络)

雷林鹏分享:C# 运算符重载的更多相关文章

  1. 雷林鹏分享:C# 运算符

    C# 运算符 运算符是一种告诉编译器执行特定的数学或逻辑操作的符号.C# 有丰富的内置运算符,分类如下: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 杂项运算符 本教程将逐一讲解算术运算 ...

  2. 雷林鹏分享:Ruby 运算符

    Ruby 运算符 Ruby 支持一套丰富的运算符.大多数运算符实际上是方法调用.例如,a + b 被解释为 a.+(b),其中指向变量 a 的 + 方法被调用,b 作为方法调用的参数. 对于每个运算符 ...

  3. 雷林鹏分享:C# 类(Class)

    C# 类(Class) 当您定义一个类时,您定义了一个数据类型的蓝图.这实际上并没有定义任何的数据,但它定义了类的名称意味着什么,也就是说,类的对象由什么组成及在这个对象上可执行什么操作.对象是类的实 ...

  4. 雷林鹏分享:C# 多态性

    C# 多态性 多态性意味着有多重形式.在面向对象编程范式中,多态性往往表现为"一个接口,多个功能". 多态性可以是静态的或动态的.在静态多态性中,函数的响应是在编译时发生的.在动态 ...

  5. 雷林鹏分享:C# 索引器(Indexer)

    C# 索引器(Indexer) 索引器(Indexer) 允许一个对象可以像数组一样被索引.当您为类定义一个索引器时,该类的行为就会像一个 虚拟数组(virtual array) 一样.您可以使用数组 ...

  6. 雷林鹏分享:Ruby 面向对象

    Ruby 面向对象 Ruby 是纯面向对象的语言,Ruby 中的一切都是以对象的形式出现.Ruby 中的每个值都是一个对象,即使是最原始的东西:字符串.数字,甚至连 true 和 false 都是对象 ...

  7. 雷林鹏分享:C# 类型转换

    C# 类型转换 类型转换从根本上说是类型铸造,或者说是把数据从一种类型转换为另一种类型.在 C# 中,类型铸造有两种形式: 隐式类型转换 - 这些转换是 C# 默认的以安全方式进行的转换.例如,从小的 ...

  8. 雷林鹏分享:C# 判断

    C# 判断 判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的). 下面是大多数编程语言中典型的判断结构的一般形式: 判断语句 C ...

  9. 雷林鹏分享:C# 可空类型(Nullable)

    C# 可空类型(Nullable) C# 可空类型(Nullable) C# 提供了一个特殊的数据类型,nullable 类型(可空类型),可空类型可以表示其基础值类型正常范围内的值,再加上一个 nu ...

随机推荐

  1. VS2010/MFC编程入门之五十四(Ribbon界面开发:使用更多控件并为控件添加消息处理函数)

    上一节中鸡啄米讲了为Ribbon Bar添加控件的方法.本节教程鸡啄米将继续完善前面的实例,讲解一些稍复杂的控件的添加方法,及如何为它们添加消息处理函数. 一.为Ribbon Bar添加更多Ribbo ...

  2. source的简单操作

    source五部曲 git工作流:建立新功能 更改文件后,提交 点击git工作流完成新功能 点击推送 点击拉取

  3. 20154312《网络对抗》Exp2 后门原理与实践

    常见问题快速链接 Handler failed to bind to xxx.xxx.xx.xxx:xxxx 使用Webcam_snap命令提示1411错误,无法正常拍照 常用后门工具实践 Windo ...

  4. CentOS 7 怎样自动连接网络

    https://jingyan.baidu.com/article/19192ad8f7c320e53e570728.html

  5. 20145337《网络对抗技术》Web安全基础实践

    20145337<网络对抗技术>Web安全基础实践 一.实验后回答问题 1.SQL注入攻击原理,如何防御 SQL注入攻击的本质是利用SQL语法,针对应用程序开发过程中的漏洞,从一个数据库获 ...

  6. 20165310 java_blog_week5

    # 2165310 <Java程序设计>第5周学习总结 教材学习内容总结 ch07内部类与异常类 内部类 - 继承外嵌类成员变量与方法 - 不可以声明类变量/类方法 - 不可以被外嵌类以外 ...

  7. Duilib初级控件扩展一例: 具有鼠标滚动消息的OptionUI

    转载:http://www.cnblogs.com/memset/p/Duilib_MouseWheelOptionUI_Deprecated.html

  8. Python3基础 response.getcode 得到http的状态 200表示正常

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  9. [SpringMVC] - 简单说明什么是SpringMVC

    M 代表 模型(Model)V 代表 视图(View) C 代表 控制器(controller) 模型是什么呢? 模型就是数据,就是dao,bean 视图是什么呢? 就是网页, JSP,用来展示模型中 ...

  10. [JVM] - 一份<自己动手写Java虚拟机>的测试版

    go语言下载 配置GOROOT(一般是自动的),配置GOPATH(如果想自己改的话) 参照<自己动手写Java虚拟机> > 第一章 指令集和解释器 生成了ch01.exe文件 这里还 ...