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. POJ 3264:Balanced Lineup(区间最值查询ST表&线段树)

      Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 75294   Accepted: 344 ...

  2. CNN、RNN

    卷积神经网络有三个结构上的特性:局部连接,权重共享以及空间或时间上的次采样.这些特性使得卷积神经网络具有一定程度上的平移.缩放和扭曲不变性. CNN由可学习权重和偏置的神经元组成.每个神经元接收多个输 ...

  3. Spring中的@Bean注解

    @Bean 基础概念 @Bean:Spring的@Bean注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理.产生这个Bean对象的方法Spring只会调用一次,随后这个 ...

  4. eclipse的安装及最大子数组求和

    我安装的是eclipse.由于eclipse是一个基于Java的课扩展开发平台,所以在安装eclipse之前要先安装Java的开发工具JDK(Java Devolopment Dit),且安装JDK需 ...

  5. Go语言练习 Rot13

    Go语言练习 Rot13 地址:https://tour.go-zh.org/methods/23 package main import ( "io" "os" ...

  6. HITCON 2019 Lost Modular again writeup

    HITCON 2019 Lost Modular again writeup 算是基础题,有很多之前题的影子,做不出来纯属菜. 题目 加密脚本 from Crypto.Util.number impo ...

  7. C++函数参数的传递顺序

    C++编译器默认使用的是 __cdecl 模式,参数是通过栈传递的,因此是从右到左的传参顺序. int f(int a, int b, int c) { return 0; } int main(){ ...

  8. LTD: Low Temperature Distillation for Robust Adversarial Training

    目录 概 主要内容 Chen E. and Lee C. LTD: Low temperature distillation for robust adversarial training. arXi ...

  9. Robust Pre-Training by Adversarial Contrastive Learning

    目录 概 主要内容 代码 Jiang Z., Chen T., Chen T. & Wang Z. Robust Pre-Training by Adversarial Contrastive ...

  10. [C++]vector去除重复元素

    #include <iostream> #include <vector> #include <algorithm> #include <set> us ...