2010-05-30 248 views
6

當在C++中重載一個類的賦值操作符時,它的參數是否必須是引用?賦值運算符的參數必須是參考嗎?

例如,

class MyClass { 
public: 
... 
MyClass & operator=(const MyClass &rhs); 
... 
} 

難道是

class MyClass { 
public: 
... 
MyClass & operator=(const MyClass rhs); 
... 
} 

謝謝!

回答

9

重載賦值運算符的參數可以是任何類型,它可以通過引用或值傳遞(如果類型不是可複製構造的,那麼顯然它不能通過值傳遞)。

因此,例如,你可以有一個賦值操作符,它接受一個int作爲參數:

MyClass& operator=(int); 

拷貝賦值運算符是一個賦值運算符的一種特殊情況。它是任何賦值運算符,它通過值或引用(類型可以是const或volatile)來採用與類相同的類型。

如果您沒有明確實現某種形式的複製賦值運算符,則會由編譯器隱式聲明和實現。

+0

謝謝,詹姆斯!對於複製賦值運算符,是否有任何類類型不可複製構造?我認爲所有的類類型至少有一個默認的複製構造函數? – Tim 2010-05-30 22:52:53

+0

@Tim:好的:如果你有一個類的_private_用戶聲明的拷貝構造函數,那麼拷貝構造函數將不可訪問(除非你在該類的成員函數或朋友中),並且該類不會被複制。如果您聲明瞭複製構造函數但未定義它,那麼該類根本就不是可複製的(並且試圖複製構造實例會導致鏈接器錯誤)。這兩種技術都被用於(通常是一起)使得類不能被複制。 – 2010-05-30 23:27:32

+0

謝謝!我想知道在哪些情況下不需要複製課程? – Tim 2010-05-31 03:46:41

5

一般來說,它是由你來決定,沒有必須。第一個變體是常見的和「canonic」,對於任何賦值操作符實現都可以。

當問題是速度,我認爲你應該閱讀this article關於傳遞值技術。這意味着在某些情況下,通過值傳遞比通過const引用傳遞更有效。

此外,您的第二個變體不需要const關鍵字,因爲按值傳遞的行爲就像創建副本一樣,所以原始對象絕對不會被更改。

+0

謝謝科蒂!粗略閱讀它,但不太明白爲什麼按引用傳遞比傳遞值慢? – Tim 2010-05-31 03:53:57

+0

好吧,通常情況並非如此,但本文的重點在於,如果您在通過引用傳遞對象後立即執行對象拷貝,則由於編譯器優化,它將比傳遞值和分配該拷貝要慢。這實際上是棘手的,但並不完全沒有意義...... – 2010-05-31 05:50:17

5

C++ Operator Overloading Guidelines建議,賦值運算符得到一個const引用。根據該網站,原因是我們不想改變參數(自const以來),而只是操作符的左側。因此通過引用節省時間來傳遞它。

它也指出了爲什麼還有一個引用是由賦值操作符 - 操作符鏈接返回的原因。爲了得到a = (b = 1)的工作,有必要(b = 1)返回一個可以分配的參考(=)到a

+0

優秀的鏈接... – 2015-02-20 16:49:59

3

您是否知道複製並調換用於異常安全賦值的習慣用法?

MyClass& operator=(const MyClass& rhs) 
{ 
    MyClass copy(rhs); 
    swap(copy); 
    return *this; 
} 

的實施可以簡化(在某些情況下加速)的值通過調用:

MyClass& operator=(MyClass copy) 
{ 
    swap(copy); 
    return *this; 
} 
-2

好,我有這個問題,我無法找到一個很好的答案,所以我去分享我學到的東西。

你可以通過價值傳遞,沒有什麼不對。 (正如你在你的問題中所展示的那樣)。

但是,我們通過const引用傳遞參數的原因是,函數不會調用被調用的值的實際副本。它的引用,所以它只是指向那個值存儲在任何地方。

這節省了處理時間,特別是如果它的東西很大,有成千上萬的名字...... 在這種情況下,節省的時間幾乎沒有。

對於常量來說,它確保了函數的用戶不會改變參考值,因爲它可以被更改,因爲您可以訪問內存中的原始位置,因爲它通過引用傳遞。 如果你的函數定義實際上改變了被const引用調用的參數的值,那將是一個編譯器錯誤,它不會讓你這樣做。因爲當你放置const時,你告訴編譯器這個值不能改變。

+0

請考慮像這樣的討論到評論。 – wizulus 2014-02-28 23:05:50

+0

你是什麼意思?對不起,我是新人,我想我寫的是評論。 – 3366784 2014-03-01 17:37:22

+0

問題或答案在左側有大量上下箭頭。在每個說「添加評論」下有一個鏈接。點擊它會給你一個簡單的文本框來輸入評論,就像你剛纔使用的那個一樣。你之前做過的是在頁面底部的一個叫**「你的答案**」部分輸入一個**答案**。歡迎來到StackOverflow :) – wizulus 2014-03-01 18:07:19