算=在C++類的內部被聲明如下:爲什麼我無法用非參考返回類型定義operator =?
MyType & operator=(const MyType & rhs);
由此推測等是必要的鏈接。但是,作爲運算符=具有正確的優先級,那麼返回值應該足夠了。
算=在C++類的內部被聲明如下:爲什麼我無法用非參考返回類型定義operator =?
MyType & operator=(const MyType & rhs);
由此推測等是必要的鏈接。但是,作爲運算符=具有正確的優先級,那麼返回值應該足夠了。
您當然可以聲明operator =
帶有非引用返回類型。事實上,在我實現它的非常罕見的場合,我通常會返回void
,因爲我不認爲多個賦值或測試賦值結果是C++的最大特性之一。
+1爲事實正確。雖然我不同意返回'void'的想法!你的班級的大多數用戶(假設這些用戶不僅僅是你!)預計能夠做'a = b = c',然而這可能是嚴峻的。 – 2011-05-23 18:10:17
@Oli如果我記錄它,則不需要。 – 2011-05-23 18:11:41
我明白你的觀點。但大多數人不會閱讀這類文檔(最少驚喜的原則和所有這些)。你同樣可以證明你的'operator +'執行乘法的事實! – 2011-05-23 18:14:10
如果不按引用返回,則按值返回,並且無法分配值,因爲只有左值是可賦值的。即使可以,也不要緊,因爲分配給它的對象在分配給它之後會很快被銷燬,因爲它只是對象的副本,而不是對象本身。
實際上,你正在試圖做到這一點:
int blah() { int blah = 5; return blah; }
blah() = 99;
正如你可以看到顯然是錯誤的。
它的確取決於你做任務的順序,因爲這個問題只會在你改變任務的自然順序時纔會出現,比如讓左邊的一個出現在右邊之前,就像Oli的例子對此答案的評論:
(a = b) = c
另一個原因是消除不必要的複製,儘管編譯器優化可能會帶走該好處。
你可以閱讀更多的在這裏左值和右值:
但是,只有在你做了一些像'(a = b)= c'這樣的隱晦事物時才重要。 – 2011-05-23 18:00:03
@Oli我不太瞭解您的評論,或者爲什麼只有在您更改作業順序時才重要。 – 2011-05-23 18:02:14
@Seth:因爲'a = b = c'被評估爲'a =(b = c)'。顯然,在這種情況下,「operator ='是按引用還是按值返回並不重要。 – 2011-05-23 18:03:45
是的,但原因可能或可能不會有無關的優先級。返回引用而不是值的原因與將rhs(在您的示例中)作爲常量引用而不是值的原因相同:更好的性能。因此,如果您願意,您只能返回該值,但要考慮到可能會創建副本。
此外,你必須考慮到你的課程是否準備好或不是副本。
你可以通過價值回報,沒有什麼可以阻止你。 「鏈接」人員提到的是像(a = b) = c
這樣的陳述,其具有將b
分配給a
,然後將c
分配給a
的效果。這幾乎沒有實際用途,所以如果您選擇按值返回,那就完全沒問題。
當前的事態來自事實,即對於原語,賦值就是這樣定義的。因此,編譯器提供的賦值操作符的工作方式相同,並且通常您希望重載運算符的行爲與其內置對等物儘可能相同。不過,在這個特殊情況下,考慮到特定結構的相對模糊,你不可能通過改變這種行爲來混淆任何人。只要你不做一些完全意想不到的事情,比如返回一個布爾值來表示賦值是否成功,那就沒關係。
我覺得最好讓編譯器自動生成operator =()。在確實需要指定它的情況下(對於最有可能的深層複製),我不會做任何非標準的事情。這隻會混淆其他開發人員。
不要太聰明:)
雖然你必須有點聰明:如果你的類成員有一個將被動態分配在構造器中的poiter,那你怎麼想到用生成的operator =行爲?在這種情況下,如果你寫a = b; a的同一個指針成員將指向同一個內存...... – Narek 2011-05-23 18:46:30
什麼問題? – 2011-05-23 17:57:18
問題用問題標題寫出:爲什麼我不能用非引用返回類型定義operator =? – Narek 2011-05-23 17:58:37
@George:問題標題是一個問題...... – 2011-05-23 17:58:46