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. GNU

    1983年,理查德.斯托曼提出GNU计划(革奴计划),希望发展出一套完整的开放源代码操作系统来取代Unix,计划中的操作系统,名为GNU. 1989年,发表GNU通用公共许可协议(GPL).GPL条款 ...

  2. 20155333 2016-2017-2 《Java程序设计》第九周学习总结

    20155333 2016-2017-2 <Java程序设计>第九周学习总结 教材学习内容总结 JDBC(Java DataBase Connectivity) 驱动的四种类型 JDBC- ...

  3. Nuget的学习总结

    Nuget的学习总结 今天研究了一下nuget,发现nuget实在是太有用了,便写下了这篇博客,希望记录一下自己的学习历程,也希望技术圈的朋友看到之后,如果里面哪里写的不够好,可以给我些宝贵的意见,以 ...

  4. 论文笔记:2018 PRCV 顶会顶刊墙展

    Global Gated Mixture of Second-order Pooling for Imporving Deep Convolutional Neural Network(2018 NI ...

  5. PLSQL入门:cursor传参,loop fetch使用,if使用,单引号字符表示

    1.cursor传入参数 定义:cursor [cursor变量名称]([参数名称] [参数类型]) IS [SQL语句,可以使用传入参数] 例子:    cursor moTypeNames(dom ...

  6. python webdriver 从无到有搭建混合驱动自动化测试框架的过程和总结

    一步一步实现混合驱动自动化测试框架的搭建 混合驱动自动化测试框架,是一个非常高级的框架,非常好用,但也很难,不好掌握,需要多练习,就像搭建数据驱动框架一样,需要自己去一点一点的写,一边搭建一边做思路整 ...

  7. Django popup示例

    urls.py urlpatterns = [ url('popup_test1',views.popup_test1), url('popup_test2',views.popup_test2), ...

  8. NFS Iptables放行服务端口

    启动NFS会开启如下端口:1)portmapper 端口:111 udp/tcp:2)nfs/nfs_acl 端口:2049 udp/tcp:3)mountd 端口:"32768--6553 ...

  9. 05: jQuery

    目录: jQuery参考网站 W3school 1.1 JQuery作用 1.2 jQuery与DOM比较 与 相互转换 1.3 jQuery选择器 1.4 jQuery筛选与过滤 1.5 jQuer ...

  10. 20145106 java实验二

    1)复数类ComplexNumber的属性 m_dRealPart: 实部,代表复数的实数部分 m_dImaginPart: 虚部,代表复数的虚数部分 public class ComplexNumb ...