广告
返回顶部
首页 > 资讯 > 精选 >C#运算符重载是什么意思
  • 764
分享到

C#运算符重载是什么意思

2023-06-17 23:06:37 764人浏览 八月长安
摘要

这篇文章将为大家详细讲解有关C#运算符重载是什么意思,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。重载是面向对象中的一个重要概念,它是对象多态性的一种不完全体现,人们通常所说的重载,往往指的是函数的重载。

这篇文章将为大家详细讲解有关C#运算符重载是什么意思,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

重载是面向对象中的一个重要概念,它是对象多态性的一种不完全体现,人们通常所说的重载,往往指的是函数的重载。本文向读者介绍一种新的重载模型——运算符重载。

为什么需要C#运算符重载

函数的重载为一个对象上的相同行为提供不同的参数方式,这样,开发人员便可以使用这些不同的参数实现类似的功能。一组函数重载决策一般实现的功能是相同的,例如对 Object 对象上的 ToString() 方法就有几个重载版本,虽然它们接受的参数不同,但却都表达同一个行为的最终结果。参数的不同导致函数重载版本的签名不同,这样编译器很容易知道需要调用那一个重载版本。这种技术给开发人员带来了方便。

现在我们试图对重载的定义进行推广。先让我们看看最简单的例子,我们通常需要像这样声明并初始化一个值类型的变量:

int digit = 5;  string sayHello = "Hello, World";

这里的“=”运算符,就是将右边的值传递给左边变量的赋值运算符。这里,5 的类型为 int,“Hello, World”的类型为 string,这与左边被赋值的变量类型完全一致。

但对于上述的解释,我们还可以这样认为:5 的类型为 uint 或 byte,"Hello, World"的类型为 char[],那么如此一来,赋值运算左边和右边的类型就不在等同,那么编译器如何处理呢?有人会说,这就是“隐式类型转换”,这个答案确实很好,但隐式类型转换的规则已经被编译器确定,如果赋值运算的两端不遵循隐式类型转换规则,则需要显式类型转换,例如:

char c = '2';  string s = (string)c;  int i = (int)c;

这些显式类型转换并不适用于任何场合,也许人们希望在其自定义的类中也能用赋值、加减乘除等语法操作它们。

对象和对象之间是可能存在这种特殊的运算关系的,一个典型的例子就是“复数”对象。复数是一个值类型对象,它包含两个 double 类型的域,两个复数对象可以被加、减、乘、除和相等性判断,但无法比较大小。我们试想可以如此操作复数类:

Complex c1, c2;  c1 = new Complex(3, 4);  c2 = "4+5i";  var c3 = c1 * c2 / -c1 + c2;  if (c1 == c2) c3 = c1; else c3 = c2;

我们可以从这些代码可以预见C#运算符重载所需要实现的功能:

支持隐式类型转换和显式类型转换的重载决策。

支持基本二元运算符,如加、减、乘、除等。

支持基本一元运算符,如取负、取反、自增、自减等。

支持基本关系运算符,如大于、小于、等于和不等于等。

实现更加复杂的运算符,如三元运算、[]、()、位运算等。

事实上,运算符重载的提出就是为了解决这些问题。在 CLR 框架下的各种 CLR 语言,均不同程度的支持运算符重载。Visual Basic 在 8.0 版本上(也就是 Visual Studio 2005)也支持了运算符重载,运算符重载除了以上列出的优点外,还具备如下特点。

使得代码更加容易理解和阅读。

可以利用现有运算符的优先级关系规则处理对象之间的运算。

使得代码更加灵活,对象可操作性更好。

开发人员可以举一反三,因为他们熟悉了常规值类型上的运算符使用,这样可以直接将这些规则引入到自定义对象上。

下面我们通过介绍复数类的定义,来深入 C# 语言中的运算符重载。

C# 运算符重载决策示例

下面的例子定义一个 Complex 类,实现了复数加、减、乘和除的四则运算。C# 中定义常规运算符的语法如下:

[public | private | protected | internal | internal protected]    static <return type> | implicit | explicit operator  (  )

下面是C#运算符重载(C# 3.0) 代码。

    struct Complex      ...{          public double Real ...{ get; set; }          public double Imaginary ...{ get; set; }           public Complex(double real, double imaginary) : this() ...{                    this.Real = real; this.Imaginary = imaginary; }           public static Complex operator +(Complex c1, Complex c2)          ...{              return new Complex ...{ Real = c1.Real + c2.Real,                            Imaginary = c1.Imaginary + c2.Imaginary };          }           public static Complex operator -(Complex c1, Complex c2)          ...{              return new Complex ...{ Real = c1.Real - c2.Real,                         Imaginary = c1.Imaginary - c2.Imaginary };          }           public static Complex operator *(Complex c1, Complex c2)          ...{              return new Complex ...{ Real = c1.Real * c2.Real - c1.Imaginary * c2.Imaginary,                Imaginary = c1.Real * c2.Imaginary   - c1.Imaginary * c2.Real };          }           public static Complex operator /(Complex c1, Complex c2)          ...{              return new Complex ...{ Real = -c1.Real * c2.Real + c1.Imaginary * c2.Imaginary,              Imaginary = -c1.Real *   c2.Imaginary + c1.Imaginary * c2.Real };          }      }

由于C#运算符重载定义在定义它的对象实例上生效,所以可以改写 operator - 和 operator / 运算,使其更加简单。

public static Complex operator -(Complex c1, Complex c2)  ...{      return c1 + new Complex ...{ Real = c2.Real, Imaginary = c2.Imaginary };  }   public static Complex operator /(Complex c1, Complex c2)  ...{      return c1 * new Complex ...{ Real = -c2.Real, Imaginary = -c2.Imaginary };  }

这样我们就可以很方便的使用 Complex 类:

var c1 = new Complex(3, 4), c2 = new Complex(1, 2);  var c3 = c1 * c2;  Complex c4 = c1 - c2 / c3 + c1;

为了实现更加简单的赋值,我们还需要实现隐式类型转换(从 string 到 Complex)。

public static implicit operator Complex(string value)  ...{      value = value.TrimEnd('i');      string[] digits = value.Split('+', '-');      return new Complex ...{ Real = Convert.ToDouble(digits[0]),      Imaginary = Convert.ToDouble(digits[1]) };  }

可以通过如下代码对实例进行赋值。

Complex c = "4+5i";

在编译器生成这些运算符重载代码时,实际上会为每个已被重载运算符定义一个特殊名称的方法。如 operator +,其实等同于如下代码:

[SpecialName]  public static Complex op_Addition(Complex c1, Complex c2)  ...{      return new Complex ...{ Real = c1.Real + c2.Real,                Imaginary = c1.Imaginary + c2.Imaginary };  }

C# 运算符重载一览表

您可以在 C# 中对于以下运算符进行重载决策。

◆+, -, !, ~, ++, --, true, false

这些一元运算符可被重载。

◆+, -, *, /, %, &, |, ^, <<, >>

这些二元运算符可被重载。

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

这些关系运算符可被重载。

◆&&, ||

这些条件运算符不能被重载,但它们的值被 & 和 | 评估,而这两个运算符可以重载。

◆[]

数组运算符不能被重载,但您可以定义索引器。

◆()

转换运算符不能被重载,但您可以定义隐式类型转换和显式类型转换运算符。

◆+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=

这些赋值运算符不能被重载,但他们的值,如 +=,会被 + 评估,而 + 可以被重载。

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

这些运算符不能被重载。

关于“C#运算符重载是什么意思”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: C#运算符重载是什么意思

本文链接: https://www.lsjlt.com/news/294832.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#运算符重载是什么意思
    这篇文章将为大家详细讲解有关C#运算符重载是什么意思,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。重载是面向对象中的一个重要概念,它是对象多态性的一种不完全体现,人们通常所说的重载,往往指的是函数的重载。...
    99+
    2023-06-17
  • C++运算符重载限制是什么
    这期内容当中小编将会给大家带来有关C++运算符重载限制是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、重载限制上一篇我们讲了在类和结构体当中重载运算符,关于运算符的重载并不是随心所欲的。C++给出...
    99+
    2023-06-22
  • c++运算符重载的方法是什么
    C++中的运算符重载方法是通过定义特殊的成员函数来实现的。重载运算符的函数被称为运算符函数,它们具有特殊的命名规则和语法。一般情况下...
    99+
    2023-09-14
    c++
  • php运算符的意思是什么
    本文操作环境:Windows7系统、PHP7.1版、Dell G3电脑。php运算符的意思是什么?运算符是可以通过给出的一或多个值(用编程行话来说,表达式)来产生另一个值(因而整个结构成为一个表达式)的东西。运算符可按照其能接受几个值来分组...
    99+
    2019-04-13
    php
  • 什么是Python运算符重载
    这篇文章主要讲解了“什么是Python运算符重载 ”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“什么是Python运算符重载 ”吧!一、什么是Python中...
    99+
    2022-10-19
  • c++赋值运算符重载的方法是什么
    C++中赋值运算符重载的方法是通过重载赋值运算符(=)来实现的。赋值运算符重载允许在自定义类中使用赋值运算符进行对象之间的赋值操作。...
    99+
    2023-10-11
    c++
  • php运算符指的是什么意思
    这篇文章主要为大家展示了“php运算符指的是什么意思”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“php运算符指的是什么意思”这篇文章吧。php运算符是指可以通过给出的一或多个值来产生另一个值的...
    99+
    2023-06-22
  • php逻辑运算符是什么意思
    本教程操作环境:windows7系统、PHP7.1版、DELL G3电脑在php中,逻辑运算符是进行逻辑运算的一种符号。逻辑运算符用来组合逻辑运算的结果,是程序设计中一组非常重要的运算符。PHP中的逻辑运算符如下表所示:逻辑运算符示例何时结...
    99+
    2014-05-03
    php 逻辑运算符
  • go语言运算符%是什么意思
    在Go语言中,%运算符表示取模运算(求余运算)。它用于计算两个数相除之后的余数部分。例如:remainder := 10 % 3 // remainder的值为1,因为10除以3的余数是1。本教程操作系统:windows10系统、go1.2...
    99+
    2023-12-21
    go语言 运算符
  • C++重载运算符是实例分析
    本篇内容介绍了“C++重载运算符是实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!运算符实际上是一个函数,所以运算符的重载实际上是函数...
    99+
    2023-06-29
  • C++运算符重载怎么理解
    这期内容当中小编将会给大家带来有关C++运算符重载怎么理解,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。C++当中除了函数可以重载之外,其实运算符也是可以重载的。我们之前已经接触过一些,可能大家没有意识到...
    99+
    2023-06-22
  • C#怎么实现运算符重载
    本篇内容介绍了“C#怎么实现运算符重载”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!运算符重载的实现下面的程序演示了完整的实现:using&...
    99+
    2023-06-17
  • C#重载运算符怎么定义
    本文小编为大家详细介绍“C#重载运算符怎么定义”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#重载运算符怎么定义”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。C# 运算符重载您可以重定义或重载 C#...
    99+
    2023-06-17
  • C++中运算符重载怎么用
    这篇文章主要介绍C++中运算符重载怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!运算符重载为什么要使用运算符重载-C/C++的运算符,支持的数据类型,仅限于基本数据类型。问题:一头牛+一头马 = ?(牛马神兽?...
    99+
    2023-06-29
  • php中比较运算符是什么意思
    在php中,比较运算符是允许对两个值进行比较的一种符号;当用运算符比较两个值时,结果是一个逻辑值:TRUE(成立)或FALSE(不成立)。php比较运算符中,“==”和“===”可进行相等比较,“!=”、“<>”和“!==”可进...
    99+
    2022-09-01
  • C++中怎么实现重载运算符
    C++中怎么实现重载运算符,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一。重载运算符的时机1。需要在定义的对象间相互赋值时,重载赋值运算符2。需要在数字类型增...
    99+
    2023-06-17
  • C++中怎么重载赋值运算符
    这篇文章给大家介绍C++中怎么重载赋值运算符,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。重载赋值运算符在类中重载赋值运算符的格式如下:void operator = (const&nbs...
    99+
    2023-06-17
  • C#怎么重载更多的运算符
    本篇内容介绍了“C#怎么重载更多的运算符”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!实例using System;namespa...
    99+
    2023-06-17
  • C#中怎么实现运算符重载
    本篇文章给大家分享的是有关C#中怎么实现运算符重载,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。什么是C#运算符重载?所谓运算符重载,就是对已有的运算符重新进行定义,赋予其另一...
    99+
    2023-06-18
  • C#中怎么允许运算符重载
    本篇文章给大家分享的是有关C#中怎么允许运算符重载,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。C#允许运算符重载与 C++ 一样,C#允许运算符重载,以供在我们自己的类中使用...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作