2016-05-26 25 views
-1

的MWE是重新分配值在操作不起作用=超載

#include <iostream> 

using namespace std; 

class N { 
public: 
    float x; 
    N() { x = 0.0; } 
    N(float a) { x = a; } 
    //N(N &n) { x = n.x; } 
    N &operator=(float f) { cout << "########";return *new N(f); } 
}; 



int main() { 
    N a; 
    a = 3.0; 
    cout << a.x; 
    return 0; 
} 

我想到的是:它打印3,但它實際上打印0看來價值並沒有改變。

然後,我把它變成

x = f; return *this; 

它的工作,爲什麼呢?

+2

無論你讀到'operator ='應該返回一個'new'ed對象的引用,請閱讀其他內容 – user463035818

+1

* * new N(f)'作爲賦值的評估返回。 'cout <<(a = 0.3).x'返回3.0,因爲它訪問賦值返回的表達式。 –

回答

3

當然,它不會改變。你不要在你的賦值操作符中改變它。相反,您會返回一個指向分配給堆的新值的指針並忽略該結果。

+2

我猜想內存泄漏是一種獎勵。 – WhozCraig

+0

是的,我返回一個指向堆中分配的新值的指針。但爲什麼結果被忽略? 'a'得到一個新的指針。當然,'a.x'會改變,對吧? – yuxuan

+0

No. a不*獲取新的指針。一個沒有改變。在堆上有一個全新的結構和新的值。提示:C++不是Java或C# –