簡體   English   中英

為什么應在C ++中通過引用傳遞賦值運算符的參數?

[英]why should the parameter of assignment operator be passed by reference in C++?

我讀了C ++入門5。 我看到當我們在使用復制和交換的賦值運算符中使用非引用參數時是可以的,但是在其他賦值運算符中,我們總是使用引用參數並復制右手操作數,然后銷毀左手操作數以確保如果將對象分配給自身,賦值運算符將正常工作。 為什么不在以后將在函數體中復制的賦值運算符中使用非引用參數,以便我們不必在函數體中復制右側操作數?

復制賦值運算符通常應按值(而不是引用)獲取其參數,以便使用按值參數作為副本進行復制和交換。

如果您不執行(只是)復制和交換,則您的復制分配操作員應該通過引用獲取其參數。 至於為什么不進行復制和交換:可能是由於對該類型進行了一些特定的優化。 例如,考慮一個普通可復制類型的std::array (為了避免談論異常安全的麻煩,這很簡單)。 最有效的分配方法是直接復制字節:您不需要對象的臨時副本,當然也不需要交換。 因此,在實踐中,您可以通過引用獲取參數,編寫std::copy ,並期望編譯器以最佳方式進行操作。

有時即使在進行復制和交換的情況下,在教科書中也可以看到復制分配運算符中的特殊情況下的自我分配,但在C ++ 03中通常是個壞主意。 盡管按引用參數優化了自賦值的情況,但從臨時參數取消優化了賦值的情況。 在C ++ 11中,它的壞處不那么明顯,因為可以通過移動分配運算符而不是復制分配運算符來處理臨時賦值的情況。 但這仍然是不必要的。 自賦值在實際代碼中很少見,因此甚至可以發現,在常見情況下,指針比較比在罕見情況下的復制要多得多的運行時間。

我尚未閱讀《 C ++ Primer》的第五版,並且您選擇不顯示您所要求的代碼,因此我無法評論其中給出賦值運算符的特定情況(復制賦值或否則)通過引用獲取參數。

抱歉,但總的來說,我認為從統計上來說,您比這本書更容易使您感到困惑;-)您說:

...在使用復制和交換的賦值運算符中,但在其他賦值運算符中

好的,所以“其他賦值運算符”是使用復制和交換的賦值運算符嗎?

我們總是使用參考參數並在銷毀左手操作數之前復制右手操作數

如果復制右側操作數,則表示正在進行復制和交換。 或至少與您非常接近,因為制作完副本后,除了交換以外,幾乎沒有什么用其他任何方法將副本放到左側。 無論哪種方式,如果函數要做的第一件事是復制按引用參數,那么它應該已經按值采用了該參數。

確保將賦值運算符正確分配給對象

如果確保自賦值正確工作的技術是始終復制右側操作數,則應按值采用參數。 不需要什么了。 但是,還有其他技術可以確保自指派工作。 您未顯示的代碼中可能發生了其中一種情況。

主要原因是效率。 對於小類/結構,這可能無關緊要,但是,如果它是一個大型復雜類,那就是另一回事了。 如果您按值傳遞,則將調用潛在的大型復雜復制操作。 這可能需要大量的內存分配。

真正的答案是有時並不重要。 通常這確實很重要,因此最好的方法是始終使用引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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