[英]defining operator + , = and +=
我曾經從C ++注釋中閱讀以下語句,
在C ++中,定義運算符+和=不能賦予+ =正確的含義。 此語言設計錯誤已在C#中修復
我想知道這句話到底想說什么? 這與操作員過載有關嗎?
我更喜歡C ++運算符重載機制。 對我來說,這絕對不是設計錯誤。
+
, =
和+=
是三個不同的運算符。 如果要使用+=
,則需要重載+=
。 重載+
和=
將使+=
無效。
我想補充一點,在E1 += E2
,就C ++而言, E1
僅被評估一次。 我不知道C#中的確切規則。
它說,在C#中,如果您重載了運算符+,C#會自動將運算符+ =模擬為+和=的組合( a=a+b
等於a+=b
)。 在C ++中,它沒有實現,但不是bug。 在C ++中,+和=不會給您+ =,因為大多數情況下+ =的運行速度比+快,因為不需要再創建一個對象。
這就是為什么大多數運算符+是使用+ =運算符編寫的。 考慮以下代碼:
class foo
{
public:
foo& operator+=(const foo& rhs)
{
//.......
}
};
const foo operator+(const foo& lhs,const foo& rhs)
{
foo temp = lhs;
return temp+= rhs;
}
這意味着在C ++中,如果您為類定義了自己的運算符+
和operator =
,這仍然並不意味着您的類將自動支持+=
運算符。 如果要讓+=
運算符為您的類工作,則必須顯式且單獨定義+=
。
在C#中,如果我理解正確的話,則為您的類定義運算符+
和=
也將意味着您將可以在類中使用運算符+=
。 +=
將通過組合運算符+
和運算符=
來“模擬”。 例如,表達式a += b
將被解釋為a = a + b
。
在C ++中,這種方式不起作用。 如果沒有顯式定義+=
,則即使已定義+
和=
, a += b
也會導致編譯器錯誤。
C#不允許運算符重載=,因為它不允許直接指針管理。 它的行為基於引用還是值類型而固定。 出於同樣的原因,您不能重載+ =。 這意味着將始終進行求和與賦值。 因此,您只能確定+對您的數據結構意味着什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.