2013-10-29 28 views
-1

我讀了C++ primer第5版。當我們在使用複製和交換的賦值操作符中使用非參考參數時,我發現它是可以的,但在其他賦值操作符中,我們總是使用參考參數並在銷燬左操作數之前複製右手操作數,以確保如果一個對象被分配給自己,賦值操作符就可以正常工作爲什麼不在將在函數體中稍後複製的賦值運算符中使用非引用參數,以便我們不需要複製函數體中的右側操作數?爲什麼要在C++中通過引用傳遞賦值運算符的參數?

+1

請顯示您正在談論的代碼。 – greatwolf

回答

3

複製賦值操作符通常應該按值(不是引用)採用它們的參數,以便使用by-value參數作爲副本進行復制和交換。

如果你沒有做(只是)複製和交換,那麼也許你的副本賦值運算符應該通過引用採用它的參數。至於你爲什麼不做複製和交換:可能是因爲該類型的某些特定的優化。考慮一個簡單可複製類型的std::array(爲避免談論異常安全性的麻煩,我們可以省略一點)。最有效的可能的任務是直接複製字節:不需要對象的臨時副本,並且您肯定不需要交換。因此,在實踐中,您需要通過參考採用參數,編寫std::copy,並期望編譯器以最佳方式執行此操作。

複製賦值運算符中的特殊外殼自賦值有時會在教科書中看到,即使使用了copy-and-swap,但在C++ 03中通常是一個壞主意。雖然它優化了自我分配的情況,但通過引用參數可以優化臨時分配的情況。在C++ 11中,它不太明顯不好,因爲臨時分配的情況可以由移動賦值運算符而不是複製賦值運算符來處理。但它可能仍然沒有必要。在實際代碼中,自分配很少見,因此甚至可以發現,在極少數情況下,常見情況下的指針比較運算結果高於。

我還沒有閱讀第五版的「C++ Primer」,並且你選擇不顯示你詢問的代碼,所以我不能評論它給出賦值操作符的具體情況(複製分配或以其他方式),通過引用參數。

對不起,但總的來說,我認爲這是統計上更可能你感到困惑比書;-)你說:

...在使用複製和交換賦值運算符,但在其他賦值運算符

好了,「其他賦值運算符」是賦值運算符是使用複製和交換?

我們一直使用的參考參數和銷燬 左側操作數

之前複製右手操作如果複製右側操作數,那麼你做複製和交換。或者至少你非常接近它,因爲做了一個副本,除了交換以外,沒有什麼意義可以使副本進入左側。無論哪種方式,如果一個函數的第一件事是複製一個引用參數,那麼它應該已經通過值獲取參數。

以確保賦值運算符正常工作,如果一個對象被分配到自身

如果您確保自分配技術工作正確方法是始終複製右手操作數,那麼你應該按值來取參數。沒有其他需要。但是,還有其他技術可以確保自我分配工作。有可能其中之一發生在你沒有顯示的代碼中。

+0

非常感謝你的回答,我之所以沒有顯示代碼是因爲我有點懶惰:(我認爲我可以清楚地表達出來,但是...我很抱歉,無論如何,我已經得到了我的回答,謝謝 – Sherwin

0

主要原因是效率。對於一個小類/結構體來說,它可能並不重要,但如果它是一個大型複雜類,那是另一回事。如果您按值傳遞,則將調用可能較大且複雜的複製操作。這可能需要大量的內存分配。

真正的答案是有時候沒關係。通常它確實是很重要,所以最好的方法就是始終使用參考。

+0

但在我的情況下,它複製在函數體後面,這兩者之間有什麼不同嗎? – Sherwin

+0

在某些時候,你總是要做某種形式的複製或分配(無論是愚蠢的整個事物的memcopy,成員或者成員,或者任何有意義的東西,但是如果你將值傳遞給你的操作符,那麼在你進入操作符的主體之前,你還使用拷貝構造函數創建了一個額外的對象。 – mjs

+0

@SteveJessop您可以單向讀取問題,也可以讀取另一個問題。也許如果OP發佈代碼....... – mjs

相關問題