您可以重定義或過載 c# 中內建的運算子。因此,程式設計師也可以使用使用者自定義型別的運算子。過載運算子是具有特殊名稱的函式,是通過關鍵字operator後跟運算子的符號來定義的。與其他函式一樣,過載運算子有返回型別和引數列表。
例如,請看下面的函式:
public static box operator+ (box b, box c)上面的函式為使用者自定義的類 box 實現了加法運算子(+)。它把兩個 box 物件的屬性相加,並返回相加後的 box 物件。
下面的程式演示了完整的實現:
using system;當上面的**被編譯和執行時,它會產生下列結果:public void setlength( double len )
public void setbreadth( double bre )
public void setheight( double hei )
// 過載 + 運算子來把兩個 box 物件相加
public static box operator+ (box b, box c)
}class tester
", volume);
// box2 的體積
volume = box2.getvolume();
console.writeline("box2 的體積: ", volume);
// 把兩個物件相加
box3 = box1 + box2;
// box3 的體積
volume = box3.getvolume();
console.writeline("box3 的體積: ", volume);
console.readkey();}}
}
box1 的體積: 210下表描述了 c# 中運算子過載的能力:box2 的體積: 1560
box3 的體積: 5400
運算子描述
+, -, !, ~, ++, --
這些一元運算子只有乙個運算元,且可以被過載。
+, -, *, /, %
這些二元運算子帶有兩個運算元,且可以被過載。
==, !=, <, >, <=, >=
這些比較運算子可以被過載。
&&, ||
這些條件邏輯運算子不能被直接過載。
+=, -=, *=, /=, %=
這些賦值運算子不能被過載。
=, ., ?:, ->, new, is, sizeof, typeof
這些運算子不能被過載。
針對上述討論,讓我們擴充套件上面的例項,過載更多的運算子:
using system;當上面的**被編譯和執行時,它會產生下列結果:public void setlength( double len )
public void setbreadth( double bre )
public void setheight( double hei )
// 過載 + 運算子來把兩個 box 物件相加
public static box operator+ (box b, box c)
public static bool operator == (box lhs, box rhs)
return status;
}public static bool operator !=(box lhs, box rhs)
return status;
}public static bool operator <(box lhs, box rhs)
return status;
}public static bool operator >(box lhs, box rhs)
return status;
}public static bool operator <=(box lhs, box rhs)
return status;
}public static bool operator >=(box lhs, box rhs)
return status;
}public override string tostring()
, , )", length, breadth, height);}}
class tester
", box1.tostring());
console.writeline("box2: ", box2.tostring());
// box1 的體積
volume = box1.getvolume();
console.writeline("box1 的體積: ", volume);
// box2 的體積
volume = box2.getvolume();
console.writeline("box2 的體積: ", volume);
// 把兩個物件相加
box3 = box1 + box2;
console.writeline("box3: ", box3.tostring());
// box3 的體積
volume = box3.getvolume();
console.writeline("box3 的體積: ", volume);
//comparing the boxes
if (box1 > box2)
console.writeline("box1 大於 box2");
else
console.writeline("box1 不大於 box2");
if (box1 < box2)
console.writeline("box1 小於 box2");
else
console.writeline("box1 不小於 box2");
if (box1 >= box2)
console.writeline("box1 大於等於 box2");
else
console.writeline("box1 不大於等於 box2");
if (box1 <= box2)
console.writeline("box1 小於等於 box2");
else
console.writeline("box1 不小於等於 box2");
if (box1 != box2)
console.writeline("box1 不等於 box2");
else
console.writeline("box1 等於 box2");
box4 = box3;
if (box3 == box4)
console.writeline("box3 等於 box4");
else
console.writeline("box3 不等於 box4");
console.readkey();}}
}
box1: (6, 7, 5)box2: (12, 13, 10)
box1 的體積: 210
box2 的體積: 1560
box3: (18, 20, 15)
box3 的體積: 5400
box1 不大於 box2
box1 小於 box2
box1 不大於等於 box2
box1 小於等於 box2
box1 不等於 box2
box3 等於 box4
C 運算子過載 過載特殊運算子
賦值運算子用於同類物件間的相互賦值。賦值運算子只能被過載為類的非靜態成員函式,不能過載為友元函式和普通函式。對於使用者自定義的類而言,如果沒有過載賦值運算子,那麼c 編譯器會為該類提供乙個預設的過載賦值運算子成員函式。預設賦值運算子的工作方式是按位對拷,將等到右邊物件的非靜態成員拷貝給等號左邊的物件...
C 運算子過載賦值運算子
自定義類的賦值運算子過載函式的作用與內建賦值運算子的作用類似,但是要要注意的是,它與拷貝建構函式與析構函式一樣,要注意深拷貝淺拷貝的問題,在沒有深拷貝淺拷貝的情況下,如果沒有指定預設的賦值運算子過載函式,那麼系統將會自動提供乙個賦值運算子過載函式。賦值運算子過載函式的定義與其它運算子過載函式的定義是...
C 運算子過載轉換運算子
為什麼需要轉換運算子?大家知道對於內建型別的資料我們可以通過強制轉換符的使用來轉換資料,例如 int 2.1f 自定義類也是型別,那麼自定義類的物件在很多情況下也需要支援此操作,c 提供了轉換運算子過載函式 它使得自定義類物件的強轉換成為可能。轉換運算子的生命方式比較特別,方法如下 operator...