2011-04-12 61 views
0
class MyClass { 
    public: 
    ... 
    MyClass & operator=(const MyClass &rhs); // return MyClass& 
    ... 
    } 

爲什麼不C++ - 爲什麼operator =返回* this的引用而不是* this的對象?

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

難道它是更有效的參考在這種情況下,返回的原因是什麼?

謝謝

// *更新*

我想我找到了關鍵的原因如下:

int i1, it2, i3; 
(i1 = i2) = i3; // i3 will be assigned to i1 

如果操作的返回類型=是MyClass的,而不是MyClass的&,那麼以下語句不會執行與內部數據類型相同的操作。

MyClass mc1, mc2, mc3; 

(mc1 = mc2) = mc3; 

通過遵循內置類型使用的規則,它被認爲是一種良好的做法。

// *** update *** 

#include "stdafx.h" 
#include <iostream> 

using namespace std; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int i1, i2, i3; 

    i1 = 0; 
    i2 = 2; 
    i3 = 3; 

    (i1 = i2) = i3; 

    cout << "i1: " << i1 << endl; 
    cout << "i2: " << i2 << endl; 
    cout << "i3: " << i3 << endl; 

    return 0; 
} 

// output from VS2010 
/* 
i1: 3 
i2: 2 
i3: 3 
*/ 
+0

見本類似的問題:(http://stackoverflow.com/q/2447696/478288) – chrisaycock 2011-04-12 03:47:21

+0

否,'i3'將不會分配[在C++重載賦值運算符] 'i1'。其實這個行爲在你的'(i1 = i2)= i3'賦值中是未定義的。 – AnT 2011-04-12 04:34:59

+0

@AndreyT:請參閱我的update2。 – q0987 2011-04-12 18:03:21

回答

5

您的「爲什麼不」是什麼意思?這真的取決於你。如果你願意,你可以返回對象的副本而不是參考。沒有什麼不對,除非它可能確實效率較低。

在許多情況下,人們更喜歡返回參考,因爲它更接近內置賦值運算符的語義。內置的運算符返回左值,這意味着你可以編寫代碼就像

int a, b = 0; 
int *p = &(a = b); 
// `p` now points to `a` 

誠然這是不是很有用,但還是如果你想保留左值語義,你需要從返回引用您的賦值運算符。

更新

你更新的例子是不正確。如您所信,(i1 = i2) = i3表達式導致未定義的行爲,而不是「i3將被分配給i1」。確實,賦值運算符返回一個左值的事實可以讓您編譯像(i1 = i2) = i3這樣的表達式。但是,這個特定的表達式是無用的,因爲行爲是未定義的。

在用戶定義分配的情況下,如在您的(mc1 = mc2) = mc3示例中那樣,行爲已定義,但仍然很不實用。你爲什麼要這樣做?

1

只要operator =收到參數(const T&),它就是一個有效的運算符重載。你可以返回你想要的任何值。 例如,如果我想避免連續對象拷貝,我只要你嘗試x = y = z;編譯器會拋出錯誤申報操作員,

void operator = (const T& copy) { } 

,但x = y;仍然是有效的!返回值基於您的要求;如果你想要,你可以返回相同的對象或intchar*,這取決於你。將非const引用返回給*this是流行的約定。

+0

作爲常量引用的參數甚至不是必需的......參數不一定是'const&',它可以是非const引用,或者甚至是按值傳遞。事實上,你可以定義你自己的'operator ='來取任何類型(好吧,如果你沒有聲明'',那麼編譯器會隱式定義'T&operator =(T const&)'?運算符=(T)',''運算符(T&)'或'運算符=(T const&)'是''''是你決定返回的任何內容 – 2011-04-12 07:58:13

+0

Second @David Rodriguez - 這是不正確的說法,該參數應該是一個const引用。實際上到目前爲止,重載=運算符的最佳方式是需要參數值傳遞的copy和swap機制。/questions/3279543/what-the-copy-and-swap-idiom)並更正你的答案。 – 2011-04-12 08:51:31

0

我的C++時代早已逝去,但是您不會在語法中創建類的臨時副本嗎?

HTH

馬里奧

相關問題