2012-03-28 6 views
-1

Warum funktioniert die Initialisierung von C++ - Referenzen ohne den "address-of" -Operator (&)?
Ist die Zuordnung von Objekt mit einem Typ A zu einer Referenz vom Typ A& nicht falsch?
Sollte bei der Zuweisung nicht der Operator "&" auf der rechten Seite verwendet werden?Initialisieren einer C++ - Referenz - warum nicht den Adressoperator verwenden?

int var = 2 
int& ref = var //why can we assign var of type 'int' to ref of type 'int&'? 
int& ref = &var //shouldn't it be like that, so that we will assign the ADRESS to the reference? 

EDIT: Um es zusammenzufassen:

  • Referenzen alternative Namen für Objekte sind.
  • Der Typ der Referenzen wird erstellt, indem '&' an den Typ des referenzierten Objekts angehängt wird.
  • Verweise sind in jedem Kontext identisch mit dem Verweisobjekt.
  • Sie speichern den Speicher des Objekts nicht als Zeiger, das Vorhandensein des "Adresse-von" -Operators "&" war hier irreführend.
+10

Weil es kein Zeiger ist. –

+4

"* wieso können wir var vom Typ' int' auf ref vom Typ 'int &' 'zuweisen?" Wenn das eine echte Frage ist, dann muss ich wirklich mit [einem guten Buch] anfangen (http: // stackoverflow .com/q/388242/636019). – ildjarn

+0

Ja, ich lese ein Buch und versuche gerade die Gründe dafür zu verstehen, warum die Referenzen und Zeiger in C++ existieren, aber nicht in C. Überraschenderweise ist das Internet voll mit Erläuterungen zu Zeigern und Speicherrelationen, aber nicht zu Referenzen. – Skip

Antwort

3

Ein Verweis enthält nicht die Adresse des Objekts, wie Sie durch Ihre Kommentare angedeutet haben. Das ist ein Zeiger. Referenzen! = Zeiger.

Eine Referenz ist ein Alias ​​für ein Objekt, weshalb diese Art der Zuweisung funktioniert.

+0

Ich weiß, dass Compiler Referenzen als Zeiger implementieren. Ich dachte, dass Referenzen als statische Zeiger gesehen werden können? – Skip

+0

Sie können sie sehen, was Sie wollen, aber was wichtig ist, ist, wie sie verwendet werden. Ich würde mich auf die Unterschiede konzentrieren, im Gegensatz zu den Ähnlichkeiten, da die Ähnlichkeiten Sie verwirrt haben. – ShiggityShiggityShwa

+0

Um es zusammenzufassen: Referenzen sind alternative Namen für Objekte. Der Typ der Referenzen wird erstellt, indem '&' an den Typ des referenzierten Objekts angehängt wird. Verweise sind in jedem Kontext die gleichen wie das Verweisobjekt. Sie speichern die Erinnerung an das Objekt nicht wie Zeiger, das Vorhandensein des 'Adresse-von'-Operators' & 'war hier irreführend – Skip

0

int & ist ein Typ

& var eine Operation Adresse zu nehmen.

Gleiches Symbol. Völlig andere Mentionen. Wahrscheinlich speziell entwickelt, um C++ für Neueinsteiger unzugänglich zu machen.

0

„Ich weiß, dass Compiler Referenzen als Zeiger implementieren“

Nein, tun sie nicht. Dies ist eine häufige Quelle der Verwirrung. Wenn Sie dies tun:

int p; 
int *r = &p; 

Sie erstellen, sagen wir, ein 32-Bit-Zeiger in den Speicher, den Sie Daten manipulieren können.

jedoch, wenn Sie dies tun:

int p; 
int& r = p; 

Sie einen Zeiger auf p nicht verwendet wird. Es gibt ein Objekt p, das sich in einem Register befinden kann, oder der Stapel oder der Haufen, es ist nicht wichtig. Die Deklaration bedeutet, dass r dasselbe Objekt referenziert. Es ist kein Zeiger auf das Objekt: Wenn Sie einen Zeiger erstellen, erstellen Sie ein neues Objekt. Sie sagen "r zeigt auf p." Wenn Sie jedoch eine Referenz verwenden, sagen Sie "r ist p." Kein neues Objekt wird erstellt (ein Zeiger). Für alle Absichten und Zwecke, int & r ist p, weil jede Verwendung davon Referenzen (nicht zeigt auf) p.

Lassen Sie es mich so sagen:

Es ist wie wenn man sagt, es gibt diese Person, Dave. Er lebt bei (erfundene Adresse)

Dies deutet auf Dave.

Und dann hat er einen Spitznamen, OrgnlDave.

OrgnlDave zeigt nicht auf Dave, es ist ist Dave, es ist nur eine andere Art, es zu sagen. Es gibt nur einen Dave. "Hallo OrgnlDave" zu sagen ist gleichbedeutend mit "Hallo Dave", was anders ist, als Dave einen Brief zu schicken.

In Pseudo-Code,

person Dave; 
address(Dave, made-up-address) pointer; 
person& OrgnlDave means Dave; // and we indicate that by using the & 

Hi(pointer); // Sends Dave a cordial letter 
Hi(Dave);  // Says hi to Dave 
Hi(OrgnlDave); // Says hi to Dave 
Verwandte Themen