1.運算符重載
通過運算符重載,可以對我們設(shè)計的類使用標(biāo)準(zhǔn)的運算符,例如+、-等。這稱為重載,因為在使用特定的參數(shù)類型時,我們?yōu)檫@些運算符提供了自己的實現(xiàn)代碼,其方式與重載方法相同,也是為同名方法提供不同的參數(shù)。
要重載運算符,可給類參加運算符類型成員(它們必須是static)。一些運算符有多種用途,因此我們還指定了要處理的多少個操作數(shù),以及這些操作數(shù)的類型,一般情況下,操作數(shù)的類型與定義運算符的類相同,但也可以定義處理混合類型的運算符。
例如,考慮一個簡單類型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;
其錯誤是+運算符不能應(yīng)用于AddClass1類型的操作數(shù),因為我們尚未定義要執(zhí)行的操作。下面的代碼則可執(zhí)行,但無法得到預(yù)期結(jié)果:
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; }}可以看出,運算符重載看起來與標(biāo)準(zhǔn)靜態(tài)方法類似,但它們使用關(guān)鍵字operator和運算符本身,而不是一個方法名。現(xiàn)在可以成功使用+運算符和這個類,如下面的示例所示:
AddClass1 op3 =op1+op2;
重載所有的運算符都是一樣的,一元運算符看起來也是類似的,但只有一個參數(shù):
public class AddClass1{ public int val; public static AddClass1 operator -(AddClass1 op1) { AddClass1 returnVal= new AddClass1(); returnVal.val=-op1.val; return returnVal; }}這兩個運算符處理的操作數(shù)的類型與類相同,返回值也是該類型,但考慮下面的定義:
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; } 考慮下面的代碼就可以執(zhí)行:
AddClass1 op1 = new AddClass1();op1.val=5;AddClass2 op2 = new AddClass2();op2.val=4;AddClass3 op3 =op1+op2;
要注意,如果把相同的運算符添加到AddClass2中,上面的代碼就會失敗,因為它弄不清要使用哪個運算符。因此,注意不要把簽名相同的運算符添加到多個類中。
還要注意,如果混合了類型,操作數(shù)的順序必須與運算符重載的參數(shù)順序相同,如果使用了重載的運算符和順序錯誤的操作數(shù),操作就會失敗。所以,不能像這樣使用運算符:
AddClass3 op3 =op2+op1;
當(dāng)然,除非提供了另一個重載運算符和倒序的參數(shù):
public static AddClass3 operator +(AddClass2 op2,AddClass1 op1) { AddClass3 returnVal=new AddClass3(); returnVal.val=op1.val+op2.val; return returnVal; } 新聞熱點
疑難解答