2011-05-23 16 views
1

算=在C++類的內部被聲明如下:爲什麼我無法用非參考返回類型定義operator =?

MyType & operator=(const MyType & rhs); 

由此推測等是必要的鏈接。但是,作爲運算符=具有正確的優先級,那麼返回值應該足夠了。

+0

什麼問題? – 2011-05-23 17:57:18

+0

問題用問題標題寫出:爲什麼我不能用非引用返回類型定義operator =? – Narek 2011-05-23 17:58:37

+0

@George:問題標題是一個問題...... – 2011-05-23 17:58:46

回答

4

您當然可以聲明operator =帶有非引用返回類型。事實上,在我實現它的非常罕見的場合,我通常會返回void,因爲我不認爲多個賦值或測試賦值結果是C++的最大特性之一。

+1

+1爲事實正確。雖然我不同意返回'void'的想法!你的班級的大多數用戶(假設這些用戶不僅僅是你!)預計能夠做'a = b = c',然而這可能是嚴峻的。 – 2011-05-23 18:10:17

+0

@Oli如果我記錄它,則不需要。 – 2011-05-23 18:11:41

+2

我明白你的觀點。但大多數人不會閱讀這類文檔(最少驚喜的原則和所有這些)。你同樣可以證明你的'operator +'執​​行乘法的事實! – 2011-05-23 18:14:10

0

如果不按引用返回,則按值返回,並且無法分配值,因爲只有左值是可賦值的。即使可以,也不要緊,因爲分配給它的對象在分配給它之後會很快被銷燬,因爲它只是對象的副本,而不是對象本身。

實際上,你正在試圖做到這一點:

int blah() { int blah = 5; return blah; } 
blah() = 99; 

正如你可以看到顯然是錯誤的。

它的確取決於你做任務的順序,因爲這個問題只會在你改變任務的自然順序時纔會出現,比如讓左邊的一個出現在右邊之前,就像Oli的例子對此答案的評論:

(a = b) = c 

另一個原因是消除不必要的複製,儘管編譯器優化可能會帶走該好處。

你可以閱讀更多的在這裏左值和右值:​​

+0

但是,只有在你做了一些像'(a = b)= c'這樣的隱晦事物時才重要。 – 2011-05-23 18:00:03

+0

@Oli我不太瞭解您的評論,或者爲什麼只有在您更改作業順序時才重要。 – 2011-05-23 18:02:14

+0

@Seth:因爲'a = b = c'被評估爲'a =(b = c)'。顯然,在這種情況下,「operator ='是按引用還是按值返回並不重要。 – 2011-05-23 18:03:45

0

是的,但原因可能或可能不會有無關的優先級。返回引用而不是值的原因與將rhs(在您的示例中)作爲常量引用而不是值的原因相同:更好的性能。因此,如果您願意,您只能返回該值,但要考慮到可能會創建副本。

此外,你必須考慮到你的課程是否準備好或不是副本。

0

你可以通過價值回報,沒有什麼可以阻止你。 「鏈接」人員提到的是像(a = b) = c這樣的陳述,其具有將b分配給a,然後將c分配給a的效果。這幾乎沒有實際用途,所以如果您選擇按值返回,那就完全沒問題。

當前的事態來自事實,即對於原語,賦值就是這樣定義的。因此,編譯器提供的賦值操作符的工作方式相同,並且通常您希望重載運算符的行爲與其內置對等物儘可能相同。不過,在這個特殊情況下,考慮到特定結構的相對模糊,你不可能通過改變這種行爲來混淆任何人。只要你不做一些完全意想不到的事情,比如返回一個布爾值來表示賦值是否成功,那就沒關係。

0

我覺得最好讓編譯器自動生成operator =()。在確實需要指定它的情況下(對於最有可能的深層複製),我不會做任何非標準的事情。這隻會混淆其他開發人員。

不要太聰明:)

+0

雖然你必須有點聰明:如果你的類成員有一個將被動態分配在構造器中的poiter,那你怎麼想到用生成的operator =行爲?在這種情況下,如果你寫a = b; a的同一個指針成員將指向同一個內存...... – Narek 2011-05-23 18:46:30

相關問題