Unterschied zwischen Referenzen und Zeigern [duplizieren]

7

Was macht Klasse & amp; meinst du in c ++ und wie unterscheidet es sich von Klasse *?

%Vor%     
user90450 14.04.2009, 00:16
quelle

7 Antworten

20

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.

    
JaredPar 14.04.2009 00:19
quelle
6

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)

    
Stefano Borini 14.04.2009 00:27
quelle
5

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.

    
Thomas L Holaday 14.04.2009 00:24
quelle
0

Ein weiterer Unterschied besteht darin, dass Referenzvariablen initialisiert werden müssen. Sie können keine Referenzvariable wie im Beispielcode erstellen. Das würde einen Compilerfehler erzeugen.

    
zooropa 15.04.2009 00:55
quelle
0

Wie gesagt, sollten Sie es googeln, aber um Missverständnisse zu vermeiden:

  • Referenzen sind keine Variablen
  • Referenzen sind Zeigern NICHT ähnlich (aber Sie können sie auf ähnliche Weise verwenden)

Stellen Sie sich eine Referenz als Abkürzung für den ihr zugewiesenen Begriff vor.

    
user80452 15.04.2009 09:37
quelle
0

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%     
dev_dan 23.04.2009 00:17
quelle
0

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).

    
Dimitri C. 15.04.2009 09:27
quelle

Tags und Links