2016-05-26 29 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# –