Frage zu Referenzen
-
Hallo

Wieso geht folgendes:
string& Foo(string &text) { return(text); } string text("Ein bisschen Text"); string bar = Foo(text);Wenn folgendes nicht geht?!
string foo("foo"); string bar = &foo;Wo ist der Unterschied?
-
weil für der compiler das & der 'adresse von' operator ist (im zweiten codeabschnitte) und keine referenz
-
Der &-Operator ist Kontextabhängig. Er hat also in unterschiedlichen Situationen auch unterschiedliche Bedeutung. Das gleiche beim *-Operator.
-
Hmm ganz klar ist mir das noch nicht.
string text("Ein bisschen Text"); string &ref = text; string bar = ref; // Was passiert hier genau?! text.clear(); cout<<text<<endl; cout<<bar<<endl;Wieso steht in Bar noch "Ein bisschen Text", wo ich text doch geleert habe?
-
müh schrieb:
Wieso steht in Bar noch "Ein bisschen Text", wo ich text doch geleert habe?
...weil das object 'bar' vor dem clear erzeugt wird. 'bar' ist ein unabhängiger string, keine referenz auf 'text'
-
string bar;ist das gleiche wie
int i;Du hast bei bar erstmal eine Variable angelegt, also wirklich physikalisch im Hauptspeicher ein eigenes Objekt.
Wenn du aber sowas machst:
string str("abc"); string &bar = str;ist bar kein Objekt im Hauptspeicher. Laut Stroustrup ist es vereinfacht gesagt ein anderer Name für ein Objekt. Es ist nur ein Namensschild auf dem bar draufsteht, aber das Namensschild gehört zu str.
string &ref = text; string bar = ref; // Was passiert hier genau?!Hier passiert hier folgendes: ref ist ein anderer Name für text. bar ist ein eigenes Objekt, bekommt den Inhalt von ref (welches eigentlich text ist) zugewiesen.
Fazit: im Hauptspeicher existieren nur 2 Objekte, nämlich text und bar. ref ist nur ein anderer Name (Referenz).
Wie gesagt, du mußt schauen wo das &-Zeichen steht, um deren Beudeutung zu verstehen.
-
Aus diesem Grunde schreiben C++-Programmierer häufig:
int& i; // statt int &i; //bzw. int* i; // statt int *i;um zu zeigen, dass & den Typ verändert.