C++ Referenz
Eine Referenzvariable ist ein Alias, das heißt ein anderer Name für eine bereits existierende Variable.
Sobald eine Referenz mit einer Variablen initialisiert wurde, können Sie den Referenznamen oder den Variablennamen verwenden, um auf die Variable zu verweisen.
Eine Referenz muss bei der Definition initialisiert werden, und sobald sie an eine Variable gebunden ist, kann sie nicht an eine andere Variable gebunden werden.
Die Syntax für Referenzen ist wie folgt:
int a = 10; int &ref = a; // ref 是 a 的引用
int &refRepräsentiertrefist einintReferenz auf Typ.refJaaein Alias für,refDie Operation wirkt direkt aufa。
C++-Referenzen vs. Zeiger
Referenzen werden leicht mit Zeigern verwechselt; es gibt drei Hauptunterschiede zwischen ihnen:
- Es gibt keine Null-Referenzen; eine Referenz muss mit einem Stück gültigen Speichers verbunden sein.
- Sobald eine Referenz auf ein Objekt initialisiert wurde, kann sie nicht auf ein anderes Objekt zeigen. Ein Zeiger kann jederzeit auf ein anderes Objekt zeigen.
- Eine Referenz muss bei der Erstellung initialisiert werden. Ein Zeiger kann jederzeit initialisiert werden.
- Das von einer Referenz referenzierte Objekt muss eine Variable sein, während ein Zeiger eine Adresse sein muss.
| Funktionen | Referenz | Zeiger |
|---|---|---|
| Definition und Initialisierung | Muss initialisiert werden und kann nichtnull。 | Es kann uninitialisiert bleiben, kann im nachfolgenden Code auf andere Objekte zeigen und kannnull。 |
| Syntax | Nutzung&Deklaration, zum Beispiel:int &ref = a; | Nutzung*Deklaration, zum Beispiel:int *ptr = &a; |
| Neubindung | Es kann nicht neu gebunden werden; sobald es initialisiert ist, verweist es immer auf dasselbe Objekt. | Kann neu zugewiesen werden, um auf ein anderes Objekt zu zeigen, zum Beispiel:ptr = &b; |
| Nullwert (Nullbarkeit) | kann nicht seinnull, muss an ein gültiges Objekt gebunden sein. | kann seinnull, was bedeutet, dass es auf kein Objekt verweist. |
| Speicherverbrauch | Es belegt keinen zusätzlichen Speicher (der Compiler optimiert es normalerweise so, dass er direkt auf dem referenzierten Objekt operiert). | Es belegt zusätzlichen Speicher (speichert eine Adresse, normalerweise ein Maschinenwort, z. B. 4 Bytes oder 8 Bytes). |
| Zugriffsmethode | Es wird direkt verwendet, ohne einen Dereferenzierungsoperator zu benötigen, zum Beispiel:ref = 10; | müssen verwendet werden*Verwenden Sie den Dereferenzierungsoperator, um auf das Objekt zuzugreifen oder es zu ändern, auf das gezeigt wird, zum Beispiel:*ptr = 10; |
| Mehrstufige Indirektion | Es unterstützt keine mehreren Ebenen der Indirektion (es kann keine Referenz auf eine Referenz geben). | Es unterstützt mehrere Ebenen der Indirektion (z. B. Zeiger auf Zeiger:int **pptr;)。 |
| Parameterübergabe an Funktionen | Sie wird oft für die Parameterübergabe an Funktionen verwendet, mit prägnanter Syntax, zum Beispiel:void func(int &x) { x = 10; } | Er kann auch für die Parameterübergabe an Funktionen verwendet werden, erfordert jedoch den Dereferenzierungsoperator, zum Beispiel:void func(int *x) { *x = 10; } |
| Arrays und Referenzen | Sie können kein Array von Referenzen direkt erstellen, aber Sie können eine Referenz auf ein Array erstellen, zum Beispiel:int (&ref)[10] = arr; | Sie können ein Array von Zeigern erstellen, und Sie können auch einen Zeiger auf ein Array erstellen, zum Beispiel:int *ptrArr[10]; |
| Sicherheit | Sicherer geht es nichtnull, und die Syntax ist intuitiver. | Es ist flexibler, aber fehleranfällig (z. B. Nullzeiger, hängende Zeiger usw.). |
| Zugrunde liegende Implementierung | Sie wird üblicherweise über Zeiger implementiert, aber der Compiler optimiert sie so, dass direkt auf das referenzierte Objekt zugegriffen wird. | Speichert direkt die Speicheradresse des Zielobjekts. |
Referenzen in C++ erstellen
Betrachten Sie einen Variablennamen als ein Etikett, das an der Variablen an ihrer Speicherstelle angebracht ist. Sie können eine Referenz als ein zweites Etikett betrachten, das an der Variablen an ihrer Speicherstelle angebracht ist. Daher können Sie auf den Inhalt der Variablen entweder über den ursprünglichen Variablennamen oder über die Referenz zugreifen. Zum Beispiel:
int i = 17;
Wir können eine Referenzvariable für i wie folgt deklarieren:
int& r = i; double& s = d;
In diesen Deklarationen wird&alsReferenz gelesen。
Daher kann die erste Deklaration gelesen werden als"r ist eine Integer-Referenz, die mit i initialisiert wird", die zweite Deklaration kann gelesen werden als"s ist eine Double-Referenz, die mit d initialisiert wird"。
Das folgende Beispiel verwendet int- und double-Referenzen:
Beispiel
Wenn der obige Code kompiliert und ausgeführt wird, liefert er die folgenden Ergebnisse:
Value of i : 5 Value of i reference : 5 Value of d : 11.7 Value of d reference : 11.7
Referenzen werden häufig für Parameterlisten von Funktionen und Rückgabewerte von Funktionen verwendet. Nachfolgend sind zwei wichtige Konzepte im Zusammenhang mit C++-Referenzen aufgeführt, die C++-Programmierern klar sein müssen:
| Konzepte | Beschreibung |
|---|---|
| Übergeben von Referenzen als Parameter | C++ unterstützt das Übergeben von Referenzen an Funktionen als Parameter, was sicherer ist als das Übergeben gewöhnlicher Parameter. |
| Verwenden von Referenzen als Rückgabewerte | Eine Referenz kann von einer C++-Funktion zurückgegeben werden, genau wie andere Datentypen. |