Fragen zu Pointern
-
Wo ist der Unterschied zwischen:
void(A& a) und void(A* a)
void(A& a) muss man die Adresse übergeben wo das tatsächliche Objekt liegt
void(A* a) übergibt man ein Zeigerobjekt, dass dahin zeigt, wo das Objekt tatsächlich liegt.
Aber praktisch macht das aus meiner Sicht keinen Unterschied. Beides greift doch letztendlich auf den selben Speicher zu. Warum dann die 2 Varianten?
__________________
Warum muss das so?A& foo(){
return *this;
}A& sagt doch die Funktion soll eine Adresse liefern an der die Klasse A zu finden ist. return *this; müsste aber doch sagen: Gib mir den Inhalt von *this wieder. Also in diesem Fall das Objekt selber.
Wird dann das Objekt bei der Rückgabe automatisch in eine Adresse gewandelt?
-
RichardEb schrieb:
Wo ist der Unterschied zwischen:
void(A& a) und void(A* a)
void(A& a) muss man die Adresse übergeben wo das tatsächliche Objekt liegt
void(A* a) übergibt man ein Zeigerobjekt, dass dahin zeigt, wo das Objekt tatsächlich liegt.
Aber praktisch macht das aus meiner Sicht keinen Unterschied. Beides greift doch letztendlich auf den selben Speicher zu. Warum dann die 2 Varianten?
void(A& a)Stell dir eine Referenz als einen Aliasnamen (abraucht also keinen Speicherplatz) vor.aist einfach nur ein anderer Name für das Objekt das du der Funktion übergibst.void(A* a)Hier istaeinZeiger auf ein Objekt der Klasse A. Ein Zeiger ist eine Variable darum auch Zeigervariable. Eine Variable braucht Speicherplatz. Ein Zeiger verbraucht also X Bytes.Es sind zwei verschiedene Sachen, auch wenn du das Gleiche erreichen kannst. Das eine ist call-by-reference, das eine ist call-by-value (weil ja die Zeigervariable kopiert wird). Es ist Situationsabhängig, wann du was nimmst. Wann du nun was nimmst, lernst du mit der Zeit.
Ansonsten noch ein paar Unterschiede:
-Zeiger ist ein Objekt.
-Zeiger können auf Null zeigen.
-Zeiger erlauben Zeigerarithmetik.
-Zeiger benötigen explizite Dereferenzierung.
-Referenzen sind unveränderlich und müssen bei der Definition initialisiert werden.
-Zeiger können umgebogen werden, Referenzen sind von Haus aus immer konstant und müssen daher initialisert werden.
-
RichardEb schrieb:
Warum muss das so?
A& foo(){
return *this;
}A& sagt doch die Funktion soll eine Adresse liefern an der die Klasse A zu finden ist. return *this; müsste aber doch sagen: Gib mir den Inhalt von *this wieder. Also in diesem Fall das Objekt selber. Müsste es also nicht eigentlich retunr &this heißen?
Wenn du etwas zurückgibst, das bereits vor dem Aufruf der Funktion existiert, dann ist eine Rückgabe per Referenz eine super logische Idee. *this ist ja das Objekt selbst und muss also vor dem Aufruf der Funktion existieren (ohne das Objekt könntest du sie ja nicht aufrufen). Natürlich kannst du auch A* zurückgeben, aber dann ja immer dereferenzieren, ist ja doof.
-
RichardEb schrieb:
Wo ist der Unterschied zwischen:
void(A& a) und void(A* a)
void(A& a) muss man die Adresse übergeben wo das tatsächliche Objekt liegt
void(A* a) übergibt man ein Zeigerobjekt, dass dahin zeigt, wo das Objekt tatsächlich liegt.
Nein, bei der ersten Signatur übergibst Du eine Referenz, bei der zweiten Signatur übergibst Du einen Pointer von Typ A, der muss noch nicht zwangsläufig auf etwas zeigen.
RichardEb schrieb:
Aber praktisch macht das aus meiner Sicht keinen Unterschied. Beides greift doch letztendlich auf den selben Speicher zu. Warum dann die 2 Varianten?
Also es kommt meistens darauf an.
Wenn Du einen Pointer in der Hand hast dann übergibst Du halt an die Funktion einen Pointer, wenn Du aber nur ein Objekt in der Hand hast dann übergist Du die Referenz.
Es kommt auch darauf ob e.g. ,dass was du übergibst auch mal nicht da sein kann.
Dann würdest Du in dem Fall wo du das Objekt hast einen Pointer zu dem Objekt übergeben und in den Szenarios wo er nicht da ist einfach einen nullptr.RichardEb schrieb:
A& foo(){
return *this;
}
A& sagt doch die Funktion soll eine Adresse liefern an der die Klasse A zu finden ist. return *this; müsste aber doch sagten: Gib mir den Inhalt von *this wieder. Ist *this also in diesem Fall ein Pointer auf das Objekt, sodass *this nur die tatsächliche Adresse liefert wo A liegt?this = der Pointer der auf das current Objekt zeigt.
*this = ist das Objekt selbst da Du den Pointer dereferenzierst mit anderen Worten übergibst Du da die Referenz auf das Objekt this.