2016-05-07 2 views
1

definiert eine Klasse mit einem Element als Referenz Art zu schaffen:warum das erste Objekt Element wurde geändert, nachdem das zweite Objekt

struct NodeBase{ 
int& val; 
NodeBase(int input = 0) :val{ input }{} 
}; 

Dann zwei Objekt dieser Klasse Typ erstellt:

int value1 = 1, value2 = 2; 
NodeBase first(value1); 
NodeBase second(value2); 

Bei Das first wurde erstellt, sein Mitglied val ist gleich 1. Nach dem Erstellen von second wurde jedoch der Wert val in first auf 2 geändert. Nicht sicher, warum dies geschieht.

+2

Die Referenzen baumeln, weil sie auf Werte gebunden sind, die nicht mehr am Leben sind (nämlich den Konstruktor Parameter Variable). Es ist daher ein undefiniertes Verhalten, um die Referenzen zu bewerten. –

+1

In vordefinierte Variablen geändert und Problem ist das gleiche. – lightrek

+3

Egal, Referenz bindet an den Funktionsparameter, der am Ende des Konstruktors stirbt. –

Antwort

2

Die Referenz bindet an den Funktionsparameter input, der beim Abschluss des Konstruktors den Gültigkeitsbereich verlässt. Dies lässt die Referenz baumeln.

Nehmen Sie stattdessen eine Referenz als Parameter, damit sich die Referenz auf ein externes Objekt bezieht.

NodeBase(int& input) :val{ input }{} 

Wenn Sie nicht wollen, um die Klasse zu externen Variablen beziehen, machen das Mitglied eine einfache int ohne Referenz. Wenn Sie versuchen, ein Standardargument zu haben, das für den nichtkonstanten Referenzfall keinen Sinn ergibt, sollten Sie dies wahrscheinlich tun.

0

Sie müssen Eingang als auch von Referenz zu übergeben:

struct NodeBase{ 
    int& val; 
    NodeBase(int& input) :val{ input }{} 
}; 

Wenn Sie nicht, val die lokalen Parameter verweisen, die nicht mehr existiert, sobald der Konstruktor beendet hat. Es ist also undefiniertes Verhalten.

Beachten Sie, dass Sie Ihr Standardargument =0 nicht angeben können, das keine Bedeutung hat, wenn eine Referenz beibehalten wird.

0

Sie übergeben als Kopie, die in input gespeichert werden. Dann speichern Sie eine Referenz auf input Variable. Nicht zu value1. Wenn also der Konstruktor terminiert, bist du der Referenzwürfel. Und wurde zu einer unverbindlichen Referenz.

Versuchen Sie folgendes:

struct NodeBase{ 
    int& val; 
    NodeBase(int& input) :val{ input }{} 
};