2016-05-26 9 views
-1

Die MWEUmhängen Wert nicht in Bediener arbeiten = Überlastung

#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; 
} 

ist, was ich erwarte, ist: es 3 druckt, aber er druckt tatsächlich 0. Der Wert scheint nicht zu ändern.

Dann wechsle ich es in

x = f; return *this; 

Es funktionierte, warum?

+2

Wenn Sie lesen, dass 'operator =' den Verweis auf ein 'neues' Objekt zurückgeben soll, lesen Sie bitte etwas anderes – user463035818

+1

Das' * new N (f) 'wird als Auswertung der Zuweisung zurückgegeben. 'cout << (a = 0.3) .x' gibt 3.0 zurück, wenn auf den von der Zuweisung zurückgegebenen Ausdruck zugegriffen wird. –

Antwort

3

Natürlich ändert es sich nicht. Sie ändern es nicht in Ihrem Zuweisungsoperator. Stattdessen geben Sie einen Zeiger auf einen neuen Wert zurück, der auf dem Heap zugewiesen ist, und ignorieren dieses Ergebnis.

+2

Das Speicherleck ist ein Bonus, nehme ich an. – WhozCraig

+0

Ja, ich gebe einen Zeiger auf einen neuen Wert zurück, der auf dem Heap zugewiesen ist. Aber warum wurde das Ergebnis ignoriert? 'a' holen Sie sich einen neuen Zeiger. Natürlich wird sich 'a.x' ändern, oder? – yuxuan

+0

Nein, a * bekommt * keinen neuen Zeiger. a hat sich nicht geändert. Es gibt eine brandneue Struktur auf dem Haufen mit dem neuen Wert. Hinweis: C++ ist nicht Java oder C# –