博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#之运算符重载
阅读量:6387 次
发布时间:2019-06-23

本文共 4669 字,大约阅读时间需要 15 分钟。

  我们知道,对于一些基本的数据类型(Int32、long、double等)我们可以通过+、-,*等进行一些运算,但是对于自己定义的一些复杂类型,如果我们想实现这些功能只能通过定义一些方法,以执行这些操作,这样肯定不太直观。如果要想自己的类上使用这些运算符功能,就必须告诉编译器相关的运算符在这个类中的含义以及运算逻辑,此时就用到了运算符重载。

  运算符的重载不仅限于算术运算符,在进行重载时还需要考虑到一些比较运算符==、<、>、!=、>=、<=等。例如if(a==b),对于类,在默认情况下这个语句是比较这两个对象的引用的是否指向同一个地址,而不是去比较这两个对象的字段值是否相等;另外,对于结构,默认情况下==运算符是不进行工作的,如果试图比较两个结构看它们是否相等,就会产生一个编译错误,所以我们要比较结构,就必须显示的重载==运算符,告诉编译器如何进行比较。下面,简单的运用code进行一些介绍

一、算术运算符+、-、*、/重载

View Code
namespace ConsoleApp{    class Program    {        static void Main(string[] args)        {            Point p1 = new Point(10, 8);            Point p2 = new Point(5, 4);            Point p3 = p1 + p2;            Point p4 = p1 - p2;            Point p5 = p1 * p2;            Point p6 = p1 / p2;            Console.WriteLine("p1—" + p1);            Console.WriteLine("p2—" + p2);            Console.WriteLine("p3—" + p3);            Console.WriteLine("p4—" + p4);            Console.WriteLine("p5—" + p5);            Console.WriteLine("p6—" + p6);        }    }    public class Point    {        private Int32 x;        private Int32 y;        public Point()        {            this.x = 0;            this.y = 0;        }        public Point(Int32 _x, Int32 _y)        {            this.x = _x;            this.y = _y;        }        public Int32 X        {            get { return x; }            set { x = value; }        }        public Int32 Y        {            get { return y; }            set { y = value; }        }        ///         /// 重载+运算符        ///         public static Point operator +(Point p1, Point p2)        {            return new Point(p1.x + p2.x, p1.y + p2.y);        }        ///         /// 重载-运算符        ///         public static Point operator -(Point p1, Point p2)        {            return new Point(p1.x - p2.x, p1.y - p2.y);        }        ///         /// 重载*运算符        ///         public static Point operator *(Point p1, Point p2)        {            return new Point(p1.x * p2.x, p1.y * p2.y);        }        ///         /// 重载/运算符        ///         public static Point operator /(Point p1, Point p2)        {            if (p2.x == 0 || p2.y == 0)                throw new Exception("被除数中不能有0的数");            return new Point(p1.x / p2.x, p1.y / p2.y);        }        public override string ToString()        {            return String.Format("X:{0},Y:{1}", this.x, this.y);        }    }}

 二、比较运算符重载

View Code
namespace ConsoleApp{    class Program    {        static void Main(string[] args)        {            Point p1 = new Point(10, 8);            Point p2 = new Point(5, 4);            Point p3 = new Point(5, 4);            Console.WriteLine("P1 > P2:" + (p1 > p2).ToString());            Console.WriteLine("P2 < P1:" + (p2 < p1).ToString());            Console.WriteLine("P2 == P3:" + (p2 == p3).ToString());                    }    }    public class Point    {        private Int32 x;        private Int32 y;        public Point()        {            this.x = 0;            this.y = 0;        }        public Point(Int32 _x, Int32 _y)        {            this.x = _x;            this.y = _y;        }        public Int32 X        {            get { return x; }            set { x = value; }        }        public Int32 Y        {            get { return y; }            set { y = value; }        }        #region 比较运算符重载        ///         /// 重载相等运算符        ///         public static Boolean operator ==(Point p1, Point p2)        {            return (p1.x == p2.x) && (p1.y == p2.y);        }        ///         /// 重载不相等运算符        ///         public static Boolean operator !=(Point p1, Point p2)        {            return !(p1.x == p2.x) && (p1.y == p2.y);        }        ///         /// 重载>运算符        ///         public static Boolean operator >(Point p1, Point p2)        {            return (p1.x * p1.x + p1.y * p1.y) > (p2.x * p2.x + p2.y * p2.y);        }        ///         /// 重载
<运算符>
public static Boolean operator <(Point p1, Point p2) { return (p1.x * p1.x + p1.y * p1.y) < (p2.x * p2.x + p2.y * p2.y); } /// /// 重载>=运算符 /// public static Boolean operator >=(Point p1, Point p2) { return (p1.x * p1.x + p1.y * p1.y) >= (p2.x * p2.x + p2.y * p2.y); } /// /// 重载<=运算符 /// public static Boolean operator <=(Point p1, Point p2) { return (p1.x * p1.x + p1.y * p1.y) <= (p2.x * p2.x + p2.y * p2.y); } #endregion public override string ToString() { return String.Format("X:{0},Y:{1}", this.x, this.y); } }}

 

转载于:https://www.cnblogs.com/NaughtyBoy/archive/2012/06/07/2540113.html

你可能感兴趣的文章
使用 find 命令实现高级排除需求
查看>>
【DEV GridControl】怎样使GridView中满足某个条件的行可编辑,其余行不可编辑?...
查看>>
一只年轻而倒悬的梨
查看>>
解决time_wait过多的问题
查看>>
技术转载:Jni学习一:了解Jni
查看>>
vue教程2-07 自定义指令
查看>>
Node.js之循环依赖
查看>>
python3调用阿里云短信服务
查看>>
Linux-百度云之AccleriderMini使用
查看>>
bootstrapTable refresh 方法使用简单举例
查看>>
2、TestNG+Maven+IDEA环境搭建
查看>>
maven插件运行过程中自动执行sql文件
查看>>
New UWP Community Toolkit - XAML Brushes
查看>>
C# ==、Equals、ReferenceEquals 区别与联系 (转载)
查看>>
layer弹出层的关闭问题
查看>>
LeetCode——3Sum &amp; 3Sum Closest
查看>>
netstat详解
查看>>
微信小程序 --- e.currentTarget.dataset.id 获取不到值
查看>>
Introducing stapbpf – SystemTap’s new BPF backend
查看>>
详细介绍MySQL/MariaDB的锁
查看>>