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)会报错::“此一元运算符的参数类型必须是包含类型”。也就是说在进行运算符重载的时候,必须有一个参数是这个类或者结构本身的类型。所以我们可以猜想,如果我们重载的是一个一元运算符,而不是一个二元运算符,那么,也要传一个类或者结构本身的数据类型来。要不然也会报同样的错误。