簡體   English   中英

定義運算符+,=和+ =

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM