Diese neumodischen C++'ler ... früher, da war alles besser, da hat man das noch mit Zeigern gemacht ... (und die, die von C umgestiegen sind, machen das heute komischerweise immer noch lieber als mit Referenzen)
Naja, ich habe gehört, es sei besser mit konst. Referenzen, aber warum eigentlich? Sind das intern nicht auch Zeiger? Ich meine jetzt, unabhängig von Typsicherheit und Design und so, sind Referenzen besser in der Performance?
Referenzen haben deutliche Vorteile gegenüber Zeigern, nicht, was Geschwindigkeit angeht, aber was Bequemlichkeit angeht:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
|
void foo (string const & x) {...}
void bar (string const * cosnt x) {...}
// Aufruf
{
foo ("Hallo");
}
{
string tmp = "Hallo";
bar (&tmp);
}
|
Referenzen ermöglichen z.B. auch überhaupt erst eine sinnvolle Implementierung des 'operator []'.
Was Referenzen genau sind, schreibt der Standard nicht vor. In einigen Situationen werden Compiler Zeiger verwenden, die automatisch dereferenziert werden, in anderen aber auch gar nichts.
Beispiel:
|
C-/C++-Quelltext
|
1
2
|
int a = 42;
int & b = a;
|
b wird bei modernen Compilern überhaupt nicht existieren. Es wird einfach direkt a eingesetzt.
Natürlich wirkt das Beispiel sinnlos. Jetzt stellt euch aber einen Funktionsparameter vor und außerdem, dass die Funktion geinlined wird. Dann verhält es sich genauso, wie in dem gezeigten Beispiel.
naja, was mir im (bei mir eher seltenen) umgang mit referenzen als ein wenig unpraktisch aufgefallen is, ist, dass es keine möglichkeit gibt, eine referenz quasi auf nichts zurückzugeben (so wie z.b. einen 0 zeiger beim fehlschlag einer aktion), was natürlich in der natur von c++ referenzen liegt...
wie gesagt, ich fands in manchen fällen unpraktisch.
Naja, die meisten sehen das genau andersherum: Mit Referenzen kann man sagen, dass das Objekt garnatiert gültig ist. Wenn etwas nur optional übergeben oder zurückgegeben werden soll kann man das explizit tun (z.B. mit Zeigern oder
boost::optional). So ist deutlich klarer, was gemeint ist.