Zeiger und Referenzen in C + + Teil 2
Weiterbildung mit diesem Versuch, Reihe von Beiträgen über Zeiger und Referenzen, die sprechen über Zeiger begann, Referenzen zu diskutieren heute.
Eine Referenz ist ein Alias für ein Objekt eines Pseudonyms gestattet. Außerdem, sagt, wer das ist mir nicht, aber die sehr Bjarne Stroustrup, rund um das Thema 5,5 seiner Buch, dessen Inhalt so gut, dass ich merke erst jetzt, dass der Deckel hat eine brechende Welle in Form von C. Ich mag das cover!
Deklaration von Referenzen
Ein Verweis auf eine bestimmte Art ist, indem Sie das Zeichen & (kaufmännisches oder kaufmännisches erklärt) nach dem Namen der Art der Referenz. Beachten Sie, dass die gleiche Weise, wie die Erklärung von Zeigern behandeln wir das & Zeichen wie eine Agentur und nicht ein Betreiber. Es ist ein Operator-Deklaration von Zeigern oder Referenzen. Es ist nur eine Notation der Sprache. Da ein Typ T, bedeutet der Ausdruck T & T-Referenz. Zum Beispiel:
/ / Declare eine Integer-Variable Original. / / Es könnte auch sein char, float, etc.. int i; / / Declare Verweise auf die Variable i. / / Alle Formen gleichwertig sind, sondern lieber das erste. / / Beachten Sie, dass die Typen der Verweise muss die gleiche / / Die Variablen verwiesen wird. ra = i ; int & ra = i; rb = i ; int & rb = i; rc = i ; int & rc = i; / / Im Gegensatz Zeiger, erzeugt die folgende Zeile ein / / Compilation error. Man könnte sagen, warum? r1, & r2 ; int & r1, & r2;
Während in C + +-Referenzen erinnern einige Hinweise, sie sind ganz anders. Im Gegensatz zu dem, was geschieht mit Zeigern, muss eine Referenz in der Deklaration initialisiert werden. Der Versuch, einen Verweis ohne sie zu initialisieren erzeugt einen Fehler bei der Kompilierung zu erklären, bedeutet, wird der Compiler in your face "playboy Spieß verloren, verloren!". Die einzige Ausnahme von dieser Regel ist als Referenz angegeben als extern, da sie an einer anderen Stelle des Programms initialisiert werden, aber das ist eine andere rant ist.
Wenn Sie versuchen, indem er erklärt, ein Verweis extern Initialisieren zu verzichten ist der Compiler nicht beschweren, zu betrügen. Wenn es nie benutzt, ok. Wenn der Compiler ist die intelligente und festgestellt, dass es nicht verwendet wird, können Sie sie entfernen auch sie aus der Liste der Symbole. Aber wenn es in jedem Teil des Programms verwendet wird, die Linke auf Ihr Gesicht lachen, lachen "undefined reference to 'nome_da_variavel. Also Dinge schön. Stated einen Hinweis? So iniclalize es. extern? Sind Sie sicher, dass Sie wissen, was du tust?
Die Logik dahinter ist, dass eine Referenz gedacht war, um einen Namen für etwas. Wenn Sie nicht neu starten, wird es nicht umsonst Namen, dann macht es Sinn. Ein sehr wichtiges Detail ist, um einen Verweis zu initialisieren ist nicht auf einen Wert zuzuweisen. Als prório Bjarne sagt, betreibt kein Betreiber zu Bedingungen, dh es gibt keine Möglichkeit, zuweisen, addieren, subtrahieren, etc. mit einer Referenz. Als Referenz ist ein Alias für ein Objekt, wirkt jeder Betreiber nese Objekt, nicht als Referenz. Einmal initialisiert, eine Referenz immer dasselbe Objekt verweisen.
Die erste Falle mit Referenzen, sowie Hinweise ist die Frage der Größe. Während die Größe eines Zeigers (und andere Datenstrukturen) kann mit dem sizeof-Operator, der Größe eines Hinweises kann nicht mit konventionellen Methoden erreicht werden, da bei der Anwendung des sizeof-Operators auf einen Verweis erhalten werden, sind wir eigentlich Anwendung des Operators einwenden, daß es Hinweise, wie wir sahen im vorherigen Absatz.
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | char c; int i; double d; rc = c ; char & rc = c; ri = i ; int & ri = i; rd = d ; Doppel-& rd = d; / / Der sizeof-Operator, sagt die Größe der Typ des Arguments zurück. "Size of char: " << sizeof ( c ) << " bytes" << endl ; cout << "Size of char:" <<sizeof (c) << "Bytes" <<endl; "Size of int: " << sizeof ( i ) << " bytes" << endl ; cout << "Size of int:" <<sizeof (i) << "Bytes" <<endl; "Size of double: " << sizeof ( d ) << " bytes" << endl ; cout << "Size of double:" <<sizeof (d) << "Bytes" <<endl; endl ; cout <<endl; "Size of char&: " << sizeof ( rc ) << " bytes" << endl ; cout << "Size of char &:" <<sizeof (rc) << "Bytes" <<endl; "Size of int&: " << sizeof ( ri ) << " bytes" << endl ; cout << "Size of int &:" <<sizeof (ri) << "Bytes" <<endl; "Size of double&: " << sizeof ( rd ) << " bytes" << endl ; cout << "Größe der Doppel-und:" <<sizeof (rd) << "Bytes" <<endl; |
Techniken für die Größen der Referenzen sind über den Rahmen dieses Textes, aber ich möchte über sie in der Zukunft zu sprechen. Denn jetzt werde ich nur sagen, nicht um zu zeigen, dass gegebenenfalls die Größe eines Verweises ist identisch mit der Größe eines Zeigers.
Das gute Teil der Geschichte ist, dass oft die Größen der Zeiger und Referenzen weit weniger relevant als die Größen der referenzierten oder spitze Gegenstände. Ich persönlich hatte nie auf diese Informationen benutzen, aber für die Entwicklung oder auf verschiedenen Architekturen für Embedded-Systeme, es ist interessanter geworden.
Mit Referenzen
Die Verwendung von Referenzen ist jetzt viel einfacher, als die Zeiger, weil die Betreiber nicht verpflichtet, Adressen oder de-Referenzierung Extrakt werden. Variablenreferenzen werden als gemeinsame Variablen verwendet, stellt fest, dass eine Operation erfolgen in einem Referenzzeitraum immer auf das Objekt verwiesen wird.
17 18 19 20 21 22 23 24 25 26 27 28 29 30 | int x, y; rx = x ; int & rx = x; ry = y ; int & ry = y; ; x = 13; ; y = 10; ; // A atribuição é automaticamente aplicada em x. rx = 42 / / Der Preis wird automatisch angewandt x. // O incremento é automaticamente aplicado em y. ry + + / / Der Zuwachs wird automatisch angewandt y. "x: " << x << endl ; // Valor de x. cout << "x:" <<x <<endl; / / Wert von x. "y: " << y << endl ; // Valor de y. cout << "y:" <<y <<endl; / / Wert von y "rx: " << rx << endl ; // Valor de rx == x. cout << "rx:" <<rx <<endl; / / value == x. rx "ry: " << ry << endl ; // Valor de ry == y. cout << "ry:" <<ry <<endl; / / Wert ry == y. |
Mit einem Verweis wird als für den Programmierer, brauchte er nicht zu wissen, dass eine Referenz ist. Nutzen Sie einfach wie eine normale Variablen. Mit meinem begrenzten Phantasie kann nicht sehen, wie jemand für die Verwendung von Begriffen unangemessen exkommuniziert werden können. Obwohl immer etwas Geist von Schweinen, die nicht Scheiße mit Referenzen können haben, ist viel einfacher, durch Saci aufstehen ausgelöst Zeiger zu behandeln.
Adressen und Referenzen
Aus der Sicht der Murphy, sind die Verweise hässlich, langweilig und dumm, da es nur wenige potenzielle Gefahr darstellen, um mit ihnen zu tun. Selbst als die Adresse gibt es viele Überraschungen (wird?). Betrachten Sie den untenstehenden Code ein:
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | 10 ; int a = 10; 13 ; int b = 13; ra = a ; int & ra = a; rb = b ; int & rb = b; ; ra = 42; ; rb = 7; "ra = " << ra << endl ; // O valor de ra == 42. cout << "ra =" <<ra <<endl; / / Der Wert von ra == 42. "rb = " << rb << endl ; // O valor de rb == 7. cout << "r =" <<rb <<endl; / / Der Wert von rb == 7. "a = " << a << endl ; // O valor de a == ra == 42. cout << "a =" <<a <<endl; / / Der Wert der ra == == 42. "b = " << b << endl ; // O valor de b == rb == 7. cout << "b =" <<b <<endl; / / Der Wert von b rb == == 7. "&a = " << & a << endl ; // O endereço de a. cout << "& a =" <<& a <<endl; / / Die Adresse des a. "&b = " << & b << endl ; // O endereço de b. cout << "& b =" <<& b <<endl; / / Die Adresse des b. "&ra = " << & ra << endl ; // O endereço de ra == &a. cout << "& ra =" <<ra <<endl; / / Die Adresse des ra == & a. "&rb = " << & rb << endl ; // O endereço de rb == &b. cout << "& rb =" <<rb <<endl; / / Die Adresse des rb == & b. |
In den Zeilen 17 und 18 Ich erkläre zwei Integer-Variablen (kann man auch mit ein Beispiel ...). getan In den Zeilen 20 und 21 habe ich zwei Hinweise zu erklären, verweisen die beiden vorherigen Variablen. Danach werden die Variablen, ra und rb sind nur ein Alias für die Variablen a und b. Wie bereits erwähnt, jedes Unternehmen zu den Referenzen tatsächlich angewandten arbeitet auf der referenzierten Objekte, so dass jedes Paar mit variabler Referenz immer den gleichen Wert hat.
Das Interessante daran ist festzustellen, dass die Adressen der Referenzen sind genau die gleichen Adressen der Variablen, die sie referenzieren, anders als Zeiger, die hatten ihre eigenen Adressen. Warum? Weil er sich nicht Pegadinha Malandro. Denken Sie daran, dass das Gerede von einem Betreiber zu wenden, um einen Verweis? Nun, hier verwendet den Operator & ist die "Adresse", die auch direkt auf dem Original-Variablen angewendet wird, und nicht in den Referenzen. Die gleichen Techniken verwendet Ninja zu den Größen der Referenzen erhalten, sind notwendig, um die Adressen von ihnen zu erhalten.
Auch der Spaß daran ist, dass der Verweis Mechanismus ist es, so transparent wie möglich an die Programmierer. Maße und physikalischen Adressen von Referenzen sind irrelevante Informationen aus der Sicht des "normalen" Programm in C + +.
Unterschiede und Gemeinsamkeiten zwischen Zeiger und Referenzen
Beide Zeiger und Referenzen sind die Mechanismen der indirekten in C + +, oder Mechanismen sind von einem bestimmten Symbol (Variable) Ich kann auf ein anderes Objekt zu manipulieren verwendet.
Die wichtigsten Anwendungen für Zeiger sind in der Regel die Verwaltung und Bearbeitung von dynamischen Speicher, Schöpfung und Zerstörung von Gegenständen und Formen für besondere Anlässe stehen, die auch als "Übergabe-Parameter anhand" (so zitiert wird). Seit mehr Referenzen sind Referenzen verwendet werden (warum?) Und das Überladen von Operatoren.
Im Prinzip alles, was wir tun können mit Referenzen können mit Zeigern emuliert werden. Auf der anderen wechselseitig ist nicht immer wahr. Der große Vorteil von ihnen ist jedoch, dass die Dereferenzierung völlig transparent für den Programmierer.
Eine interessante Allegorie zu helfen, besser zu verstehen, die Unterschiede zwischen Zeiger und Referenzen ist der Spitzname. Zum Beispiel: Stellen Sie sich vor, dass eine Person sagen, Dunga, ist unsere ursprüngliche Variable, das Objekt. Dunga ist bereits ein Hinweis auf Dunga, ist es ein Alias für den gleichen Zweck und dieselbe Person sind. Bereits die Mutter von Dunga (oder Dunga, was auch immer), so durch die ruhige Hand Fans zitiert wird, kann als Zeiger auf, weil einige Anbieter von Daten Vokabular, machte ein Kompliment für sie, die Wahrheit ist, indirekt gezielte ihn.
Links
- referencias.zip (alle Quellen der post);
- 01-declaracao.cpp
- 02-tamanhos.cpp
- 03-utilizando.cpp
- 04-enderecos.cpp
- The Guilty
Kommentare
5 Responses to "Zeiger und Referenzen in C + + Teil 2"
Lassen Sie eine Antwort



Great article!
Leider sind die Verweise sind nicht so harmlos, wie sie scheinen. Stellen Sie sich folgende Situationen:
1. Jemand gibt einen Verweis auf eine lokale Variable nicht statisch:
In diesem Fall wird der Gültigkeitsbereich endet, noch bevor jemand den Verweis verwendet.
Die Lösung ist, um einen Verweis als Parameter zu erhalten und nur eine Kopie zu machen: für die Variable "out".
2. Jemand will dynamischen Speicher als normale Variablen verwenden:
Diese Beispiele scheinen Tier, aber nicht so unwahrscheinlich, wie sie scheinen. Nur der Code mit Design Patterns oder andere Unsinn desinfiziert werden, und es explodiert, ohne dass Sie wissen, was passiert ist.
[] S
Caloni, du bist ein Mann zu schnell
Ja, Sie haben völlig Recht. Aber ich ließ es mit Absicht.
Ich habe auch noch nicht gesprochen, um Zeiger oder Referenzen, oder sogar, dass Assoziation zwischen Zeigern und Arrays const, aber ich will reden.
Danke für das Kompliment, es ist sehr motivierend.
Abração
Meine Naivität, daß ich dachte, ich hätte es gegeben wird beendet, wenn Sie ", sagte Aus der Sicht von Murphy, die Verweise hässlich, langweilig und dumm, da es nur wenige potenzielle Gefahr darstellen, um mit ihnen zu tun." Auf jeden Weise bereits empfohlen, Ihren Artikel zu einem Anfänger, weil es eigentlich sehr gut für diejenigen, die wagen für die Unterschiede zwischen C und C + + erläutert.
Ich warte auf das Verfahren.
[] S
Partner plaudern!
Herzlichen Glückwunsch für den Artikel, sehr gut!
[] S
[...] [...] Pointeiros und Referenzen