Der & amp; Version stellt eine Referenz dar, während die * Version einen Zeiger darstellt. Der Unterschied ist viel zu groß für einen typischen SO Post. Ich schlage vor, Sie beginnen bei der C ++ FAQ lite
Ich mag es normalerweise nicht, Beiträge mit der Antwort "Sie sollten google verwenden" zu beantworten. Dies ist jedoch ein Thema, das ich Ihnen sehr rate google. Insbesondere google "C ++ Zeiger vs. Referenzen". Es gibt eine Fülle von Informationen zu diesem Thema und die Diskussionen auf diesen Seiten werden alles übertrumpfen, was wir hier schreiben werden.
Der * ist ein Zeiger, der & amp; ist eine Referenz. Der Unterschied zwischen den beiden ist, dass ein Zeiger ein Bereich des Speichers ist, der dereferenziert werden muss, z. mittels der - & gt; Operator, um als Klasseninstanz "gesehen" zu werden. Ein Verweis ist stattdessen ein "Alias", nur ein alternativer Name für dieselbe Klasseninstanz. Sie müssen nicht die - & gt; Operator mit einer Referenz. Sie verwenden den Punktoperator.
Ich persönlich habe die Referenzen selten verwendet, vor allem, wenn ich ein Wertobjekt hatte, das ich auf dem Stack zugewiesen habe. Der neue Operator gibt immer einen Zeiger zurück, den Sie dann dereferenzieren müssen. Darüber hinaus ist eines der problematischsten Probleme der Referenzen, dass Sie sie nicht auf NULL setzen können. In einigen Fällen ist es praktisch, eine Funktion zu haben, die entweder einen Objektzeiger oder NULL akzeptiert. Wenn Ihre Funktion eine Referenz akzeptiert, können Sie keine NULL übergeben (Sie könnten jedoch das Null-Objektmuster verwenden)
Eine Klasse * kann auf jedes Klassenobjekt zeigen oder auf keines.
Eine Klasse & amp; zeigt immer auf genau ein Klassenobjekt und kann niemals auf ein anderes Objekt zeigen.
Außerdem glaube ich, dass Bjarne ein Mitglied der Gruppe von Leuten ist, die behauptet haben "Arrays in C sind irreparabel gebrochen", eine Klasse * kann auf ein ganzes Ding-Dang Array der Klasse zeigen Objekte, die nacheinander im Gedächtnis aufgereiht sind, und in C gibt es absolut keine Möglichkeit zu sagen, ob eine Klasse * auf eins oder viele Punkte zeigt.
Wie gesagt, sollten Sie es googeln, aber um Missverständnisse zu vermeiden:
Stellen Sie sich eine Referenz als Abkürzung für den ihr zugewiesenen Begriff vor.
Ein zusätzlicher Tipp, den ich anbieten würde, ist folgender:
Verwenden Sie Referenzen, wenn Sie können, Zeiger, wenn Sie müssen. Wenn das Objekt garantiert existiert, sollten Sie wahrscheinlich eine Referenz verwenden. Ist dies nicht der Fall, müssen Sie wahrscheinlich einen Zeiger verwenden.
Ein weiterer Vorteil besteht darin, dass Referenzen Mehrdeutigkeiten bei der Eigentümerschaft beseitigen. Sobald ein Wartungsprogrammierer einen Zeiger sieht, werden sie sich fragen, ob sie ihn löschen sollten.
Sieh dir dieses Beispiel an:
%Vor%Ein Verweis (& amp; amp;) ist genau der gleiche wie ein Zeiger (*), außer dass der C ++ - Compiler sicherstellt, dass er nicht NULL ist. Es kann jedoch immer noch ein Dangling-Zeiger sein (eine Zeigervariable, die keinen Bezug hat, so dass sie als Müll und für jede Verwendung ungültig ist).