當在C++中重載一個類的賦值操作符時,它的參數是否必須是引用?賦值運算符的參數必須是參考嗎?
例如,
class MyClass {
public:
...
MyClass & operator=(const MyClass &rhs);
...
}
難道是
class MyClass {
public:
...
MyClass & operator=(const MyClass rhs);
...
}
?
謝謝!
當在C++中重載一個類的賦值操作符時,它的參數是否必須是引用?賦值運算符的參數必須是參考嗎?
例如,
class MyClass {
public:
...
MyClass & operator=(const MyClass &rhs);
...
}
難道是
class MyClass {
public:
...
MyClass & operator=(const MyClass rhs);
...
}
?
謝謝!
重載賦值運算符的參數可以是任何類型,它可以通過引用或值傳遞(如果類型不是可複製構造的,那麼顯然它不能通過值傳遞)。
因此,例如,你可以有一個賦值操作符,它接受一個int
作爲參數:
MyClass& operator=(int);
拷貝賦值運算符是一個賦值運算符的一種特殊情況。它是任何賦值運算符,它通過值或引用(類型可以是const或volatile)來採用與類相同的類型。
如果您沒有明確實現某種形式的複製賦值運算符,則會由編譯器隱式聲明和實現。
一般來說,它是由你來決定,沒有必須。第一個變體是常見的和「canonic」,對於任何賦值操作符實現都可以。
當問題是速度,我認爲你應該閱讀this article關於傳遞值技術。這意味着在某些情況下,通過值傳遞比通過const引用傳遞更有效。
此外,您的第二個變體不需要const
關鍵字,因爲按值傳遞的行爲就像創建副本一樣,所以原始對象絕對不會被更改。
謝謝科蒂!粗略閱讀它,但不太明白爲什麼按引用傳遞比傳遞值慢? – Tim 2010-05-31 03:53:57
好吧,通常情況並非如此,但本文的重點在於,如果您在通過引用傳遞對象後立即執行對象拷貝,則由於編譯器優化,它將比傳遞值和分配該拷貝要慢。這實際上是棘手的,但並不完全沒有意義...... – 2010-05-31 05:50:17
C++ Operator Overloading Guidelines建議,賦值運算符得到一個const引用。根據該網站,原因是我們不想改變參數(自const以來),而只是操作符的左側。因此通過引用節省時間來傳遞它。
它也指出了爲什麼還有一個引用是由賦值操作符 - 操作符鏈接返回的原因。爲了得到a = (b = 1)
的工作,有必要(b = 1)
返回一個可以分配的參考(=
)到a
。
優秀的鏈接... – 2015-02-20 16:49:59
您是否知道複製並調換用於異常安全賦值的習慣用法?
MyClass& operator=(const MyClass& rhs)
{
MyClass copy(rhs);
swap(copy);
return *this;
}
的實施可以簡化(在某些情況下加速)的值通過調用:
MyClass& operator=(MyClass copy)
{
swap(copy);
return *this;
}
好,我有這個問題,我無法找到一個很好的答案,所以我去分享我學到的東西。
你可以通過價值傳遞,沒有什麼不對。 (正如你在你的問題中所展示的那樣)。
但是,我們通過const引用傳遞參數的原因是,函數不會調用被調用的值的實際副本。它的引用,所以它只是指向那個值存儲在任何地方。
這節省了處理時間,特別是如果它的東西很大,有成千上萬的名字...... 在這種情況下,節省的時間幾乎沒有。
對於常量來說,它確保了函數的用戶不會改變參考值,因爲它可以被更改,因爲您可以訪問內存中的原始位置,因爲它通過引用傳遞。 如果你的函數定義實際上改變了被const引用調用的參數的值,那將是一個編譯器錯誤,它不會讓你這樣做。因爲當你放置const時,你告訴編譯器這個值不能改變。
謝謝,詹姆斯!對於複製賦值運算符,是否有任何類類型不可複製構造?我認爲所有的類類型至少有一個默認的複製構造函數? – Tim 2010-05-30 22:52:53
@Tim:好的:如果你有一個類的_private_用戶聲明的拷貝構造函數,那麼拷貝構造函數將不可訪問(除非你在該類的成員函數或朋友中),並且該類不會被複制。如果您聲明瞭複製構造函數但未定義它,那麼該類根本就不是可複製的(並且試圖複製構造實例會導致鏈接器錯誤)。這兩種技術都被用於(通常是一起)使得類不能被複制。 – 2010-05-30 23:27:32
謝謝!我想知道在哪些情況下不需要複製課程? – Tim 2010-05-31 03:46:41