运算符的重载。C++的开发人员应该很熟悉这个概念,但这对Java 和 VB 开发人员确实全新的。

  对于一些数值间的运算,如果通过方法来指定运算规则的话,不免会繁琐,这时就可以利用运算符的重载。

  例:

  Matrix a,b,c;  //定义矩阵对象

  Marix d=c*(a+b);

  如果用不支持运算符重载的语言的话,就必须定义方法,通过调用方法来进行计算:

  Marix d=c.Muliply(a.Add(b));

  结果很不直观

  

  运算符的重载,在数学或物理建模会经常用到(比如坐标,矢量,矩阵,函数运算等)。还有比如图形,财务方面。。当然,如果你要用于计算日期,比如两个DateTime相乘,没人会拦你,虽然在概念上没有任何意义,哈哈。

  其实,之前我们在编写代码的时候都会使用过运算符的重载,虽然我们自己没定义重载运算符,但C#默认有帮我们实现了。

int myInt=;
uint myUint=;
double myDouble=13.2;
long myLong=myInt+myUint;
double myDouble=myDouble+myInt;
double myDouble2=myInt+myDouble;

"+"运算符,会接受两个参数,然后根据参数查找最匹配的运算符的重载方法

上面的long myLong=myInt+myUint;和double myDouble2=myInt+myDouble;调用的是不同版本的重载。

在C#中,编译器会自动匹配最适合的重载方法,就如 对于double和int型数据,“+”运算符没有带这种复合参数的重载,所以编译器就认为,最匹配的“+”重载是两个double类型相加,所得到数是double类型也就不奇怪 了

那么对于自定义的类型会怎样呢,这样的话就得自己定义运算符的重载啦。

定义一个Vector结构,表示一个三维数学坐标 (x,y,z)

struct Vector
{
private double x, y, z;
public Vector(double x,double y,double z)
{
this.x = x;
this.y = y;
this.z = z;
}
public Vector(Vector vec)
{
this.x = vec.x;
this.y = vec.y;
this.z = vec.z;
} public override string ToString()
{
return "(" + x + "," + y + "," + z + ")";
}
//+运算符重载
public static Vector operator + (Vector lhs,Vector rhs)
{
Vector result=new Vector();
result.x=lhs.x+rhs.x;
result.y=lhs.y+rhs.y;
result.z=lhs.z+rhs.z; return result;//返回两个3维坐标相加后的值
}
}
  

static void Main(string[] args)
{
//首先定义3维坐标对象
Vector vec1 = new Vector(1, 0, -2);
Vector vec2 = new Vector(2, -1, 5);
Vector vec3 = vec1 + vec2;


Console.WriteLine(vec1.ToString()); //输出(1,0,-2)
Console.WriteLine(vec2.ToString()); //输出(2,-1,5)
Console.WriteLine(vec3.ToString()); //输出(3,-1,3)
Console.ReadLine();
}


  当然还可以定义更多的重载运算,相加,相减,相乘。还可以标量与矢量相乘,比如 2*(1,2,3)

public static Vector operator *(double lhs,Vector rhs)
{
return new Vector(lhs * rhs.x, lhs * rhs.y, lhs * rhs.z);
}

对于2.0*(1,2,3)和2*(1,2,3)都会调用这个重载。  但是,对于(1,2,3)*2,得另外重载一个方法

public static Vector operator *(Vector lhs,double rhs)
{
return rhs * lhs;
}

这里,没必要像上一个方法那样重新运算过程,直接重用上面的代码。。这个阐述了代码的简洁思想,也提高了代码的可维护性。

相信,接下来写矢量相乘的话,也不是难事了,就不多写了。

当然,还有就是比较符的重载,包括下面3对:

==和!=

>和<

>=和<=

其实,重载方法的操作是一样的,把上例重点"+"运算符改为 比较运算符。

public static bool operator ==(Vector lhs,Vector rhs)
{
return ???
}

竟然写了一个小时,0:11了,赶紧睡觉!

下期内容: 常见的系统预制数值类型的转换(比如 float转换成double),那用户定义的类型的转换又是怎样的呢?

下期叙述, 用户定义类型的强制转换

一起学习《C#高级编程》3--运算符重载的更多相关文章

  1. Shell高级编程视频教程-跟着老男孩一步步学习Shell高级编程实战视频教程

    Shell高级编程视频教程-跟着老男孩一步步学习Shell高级编程实战视频教程 教程简介: 本教程共71节,主要介绍了shell的相关知识教程,如shell编程需要的基础知识储备.shell脚本概念介 ...

  2. (转)跟着老男孩一步步学习Shell高级编程实战

    原文:http://oldboy.blog.51cto.com/2561410/1264627/  跟着老男孩一步步学习Shell高级编程实战 原创作品,允许转载,转载时请务必以超链接形式标明文章 原 ...

  3. 跟着老男孩一步步学习Shell高级编程实战

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://oldboy.blog.51cto.com/2561410/1264627 本sh ...

  4. Python全栈工程师(异常(高级)、运算符重载)

    ParisGabriel              每天坚持手写  一天一篇  决定坚持几年 为了梦想为了信仰    开局一张图 Python人工智能从入门到精通 对象的属性管理函数: getattr ...

  5. C#学习笔记_13_静态类&Sealed&运算符重载&抽象类

    13_静态类&Sealed&运算符重载&抽象类 静态类 由static修饰的类就是静态类 特点: 静态类不能实例化对象 静态类中不允许写非静态的成员 静态类只能由一个父类Obj ...

  6. Java学习进阶—高级编程

    当你已经熟练的掌握了面向对象中的各种概念后,是否会对这些知识是如何使用的产生浓厚的兴趣?本课程主要针对于已经掌握了JAVA核心开发技术的读者准备,讲解了JAVA多线程.常用类库.IO编程.网络编程.类 ...

  7. POJ C++程序设计 编程题#3 编程作业—运算符重载

    编程题 #3 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 写一个二维数组 ...

  8. 吴裕雄--天生自然 R语言开发学习:高级编程

    运行的条件是一元逻辑向量(TRUE或FALSE)并且不能有缺失(NA).else部分是可选的.如果 仅有一个语句,花括号也是可以省略的. 下面的代码片段是一个例子: plot(x, y) } else ...

  9. POJ C++程序设计 编程题#1 编程作业—运算符重载

    编程题 #2 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 下面的MyIn ...

  10. python学习 面向对象高级编程

    ---恢复内容开始--- 面向对象编程---oop,是一种编程思想,oop把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数 ...

随机推荐

  1. 熟练使用Linux系统信息类命令

    系统信息类命令 – dmesg命令 dmesg命令用实例名和物理名称来标识连到系统上的设备. dmesg命令显示系统诊断信息.操作系统版本号.物理内存大小以及其他信息. 系统启动时,屏幕上会显示系统C ...

  2. Linux gdb调试器用法全面解析

    GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,GDB主要可帮助工程师完成下面4个方面的功能: 启动程序,可以按照工程师自定义的要求随心所欲的运行程序. 让被调试的程序在工程师指定的断 ...

  3. MongoDB 3.0 常见集群的搭建(主从复制,副本集,分片....)

      一.mongodb主从复制配置 主从复制是mongodb最常用的复制方式,也是一个简单的数据库同步备份的集群技术,这种方式很灵活.可用于备份,故障恢复,读扩展等. 最基本的设置方式就是建立一个主节 ...

  4. python推荐书籍

    推荐的python电子书 python学习路线图 优先级 入门:python核心编程 提高:python cookbook 其他 (1).数据分析师 需要有深厚的数理统计基础,但是对程序开发能力不做要 ...

  5. JDK8时间格式转换

    来源:https://blog.csdn.net/zhangzijiejiayou/article/details/76597329 LocalDateTime 本地日期时间 LocalDateTim ...

  6. VS2013默认打开HTML文件没有设计视图

    打开VS菜单->工具->选项->文本编辑器->文件扩展名,右侧输入html,再下拉列表选HTML(Web窗体)编辑器,点添加,确定. 第二条是彻底解决VS2013不能编辑HTM ...

  7. mysql 百万级数据库优化方案

    https://blog.csdn.net/Kaitiren/article/details/80307828 一.百万级数据库优化方案 1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 wher ...

  8. Nginx rewrite使用

    转自: https://www.cnblogs.com/czlun/articles/7010604.html

  9. Java路程

    Java学习这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是你是如何学习Java的,能不能给点建议?今天我是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈每 ...

  10. 若(p,q)=1,则(p^n,q^n)=1

    [若(p,q)=1,则(p^n,q^n)=1] 因(p,q)=1,则p,q可分别表示成如下的形式: p=A^a*B^b*C^c, q=D^d*E^e*F^f 显示ABC.DEF无交集.而p^n.q^n ...