首先看看運算子多載的基本文法。
要重載運算子,可以給類添加運算子類型成員(它們必須是static)。
我們先看一個簡單的類:
public class AddClass1
{
public int val;
}
這僅是int值的一個封裝器(wrapper),但可以用於說明規則。
對於這個類下面的代碼不能編譯:
AddClass1 op1 = new AddClass1();
op1.val = 5;
AddClass1 op2 = new AddClass1();
op2.val = 5;
AddClass1 op3 = op1 + op2;
其錯誤是+運算子不能應用於AddClass1類型的運算元,因為我們還沒有定義要執行的操作。
雖然下面的代碼可以執行,但是得不到我們希望的結果:
AddClass1 op1 = new AddClass1();
op1.val = 5;
AddClass1 op2 = new AddClass1();
op2.val = 5;
bool op3 = op1 == op2;
這僅是使用二元運算子==判斷op1和op2是否引用的用一個對象,而不是驗證他們的值是否相等。在這段代碼中,即使op1.val和op2.val相等,op3也是false。因為它們引用的並不是同一個對象。
我們使用下面的方法來實現對+運算子的重載。
public class AddClass1
{
public int val;
public static AddClass1 operator +(AddClass1 op1, AddClass1 op2)
{
AddClass1 returnVal = new AddClass1();
returnVal.val = op1.val + op2.val;
return returnVal;
}
}
重載所有的二元運算子基本上都和這個相似。一元運算子看起來也是類似的,但是只有一個參數。
public static AddClass1 operator -(AddClass1 op1)
{
AddClass1 returnVal = new AddClass1();
returnVal.val = - op1.val;
return returnVal;
}
下面我們再看一個不同類的對象運算的例子。
public class AddClass1
{
public int val;
public static AddClass3 operator +(AddClass1 op1, AddClass2 op2)
{
AddClass3 returnVal = new AddClass3();
returnVal.val = op1.val + op2.val;
return returnVal;
}
}
public class AddClass2
{
public int val;
}
public class AddClass3
{
public int val;
}
對於這種類型的定義下面的代碼也是可以執行的:
AddClass1 op1 = new AddClass1();
op1.val = 5;
AddClass2 op2 = new AddClass2();
op2.val = 5;
AddClass3 op3 = op1 + op2;
這是因為在AddClass1中定義的加運算子僅適合於AddClass1與AddClass2相加然後賦值給AddClass3對象。而且順序必須是AddClass1對象在前,AddClass2對象在後的這種相加,如果要顛倒順序,除非我們按照顛倒的順序在進行一個運算子的重載,否則是不支援這種演算法的。
下述運算子可以重載:
一元運算子:+, -, !, ~, ++, --, true, false
二元運算子:+, -, *, /, %, &, |, ^, <<, >>
比較子:==, !=, <, >, <=, >=
如果想重載==,必須還要重載!=