您可以重定義或過載 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
box2 的體積: 1560
box3 的體積: 5400
下表描述了 c# 中運算子過載的能力:
運算子描述
+, -, !, ~, ++, –
這些一元運算子只有乙個運算元,且可以被過載。
+, -, *, /, %
這些二元運算子帶有兩個運算元,且可以被過載
==, !=, <, >, <=, >=
這些比較運算子可以被過載。
&&, ||
這些條件邏輯運算子不能被直接過載。
+=, -=, *=, /=, %=
這些賦值運算子不能被過載。
=, ., ?:, ->, new, is, sizeof, typeof
這些運算子不能被過載。
&&, || 條件邏輯運算子不能過載,但可使用能夠過載的 & 和 | 進行計算。
不能過載陣列索引運算子,但可定義索引器。
()不能過載轉換運算子,但可定義新的轉換運算子(請參見 explicit 和 implicit)。
+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=賦值運算子不能過載,但 += 可使用 + 計算
=、.、?:、->、new、is、sizeof 和 typeof 不能過載這些運算子。
比較運算子(如果過載)必須成對過載;也就是說,如果過載 ==,也必須過載 !=。反之亦然,< 和 > 以及 <= 和 >= 同樣如此。
若要在自定義類中過載運算子,您需要在該類中建立具有正確簽名的方法。該方法必須命名為「operator x」,其中 x 是正在過載的運算子的名稱或符號。一元運算子具有乙個引數,二元運算子具有兩個引數。在每種情況下,引數的型別必須與宣告該運算子的類或結構的型別相同
更多操作符過載
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...