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. Perl中的正则表达式(五)

    正则表达式(Regular Expression),在Perl里边通常也叫做模式(Pattern),用来表示匹配(或不匹配)某个字符串的特征模板. 使用简单模式:若模式匹配的对象是$_的内容,只要把模 ...

  2. matplotlib显示中文

    [注意] 可能与本文主题无关,不过我还是想指出来:使用matplotlib库时,下面两种导入方式是等价的(我指的是等效,当然这个说法可以商榷:) import matplotlib.pyplot as ...

  3. Codeforces Round #247 (Div. 2) C D

    这题是一个背包问题 这样的 在一个k子树上 每个节点都有自己的k个孩子 然后 从原点走 走到 某个点的 和为 N 且每条的 长度不小于D 就暂停问这样的 路有多少条,  呵呵 想到了 这样做没有把他敲 ...

  4. linux常用命令:telnet 命令

    telnet命令通常用来远程登录.telnet程序是基于TELNET协议的远程登录客户端程序.Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式.它为用户 ...

  5. mysql函数之四:concat() mysql 多个字段拼接

    语法: COUNT(DISTINCT expr ,[expr ...]) 函数使用说明:返回不同的非NULL 值数目.若找不到匹配的项,则COUNT(DISTINCT) 返回 0 Mysql的查询结果 ...

  6. 斯坦福大学机器学习,EM算法求解高斯混合模型

    斯坦福大学机器学习,EM算法求解高斯混合模型.一种高斯混合模型算法的改进方法---将聚类算法与传统高斯混合模型结合起来的建模方法, 并同时提出的运用距离加权的矢量量化方法获取初始值,并采用衡量相似度的 ...

  7. 使用 jQuery 进行前端验证

    前段验证脚本的教程,其基础为jQuery的插件validate.    一.可以验证哪些信息 要求输入不能为空 要求输入格式必须为电子邮箱 要求输入格式必须为URL 要求输入格式必须为日期 要求输入格 ...

  8. appium— Android定位webView里面的UI元素

    Android SDK中的UIAutomator中本身是不支持网页中的UI元素定位,下面介绍几种常用的定位app内部的网页的UI元素的方法. 一.使用chrome浏览器调试移动端网页 这是使用最多的一 ...

  9. Python入门之面向对象的多态和继承

    本章内容 Python面向对象的多态和继承对比 ========================================= 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的 ...

  10. 20145122《JAVA开发环境的熟悉》实验报告

    package fib; public class fibonaci { public static void main(String[] args) { Fibonaci(20); } public ...