Unterschied zwischen Complex &Complex::... und Complex Complex::...

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Unterschied zwischen Complex &Complex::… und Complex Complex::…
Für was steht das &-Zeichen? Hat das irgendwas mit Referenzen zu tun? Und wie interpretiere ich das dann?


CPPIntro → S. 36
Genau, bei & wird eine Referenz auf das Objekt übergeben, welche man nicht mehr dereferenzieren muss, (wie in C).


ja, aber das wäre, wenn es als Parameter übergeben wird. Aber hier steht eine Funktion, z.b. Complex &Complex::operator*=(const Complex &r){…} das erste “&” ist mir unklar.


Die Funktion gibt eine Referenz auf das Objekt selbst zurück. Das ermöglicht dann die Verkettung von solchen Operatoren.


Alles klar, vielen Dank.


Wollte nur mal nachfragen ob ich das jetzt richtig verstanden hab…
Worin liegt jetzt der Vorteil von Complex & gegenueber Complex * als Rueckgabewert?
Dass ich im Fall von Complex & keine Referenz returnen darf sondern die vorher dereferenzieren muss? (return *this)

int &foo(int *bar) { return *bar; } gleich int *foo(int *bar) { return bar; } gleich int *foo(int &bar) { return &bar; } gleich int &foo(int &bar) { return bar; } ? Oder bin ich da jetzt auf dem Holzweg?


Bei Complex& kann man den Rückgabewert einfach so weiter verwenden, bei Complex* müsstest du diesen immer dereferenzieren.

Mit Referenz: A = (B += C);

Mit Pointer: A = * (B += C)

Des Weiteren sind hier Referenzen vom Konzept her einfach „schöner“, da eine Referenz immer nur auf ein und das selbe Objekt verweisen kann und es bei gültigem Code keine „Nullreferenz“ gibt. Einen Pointer könnte man theoretisch umsetzen oder auf null zeigen lassen; dies schließt man durch die Verwendung von Referenzen aus.

This ist ein Complex Pointer, also vom Typ * Complex.
Bei Complex & erwartet man allerdings einen Complex Wert, von daher musst du den this Pointer einmal dereferenzieren:

Complex & bla()
{
return * this;
}

Complex * bla()
{
return this;
}


Muss man eigentlich jedes mal Umcasten, wenn man selber eine Referenz auf ein eigens erstelltes Objekt zeigen lassen möchte? new liefert ja zunächst mal nur einen Pointer zurück. Finde das schon ziemlich komisch, dass man in C++ eigentlich eher Referenzen verwenden sollte (aus den Gründen, die IBLubb genannt hat) aber das in C++ neu eingeführte “new” dann trotzdem wieder einen Pointer zurückliefert.


Nicht falsch verstehen: Referenzen sind nur in diesem konkreten Fall „besser“ als Zeiger. Allgemein sind Zeiger weitaus mächtiger als Referenzen (Speicherverwaltung usw.).
Von daher ist die Aussage „man sollte in C++ eher Referenzen verwenden“ keinesfalls korrekt.

Da „new“ Speicher anlegt, ist es eigentlich nur logisch, dass der Rückgabewert ein Zeiger ist.