C#中的运算符重载(以重载+为例)

C#中重载运算符的语法和其它语言差不多,比起C++来,它多一个限制,重载运算符的这个方法必须是public static的下面以重载+为例:

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

namespace 运算符重载
{
    class fushu
    {
        public fushu(int varA, int varB)
        {
            this.A = varA;
            this.B = varB;
        }

        //把成员变量定义成公有的只是为了进行演示的方便。
        public int A;
        public int B;

        //两个对象相加
        public static fushu operator +(fushu fs1, fushu fs2)
        {
            fushu fs3 = new fushu(0, 0);
            fs3.A = fs1.A + fs2.A;
            return fs3;
        }

        //一个对象与一相数字相加
        public static fushu operator +(fushu ft, int num)
        {
            ft = new fushu(0, 0);
            ft.A += num;
            return ft;
        }


    }

    class Program
    {
        static void Main(string[] args)
        {
            fushu fs1 = new fushu(3, 4);
            fushu fs2 = new fushu(10, 20);

            fushu fs3 = fs1 + fs2;
            Console.WriteLine(fs3.A);

            fushu ft = new fushu(0, 0);
            ft = ft + 20;
            Console.WriteLine(ft.A);

            Console.Read();
        }


    }
}

可以看出,重载后的“+“使用起来和普通的"+”没有什么区别,而实际上,系统自动完成了相应的运算符的重载函数的调用过程。具体编译器是怎样解释的还没有去深究。
下面来具体分析上面的这两个重载。
第一个:public static fushu operator +(fushu fs1, fushu fs2),这个很多好理解,就是让两个对象的成员相加,然后返回这个对象。
第二个:public static fushu operator +(fushu ft, int num),初一看也差不多。没什么特别的,就是让一个对象和一个数字相加。实际上,如果是在C++中,这个重载可以只传一个参数num就可以了,在主方法中调用的时候,直接让一个对象与一个数字相加。而C#中不可以,如果写成: public static fushu operator +(fushu ft)会报错::“此一元运算符的参数类型必须是包含类型”。也就是说在进行运算符重载的时候,必须有一个参数是这个类或者结构本身的类型。所以我们可以猜想,如果我们重载的是一个一元运算符,而不是一个二元运算符,那么,也要传一个类或者结构本身的数据类型来。要不然也会报同样的错误。

posted @ 2012-06-12 21:56  伯箫  阅读(735)  评论(0编辑  收藏  举报