1.什么是运算符重载

定义:(百科定义)就是把已经定义的、有一定功能的操作符进行重新定义,来完成更为细致具体的运算等功能。操作符重载可以将概括性的抽象操作符具体化,便于外部调用而无需知晓内部具体运算过程。

2.为什么需要运算符重载?

在C#中 ,内置的数据类型有:int、double等这些类型是预先在系统内定义好的,可以直接进行数值加减运算。例如:int i, j = 1; int sum=i+j;可以直接得到想要的和sum。

如果要比较一个类(结构)进行对象比较加、减等操作 该如何实现?例如一个类Box,有对象Box1和Box2,那么, 如何实现对象相加Box3 = Box1 + Box2?

这时,我们就要用到具有用户定义类型的运算符。重载运算符是具有特殊名称的功能,关键字operator后跟定义运算符的符号。 类似于任何其他函数定义,重载运算符具有返回类型和参数列表。

3.下面用三个案例,以逐步步进的方式解析一下

 1 namespace operator_overload
2 {
3 class Program
4 {
5 static void Main(string[] args)
6 {
7 Box Box1 = new Box();
8 Box Box2 = new Box();
9 Box Box3 = new Box();
10
11 double volume1,volume2 = 0.0;
12
13 Box1.setLength(60.0);
14 Box1.setBreadth(70.0);
15 Box1.setHeight(50.0);
16
17 Box2.setLength(121.0);
18 Box2.setBreadth(133.0);
19 Box2.setHeight(110.0);
20
21 volume1 = Box1.getVolume();
22 Console.WriteLine("Volume of Box1 :{0}",volume1);
23
24 volume2 = Box2.getVolume();
25 Console.WriteLine("Volume of Box1 :{0}", volume2);
26
27
28 }
29 }
30
31 class Box
32 {
33 private double length;
34 private double breadth;
35 private double height;
36
37 public double getVolume()
38 {
39 return length * breadth * height;
40 }
41 public void setLength(double len)
42 {
43 length = len;
44 }
45 public void setBreadth(double bre)
46 {
47 breadth = bre;
48 }
49 public void setHeight(double hei)
50 {
51 height = hei;
52 }
53
54 }

案例一

案例一没有运用运算符重载,也没类或结构相加,可以正常示和;

 1 namespace operator_overload
2 {
3 class Program
4 {
5 static void Main(string[] args)
6 {
7 Box Box1 = new Box();
8 Box Box2 = new Box();
9 Box Box3 = new Box();
10
11 double volume1,volume2 = 0.0;
12
13 Box1.setLength(60.0);
14 Box1.setBreadth(70.0);
15 Box1.setHeight(50.0);
16
17 Box2.setLength(121.0);
18 Box2.setBreadth(133.0);
19 Box2.setHeight(110.0);
20
21 volume1 = Box1.getVolume();
22 Console.WriteLine("Volume of Box1 :{0}",volume1);
23
24 volume2 = Box2.getVolume();
25 Console.WriteLine("Volume of Box1 :{0}", volume2);
26
27 Box3 = Box1 + Box2; //类实例进行相加;
28 }
29 }
30
31 class Box
32 {
33 private double length;
34 private double breadth;
35 private double height;
36
37 public double getVolume()
38 {
39 return length * breadth * height;
40 }
41 public void setLength(double len)
42 {
43 length = len;
44 }
45 public void setBreadth(double bre)
46 {
47 breadth = bre;
48 }
49 public void setHeight(double hei)
50 {
51 height = hei;
52 }
53
54
55 }
56 }
57 }

案例二

案例二,增加了“Box3 = Box1 + Box2;”,但是没有相应的运算符代码进行支持,所以编译器显示如下提示

错误    1    运算符“+”无法应用于“operator_overload.Box”和“operator_overload.Box”类型的操作数

 1 namespace operator_overload
2 {
3 class Program
4 {
5 static void Main(string[] args)
6 {
7 Box Box1 = new Box();
8 Box Box2 = new Box();
9 Box Box3 = new Box();
10
11 double volume1,volume2 = 0.0;
12
13 Box1.setLength(60.0);
14 Box1.setBreadth(70.0);
15 Box1.setHeight(50.0);
16
17 Box2.setLength(121.0);
18 Box2.setBreadth(133.0);
19 Box2.setHeight(110.0);
20
21 volume1 = Box1.getVolume();
22 Console.WriteLine("Volume of Box1 :{0}",volume1);
23
24 volume2 = Box2.getVolume();
25 Console.WriteLine("Volume of Box1 :{0}", volume2);
26
27 Box3 = Box1 + Box2;
28 }
29 }
30
31 class Box
32 {
33 private double length;
34 private double breadth;
35 private double height;
36
37 public double getVolume()
38 {
39 return length * breadth * height;
40 }
41 public void setLength(double len)
42 {
43 length = len;
44 }
45 public void setBreadth(double bre)
46 {
47 breadth = bre;
48 }
49 public void setHeight(double hei)
50 {
51 height = hei;
52 }
53
54 public static Box operator +(Box b, Box c)
55 {
56 Box box = new Box();
57 box.length = b.length + c.length;
58 box.breadth = b.breadth + c.breadth;
59 box.height = b.height + c.height;
60 return box;
61 }
62 }
63 }

案例三

案例三,增加如下运算符重载的支撑代码

   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类,Box3 = Box1 + Box2;对应的计算运算式如下:

5878880 = (60+121)*(70+133)*(50+110)

以上案例成功实现了类的相加!

C#运算符重载---逐步地分析与理解的更多相关文章

  1. C++ 自增、自减运算符的重载和性能分析

    01 ++.--运算符重载函数的格式 自增运算符和自减运算符是有前置和后置之分的,如: a++ // 后置自增运算符 ++a // 前置自增运算符 b-- // 后置自减运算符 --b // 前置自减 ...

  2. C++运算符重载的方法

    运算符重载的方法是定义一个重载运算符的函数,在需要执行被重载的运算符时,系统就自动调用该函数,以实现相应的运算.也就是说,运算符重载是通过定义函数实现的. 运算符重载实质上是函数的重载 重载运算符的函 ...

  3. 探索Scala(1)-- 运算符重载

    Scala语言运算符重载全然是语法层面的小把戏,本文记录我对Scala语言运算符重载的一些理解. 方法调用语法糖 调用方法时,Scala同意省略点号和圆括号,如以下代码所看到的: 把运算符映射成单词 ...

  4. 《挑战30天C++入门极限》C++运算符重载函数基础及其值返回状态

        C++运算符重载函数基础及其值返回状态 运算符重载是C++的重要组成部分,它可以让程序更加的简单易懂,简单的运算符使用可以使复杂函数的理解更直观. 对于普通对象来说我们很自然的会频繁使用算数运 ...

  5. 【dart学习】之运算符重载

    一,什么是运算符重载(operator overloading) 在软件开发过程中,运算符重载(英语:operator overloading)是多态的一种.运算符重载通常只是一种语法糖,这种语法对语 ...

  6. [信号与系统]傅里叶变换、DFT、FFT分析与理解

    目录 一.前言 二.傅里叶变换 1.傅里叶级数 2.傅里叶级数系数求解 2.1.求解方法 2.2.三角函数的正交性 2.3.系数求解过程 2.4.关于傅里叶级数的个人感悟 3.引入复指数 4.总结 三 ...

  7. PoEduo - C++阶段班【Po学校】-Lesson03-5_运算符重载- 第7天

    PoEduo - Lesson03-5_运算符重载- 第7天 复习前面的知识点 空类会自动生成哪些默认函数 6个默认函数    1  构造  2  析构   3  赋值  4 拷贝构造  5 oper ...

  8. C++学习笔记之运算符重载

    一.运算符重载基本知识 在前面的一篇博文 C++学习笔记之模板(1)——从函数重载到函数模板 中,介绍了函数重载的概念,定义及用法,函数重载(也被称之为函数多态)就是使用户能够定义多个名称相同但特征标 ...

  9. C++:运算符重载函数之"++"、"--"、"[ ]"、"=="的应用

    5.2.5 "++"和"--"的重载 对于前缀方式++ob,可以用运算符函数重载为: ob.operator++() //成员函数重载 或 operator++ ...

随机推荐

  1. Codeforces 888E:Maximum Subsequence(枚举,二分)

    You are given an array a consisting of n integers, and additionally an integer m. You have to choose ...

  2. 一站式元数据治理平台——Datahub入门宝典

    随着数字化转型的工作推进,数据治理的工作已经被越来越多的公司提上了日程.作为新一代的元数据管理平台,Datahub在近一年的时间里发展迅猛,大有取代老牌元数据管理工具Atlas之势.国内Datahub ...

  3. webSocket 与HTTP

    WebSocket 协议在2008年诞生,2011年成为国际标准.现在所有浏览器都已经支持了.WebSocket 的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真 ...

  4. Proximal Algorithms 6 Evaluating Proximal Operators

    目录 一般方法 二次函数 平滑函数 标量函数 一般的标量函数 多边形 对偶 仿射集合 半平面 Box Simplex Cones 二阶锥 半正定锥 指数锥 Pointwise maximum and ...

  5. 使用 DML语句,对 “锦图网” 数据进行操作,连接查询(内连接,左外连接,右外连接,全连接)

    查看本章节 查看作业目录 需求说明: 对 "锦图网" 数据进行操作: 统计每一种线路类型的线路数量.最高线路价格.最低线路价格和平均线路价格,要求按照线路数量和平均线路价格升序显示 ...

  6. Linux配置yum源(离线和在线)

    配置yum源有2种方法,一种是离线yum源,另外一种是在线yum源. 一.离线yum源,基于安装光盘提供的安装仓库. 建立一个属于仓库文件夹 mkdir /media/zidong cd /media ...

  7. nginx之location、inmp架构详解、BBS项目部署

    本期内容概要 location lnmp架构 部署BBS项目 内容详细 1.location 使用Nginx Location可以控制访问网站的路径 但一个server可以有多个location配置 ...

  8. MySQL 开启和关闭远程访问

    MySQL 开启和关闭远程访问权限 一.开启MySQL/MariaDB的远程访问权限 [root@localhost ~]# mysql -u root -p MariaDB [(none)]> ...

  9. 新增访客数量MR统计之NewInstallUserMapper中维度信息准备

    关注公众号:分享电脑学习回复"百度云盘" 可以免费获取所有学习文档的代码(不定期更新)云盘目录说明:tools目录是安装包res 目录是每一个课件对应的代码和资源等doc 目录是一 ...

  10. 使用Eclipse新建项目

    如果图片损坏,点击查看: https://www.toutiao.com/i6496078011538866702/ 出现"新建"对话框,输入mavem 点击创建"简单M ...