C++
VeröffentlichtRevision 1

Referenzen: ein zweiter Name für ein Objekt

Eine Referenz bindet einen zusätzlichen Namen an ein bestehendes Objekt. Eine gewöhnliche Lvalue-Referenz wird mit & deklariert. Lvalue beschreibt eine Ausdruckskategorie für einen identifizierbaren Ort beziehungsweise ein Objekt; im Einstieg ist eine benannte Variable das wichtigste Beispiel.

Referenzen: ein zweiter Name für ein Objekt#

Referenzen, Zeiger und Speicher · Lektion 33 von 60

Voraussetzungen: Speicher, Parameter. Lernziel: Du verwendest Referenzen und erkennst ungültige Rückgaben.

Eine Referenz bindet einen zusätzlichen Namen an ein bestehendes Objekt. Eine gewöhnliche Lvalue-Referenz wird mit & deklariert. Lvalue beschreibt eine Ausdruckskategorie für einen identifizierbaren Ort beziehungsweise ein Objekt; im Einstieg ist eine benannte Variable das wichtigste Beispiel.

C++
1#include <iostream>2 3void verdoppeln(int& wert) {4    wert *= 2;5}6 7int main() {8    int zahl{5};9    int& alias = zahl;10    alias = 7;11    verdoppeln(zahl);12    const int& ansicht = zahl;13    std::cout << ansicht << '\n';14}

Die Ausgabe ist 14. alias = 7 verändert zahl. Die Referenz wird dadurch nicht auf ein anderes Objekt umgebunden. ansicht erlaubt das Lesen, aber keine Veränderung über diesen Namen. Das ursprüngliche Objekt kann über einen anderen erlaubten Zugriff weiterhin verändert werden.

Referenz oder Kopie?#

int kopie = zahl; erzeugt eine unabhängige Zahl. int& alias = zahl; bindet an dieselbe Zahl. Bei auto geht diese Unterscheidung leicht verloren: auto kopie = alias; erzeugt hier wieder einen Wert, während auto& weitererAlias = alias; eine Referenz erhält.

Eine gewöhnliche Referenz benötigt bei ihrer Definition ein Ziel. Es gibt keinen regulären „leeren Referenzwert“ wie nullptr bei Zeigern. Das bedeutet aber nicht, dass eine Referenz automatisch für immer gültig bleibt.

Keine Referenzen auf beendete lokale Objekte#

C++
1// Absichtlich falsch: nach der Rueckkehr existiert lokal nicht mehr.2int& falsch() {3    int lokal{42};4    return lokal;5}

Ein solcher zurückgegebener Verweis ist dangling, also ohne lebendes Ziel. Ein Compiler kann warnen; die Warnung muss nicht in jeder Variante entstehen. Die richtige Lösung für eine berechnete Zahl ist eine Wertrückgabe: int richtig() { return 42; }.

Eine konstante Referenz kann die Lebensdauer mancher direkt gebundener temporärer Objekte verlängern. Daraus folgt keine allgemeine Regel, dass jede durch eine Funktion weitergereichte Referenz ein temporäres Objekt am Leben hält. Vermeide solche versteckten Lebensdauerabhängigkeiten.

Übung#

Was verändert a = b, wenn a eine int&-Referenz auf zahl ist?

Lösung

Der Wert von b wird in zahl geschrieben. a bleibt eine Referenz auf zahl. Eine Referenzzuweisung ist keine Umbindung.

Wert, Referenz und Zeiger vergleichen#

C++
1#include <iostream>2 3int main() {4    int original{10};5    int kopie{original};6    int& alias{original};7    int* zeiger{&original};8 9    alias = 20;10    std::cout << original << ' ' << kopie << ' ' << *zeiger << '\n';11}

Die Ausgabe lautet 20 10 20. kopie speichert einen unabhängigen Wert. alias bezeichnet dasselbe Objekt wie original. zeiger enthält einen Verweis auf dieses Objekt; *zeiger greift darauf zu.

Eigenschaft

Kopie: int

Referenz: int&

Zeiger: int*

Eigenen Zahlenwert verändern

Ja

Verändert das Ziel

Mit *p wird das Ziel verändert

Nachträglich auf ein anderes Ziel wechseln

Kein Zielbezug

Nein

Ja, durch Zuweisung einer Adresse

Regulär kein Ziel haben

Kein Zielbezug

Nein

Ja, nullptr

Hält ein fremdes Ziel automatisch am Leben

Nicht anwendbar

Im Allgemeinen nein

Nein

Übung: Was bedeutet die Zuweisung?#

Ergänze int andere{7}; und danach alias = andere;. Zeigt alias jetzt auf andere?

Lösung

Nein. Die Zuweisung schreibt 7 in original. alias bleibt an original gebunden. andere bleibt eine eigene Zahl. Damit hat original den Wert 7, kopie weiterhin 10 und *zeiger ebenfalls 7.

Weiterlernen#

Zurück: Speicher, Adressen und Lebensdauer · Kursübersicht · Weiter: Zeiger, nullptr und Dereferenzieren

Mitwirkende 1

Menschen, deren Änderungen in dieser Seite veröffentlicht wurden.

Kommentare 0

Kommentare sind für diese Seite deaktiviert.