1.運算符重載
通過運算符重載,可以對我們設計的類使用標准的運算符,例如+、-等。這稱為重載,因為在使用特定的參數類型時,我們為這些運算符提供了自己的實現代碼,其方式與重載方法相同,也是為同名方法提供不同的參數。
要重載運算符,可給類參加運算符類型成員(它們必須是static)。一些運算符有多種用途,因此我們還指定了要處理的多少個操作數,以及這些操作數的類型,一般情況下,操作數的類型與定義運算符的類相同,但也可以定義處理混合類型的運算符。
例如,考慮一個簡單類型AddClass1,如下所示:
public class AddClass1
{
public int val;
}
這僅是int值得一個包裝器,但可以用於說明原理,對於這個類,下面的代碼不能編譯:
AddClass1 op1 =new AddClass1();
op1.val= 3;
AddClass1 op2 = new AddClass1();
op2.val=5;
AddClass1 op3 = op1+op2;
其錯誤是+運算符不能應用於AddClass1類型的操作數,因為我們尚未定義要執行的操作。下面的代碼則可執行,但無法得到預期結果:
AddClass1 op1 =new AddClass1();
op1.val= 3;
AddClass1 op2 = new AddClass1();
op2.val=3;
AddClass1 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;
}
}
可以看出,運算符重載看起來與標准靜態方法類似,但它們使用關鍵字operator和運算符本身,而不是一個方法名。現在可以成功使用+運算符和這個類,如下面的示例所示:
AddClass1 op3 =op1+op2;
重載所有的運算符都是一樣的,一元運算符看起來也是類似的,但只有一個參數:
public class AddClass1
{
public int val;
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=4;
AddClass3 op3 =op1+op2;
要注意,如果把相同的運算符添加到AddClass2中,上面的代碼就會失敗,因為它弄不清要使用哪個運算符。因此,注意不要把簽名相同的運算符添加到多個類中。
還要注意,如果混合了類型,操作數的順序必須與運算符重載的參數順序相同,如果使用了重載的運算符和順序錯誤的操作數,操作就會失敗。所以,不能像這樣使用運算符:
AddClass3 op3 =op2+op1;
當然,除非提供了另一個重載運算符和倒序的參數:
public static AddClass3 operator +(AddClass2 op2,AddClass1 op1)
{
AddClass3 returnVal=new AddClass3();
returnVal.val=op1.val+op2.val;
return returnVal;
}