黑马程序员----运算符重载

---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ----------------------

    运算符的重载是C#中一个重要的功能,使得实际操作带来巨大直观易懂的便利。

像+和*这样的运算符只能用于预定义的数据类,原因很简单:编译器认为所有常见的运算符都是用于这些数据类型;例如,它知道如何让把两个long类型数据加起来,或如何从一个double减去另一个double,并生成合适的中间语言代码。但是定义自己的类或结构时,必须告诉编译器:什么方法可以调用,每个实例存储了什么字段等所有的信息;同样,如果要在自己的类上使用运算符,就必须告诉编译器相关的运算符在这个类中的含义。此时就要定义运算符重载

代码及例子:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace operator运算符重载
{
    class Program
    {
        static void Main(string[] args)
        {
            Struct st1, st2, st3, st4, st5, st6, st7;
            st1 = new Struct(2.5, 3.6, 8.25);
            st2 = new Struct(50.1, 36.2, 10);
            st3 = st1 + st2;  //如果没有写运算符重载,编译器遇到+ - * / %就会报错
            st4 = st2 - st1;
            int a = 10; 
            st5 = a * st1;  
            //st5 = st1 * a;  //调用的顺序要和定义运算符重载要一致,否则编译报错
            st6 = a / st5;
            long l1 = 500;
            st7 = l1 % st2;
            Console.WriteLine(st3.ToString());
            Console.WriteLine(st4.ToString());
            Console.WriteLine(st5.ToString());
            Console.WriteLine(st6.ToString());
            Console.WriteLine(st7.ToString());
            //Console.WriteLine(st5 == st6);

            Class1 c1, c2, c3;
            c1 = new Class1(st1, a * 2);
            c2 = new Class1(st2, a * 3);
            c3 = c1 + c2;
            Console.WriteLine("{0}---{1}", c3.Str, c3.Age);
            Console.ReadKey();
        }
    }
    #region 结构的运算符重载
    struct Struct  //定义结构类型
    {
        private double x;
        private double y;
        private double z;
        public Struct(double x, double y, double z)
        {
            this.x = x;
            this.y = y;
            this.z = z;
        }
        public override string ToString()
        {
            return string.Format("(x={0},y={1},z={2})", this.x, this.y, this.z);
        }
        public static Struct operator +(Struct lst, Struct rst) //必须是static及访问级别为 public的
        {
            return new Struct(lst.x + rst.x, lst.y + rst.y, lst.z + rst.z);
        }
        public static Struct operator *(double rb, Struct lst) //可以一个预定义类型和一个结构类型
        {
            return new Struct(lst.x * rb, lst.y * rb, lst.z * rb);
        }
        public static Struct operator *(Struct ls, Struct rs)
        {
            return new Struct(ls.x + rs.x, ls.y * rs.y, ls.z / rs.z);
        }
        public static Struct operator -(Struct lst, Struct rst)
        {
            return new Struct(rst.x * lst.x, lst.y - rst.y, rst.z + lst.z);
        }
        public static Struct operator /(int a, Struct b)
        {
            return new Struct(a * b.x, b.y / a, a + b.z);
        }
        public static Struct operator %(long ll, Struct a)
        {
            return new Struct(ll * a.x, ll + a.y, a.z * ll);
        }

        //>、<、>=、<=、==、!=  比较重载返回的是bool类型且要成对的重载
        /*不要通过调用从System.Object中继承的Equals()方法的实例版本来重载比较运算符,如果这么做,在objA是null时,
         *计算(objA==objB),就会产生一个异常,因为.NET运行库会试图计算null.Equals(objB).采用其他
         *方法(重写Equals()方法,调用比较运算符)比较安全
         */
        //public static bool operator ==(Struct lst, Struct rst)
        //{
        //    return Equals(lst.x, rst.x);
        //}
        //public static bool operator !=(Struct lst, Struct rst)
        //{
        //    return !Equals(lst.z, rst.z);
        //}
    }
    #endregion

    #region 类的运算符重载
    class Class1
    {
        public Struct Str { set; get; }  //把结构类型嵌套到类中
        private int age;
        public int Age
        {
            set
            {
                if (value >= 0 && value <= 120)
                {
                    age = value;
                }
                else
                {
                    throw new Exception("输入的年龄有误!");
                }
            }
            get
            {
                return age;
            }
        }
        public Class1(Struct s1, int i)
        {
            this.Str = s1;
            this.Age = i;
        }
        //其他的- * / %差不多都是这样写,主要注意调用时一定要匹配类型及参数
        public static Class1 operator +(Class1 lc, Class1 rc)
        {
            return new Class1(lc.Str * rc.Str, rc.Age + lc.Age);
        }

    }
    #endregion
}

 ---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ----------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值