MyClass myObject1(var1, var2);
myObject1.someMethod(); //> Changes the interal state of the object
現在在某些時候我想分配給myObject1
MyClass
類型的「乾淨」的對象。喜歡的東西:
myObject1 = MyClass(otherVar1, otherVar2);
不使用指針(和/或unique_ptr
)有任何快速/有效的方式來做到這一點?
MyClass myObject1(var1, var2);
myObject1.someMethod(); //> Changes the interal state of the object
現在在某些時候我想分配給myObject1
MyClass
類型的「乾淨」的對象。喜歡的東西:
myObject1 = MyClass(otherVar1, otherVar2);
不使用指針(和/或unique_ptr
)有任何快速/有效的方式來做到這一點?
點1。直到您的分析器提供的數據表明您應該這樣做之前,不要擔心性能。否則會被稱爲不成熟的優化,這是一件壞事。首先選擇最簡單的設計。
點2。在C++ 11中,如果在你的情況下有意義(很難說不知道MyClass
的定義),你可以爲MyClass
編寫一個移動賦值運算符。
然而,一個更好的主意是使用RAII包裝如unique_ptr
作爲類的成員,並讓編譯器生成的移動賦值運算符做了成員明智之舉和工作委託給移動分配您的會員的運營商。然後,您的unique_ptr
的移動分配操作員將負責做正確的事情。
這樣你就不用擔心遵循三法則,五法則或什麼的,你會得到最佳表現,並且(作爲獎勵)異常安全。 避免定義你自己的特殊成員函數,習慣於遵循Rule of Zero。
As mentioned by juanchopanza in the comments,在C++ 03中,您可以提供一個無丟包swap()
函數 - 但同樣,根據您的類的定義,這可能會也可能無幫助。
一個便宜的,沒有拋出的'swap'可以是一個很好的C++ 03替代移動構造函數。 – juanchopanza
@ juanchopanza:對,我將其添加到答案中。謝謝! –
什麼意思是快?你的例子全部取決於MyClass的構造函數和MyClass的operator =。 – ForEveR
'MyClass'是否使用指向複製昂貴的數據塊?如果是這樣,請實現一個廉價的交換函數(以及C++ 11的移動拷貝構造函數)。 – juanchopanza
你沒有回答我的問題:-) – juanchopanza