Wenn ich einen Zeiger auf ein Objekt habe, sagen wir Object *ptr;
, und ich möchte das an eine Methode der Form void foo(Object& obj)
übergeben. Ich verstehe, dass ich schreiben muss:
Aber warum dereference ptr
? Wäre es nicht sinnvoll, es einfach in foo(ptr);
zu übergeben? Ich mache mir Sorgen, dass *ptr
möglicherweise eine Kopie des ursprünglichen Objekts erstellt oder zumindest nicht nur foo
an die Adresse weitergibt, mit der gearbeitet werden soll.
Kann jemand das für mich klären? Übergibt *ptr
einen möglichen Engpass, bei Code, der erwartet, dass sich dieses Verhalten genauso schnell verhält, als wäre die Funktion void foo(Object *obj);
und über foo(ptr)
? Aufgerufen worden?
Ich mache mir Sorgen * ptr erstellt möglicherweise eine Kopie des ursprünglichen Objekts.
Sie liegen falsch. Dereferenzieren eines Zeigers macht keine Kopie!
%Vor%In der letzten Zeile dieses Codes gibt es keine Kopie. Der Standard gibt Ihnen diese Garantie.
Wenn jedoch f
das Argument als Wert verwendet, wird kopiert.
Die Grundlinie: Die Referenz im Funktionsparameter wird verwendet, um vermeiden kopieren (oft) oder als Ausgabeparameter (gelegentlich)!
Wenn ein Objekt als Referenz übergeben wird, wird der Zeiger so übergeben, dass foo (* ptr) korrekt ist und das Objekt nicht kopiert wird. Warum deneferenzieren? Weil die Funktionssignatur ein Objekt und keinen Zeiger auf ein Objekt benötigt. C ++ ist eine stark typisierte Sprache.
Um den Verweis auf eine Funktion zu übergeben, müssen Sie das Objekt wie in der Wertesemantik übergeben. Zeiger sind keine Referenzen, da sie Entitätssemantiken (Adressen) sind.
Wenn Sie einen Zeiger dereferenzieren, erhalten Sie einen tatsächlichen Wert, der als Referenz eingebettet werden kann.
Referenzen und Zeiger sind gleich. Aber Referenzen haben ihren eigenen Vorteil und das ist, dass sie nicht null sein können (obwohl sie es können, aber es ist ziemlich schwer, eine Nullreferenz zu machen), so dass Sie die Prüfung gegen den nullptr weglassen können. Sie können verwenden. anstelle von - & gt; Das ist ein Zeichen kürzer xD. Über Ihre Frage, da die Zeiger Referenzen sind die gleichen am Ende gibt es keine Vorteile der Auswahl eines über dem anderen. Ich meine, die folgenden Codes sind die gleichen, wenn sie kompiliert werden.
%Vor%und
%Vor%Wenn Sie eine Referenz verwenden, wird im Hintergrund eine Dereferenzierung durchgeführt. Hoffe es hat geholfen.