C#运算符重载---逐步地分析与理解
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#运算符重载---逐步地分析与理解的更多相关文章
- C++ 自增、自减运算符的重载和性能分析
01 ++.--运算符重载函数的格式 自增运算符和自减运算符是有前置和后置之分的,如: a++ // 后置自增运算符 ++a // 前置自增运算符 b-- // 后置自减运算符 --b // 前置自减 ...
- C++运算符重载的方法
运算符重载的方法是定义一个重载运算符的函数,在需要执行被重载的运算符时,系统就自动调用该函数,以实现相应的运算.也就是说,运算符重载是通过定义函数实现的. 运算符重载实质上是函数的重载 重载运算符的函 ...
- 探索Scala(1)-- 运算符重载
Scala语言运算符重载全然是语法层面的小把戏,本文记录我对Scala语言运算符重载的一些理解. 方法调用语法糖 调用方法时,Scala同意省略点号和圆括号,如以下代码所看到的: 把运算符映射成单词 ...
- 《挑战30天C++入门极限》C++运算符重载函数基础及其值返回状态
C++运算符重载函数基础及其值返回状态 运算符重载是C++的重要组成部分,它可以让程序更加的简单易懂,简单的运算符使用可以使复杂函数的理解更直观. 对于普通对象来说我们很自然的会频繁使用算数运 ...
- 【dart学习】之运算符重载
一,什么是运算符重载(operator overloading) 在软件开发过程中,运算符重载(英语:operator overloading)是多态的一种.运算符重载通常只是一种语法糖,这种语法对语 ...
- [信号与系统]傅里叶变换、DFT、FFT分析与理解
目录 一.前言 二.傅里叶变换 1.傅里叶级数 2.傅里叶级数系数求解 2.1.求解方法 2.2.三角函数的正交性 2.3.系数求解过程 2.4.关于傅里叶级数的个人感悟 3.引入复指数 4.总结 三 ...
- PoEduo - C++阶段班【Po学校】-Lesson03-5_运算符重载- 第7天
PoEduo - Lesson03-5_运算符重载- 第7天 复习前面的知识点 空类会自动生成哪些默认函数 6个默认函数 1 构造 2 析构 3 赋值 4 拷贝构造 5 oper ...
- C++学习笔记之运算符重载
一.运算符重载基本知识 在前面的一篇博文 C++学习笔记之模板(1)——从函数重载到函数模板 中,介绍了函数重载的概念,定义及用法,函数重载(也被称之为函数多态)就是使用户能够定义多个名称相同但特征标 ...
- C++:运算符重载函数之"++"、"--"、"[ ]"、"=="的应用
5.2.5 "++"和"--"的重载 对于前缀方式++ob,可以用运算符函数重载为: ob.operator++() //成员函数重载 或 operator++ ...
随机推荐
- 2021 年终总结:内推40人、全网15万粉、Code Runner 3000万下载、发扬WLB、进军视频领域
时光飞逝,岁月如梭,蓦然回首,已是年底. 感觉写 2020 年终总结还是在不久之前.转眼间,2021 已经接近尾声了.是时候来写写 2021 年的年终总结了. 内推 40 人 2019 年,内推了 2 ...
- 【jvm】06-new一个对象到底占了多少内存?
[jvm]06-new一个对象到底占了多少内存? 欢迎关注b站账号/公众号[六边形战士夏宁],一个要把各项指标拉满的男人.该文章已在github目录收录. 屏幕前的大帅比和大漂亮如果有帮助到你的话请顺 ...
- MyBatis练习——使用MyBatis查询所有职员信息
实现要求: 使用MyBatis查询所有职员信息 create table employee( id int not null auto_increment, name varchar(255) not ...
- 编写Java程序,随机给定一个数字猜大小
返回本章节 返回作业目录 需求说明: 由系统随机生成一个1~100之间的整数. 通过控制台一直输入一个整数,比较该数与系统随机生成的那个数,如果大就输出"猜大了.",继续输入:如果 ...
- Dubbo服务 上传文件解决方案以及Hessian协议
协议支持 Dubbo支持多种协议,如下所示: Dubbo协议 Hessian协议 HTTP协议 RMI协议 WebService协议 Thrift协议 Memcached协议 Redis协议 在通 ...
- MySQL提权之mof提权
mof提权原理 关于 mof 提权的原理其实很简单,就是利用了 c:/windows/system32/wbem/mof/ 目录下的 nullevt.mof 文件,每分钟都会在一个特定的时间去执行一次 ...
- Centos下安装Maven私服Nexus
dockers安装Nexus,指定访问路径(默认为/:在使用Nginx做反向代理时,最好指定访问路径),并在容器外持久化数据,避免Nexus容器升级后数据丢失. 安装并启动 docker run -d ...
- zip压缩,解压
//引用 System.IO.Compression.FileSystem.dll var basePath = AppDomain.CurrentDomain.BaseDirectory; Syst ...
- UML 有关用例图知识及用例关系
原文链接:https://blog.csdn.net/mj_ww/article/details/53020080 1. 如何识别用例 任何用例都不能在缺少参与者的情况下独立存在.同样,任何参与者也必 ...
- 【解决了一个小问题】golang build中因为缓存文件损坏导致的编译错误
编译的过程中出现了一个吓人的错误: GOROOT=C:\Go #gosetup GOPATH=C:\Users\ahfuzhang\go #gosetup C:\Go\bin\go.exe mod t ...