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

    /* 很好的字符串 比较方法 很多个字符串 组成的 数字 需要最大 然后 比较 a和b 是 比较a+b 和b+a 的大小 */ #include<cstdio> #include<s ...

  2. fiddler——一款莱斯的抓包工具

    进行页面和接口调试时候,好使得抓包工具还是有作用得,如postman,fiddler,相比,postman更适合用来接口调试和与其他人一起联调,而抓包监控web得时候我更喜欢用fiddler: 当然, ...

  3. Linux服务器---安装bind

    安装bind 1.安装bind软件,需要安装3 个bind.bind-chroot.bind-util [root@localhost pub]# yum install -y bind bind-c ...

  4. Shell脚本实现检测某ip网络畅通情况,实战用例

    Shell脚本实现检测某ip网络畅通情况,实战用例 环境准备,linux shell 发送email 邮件:1.安装sendmailyum -y install sendmail安装好sendmail ...

  5. Linux中Postfix反病毒和垃圾邮件工具(十)

    amavisd-new amavisd-new呼叫器是一个连接MTA和内容检测工具(诸如病毒扫描工具和SpamAssassin)的高性能接口程序,使用perl语言写成.它一般通过SMTP.ESMTP或 ...

  6. web前端----html基础

    一.初始html 1.web服务本质 import socket sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM) sock.bind((&q ...

  7. .net Core 中将原MVC中的 MvcHtmlString转换

    public static IHtmlContent CustomLabelFor<TModel, TProperty>(this IHtmlHelper helper, Expressi ...

  8. 关于编译安装php

    之前也装过一次是nginx和php的, 这次也是... but, 不知道是不是版本的问题还是环境方面的影响, 导致之前的gd库是安装失败的, 所以上次安装zabbix也是失败的, 这次换了5.6.2版 ...

  9. 20145330 《网络对抗》PC平台逆向破解:注入shellcode 和 Return-to-libc 攻击实验

    20145330 <网络对抗>PC平台逆向破解:注入shellcode 实验步骤 1.用于获取shellcode的C语言代码 2.设置环境 Bof攻击防御技术 需要手动设置环境使注入的sh ...

  10. 前端开发环境全面配置 --- mac OS

    Mac 开发配置 brew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install ...