Referenz (Programmierung)
Eine Referenz ist ein Verweis auf ein Objekt. Eine Referenz ist damit ein Aliasname für ein bereits bestehendes Objekt.
Referenzen in C++
In C++ werden Referenzen sehr häufig und für verschiedene Zwecke eingesetzt:
- Als (kürzerer oder verständlicherer) Aliasname für ein bereits bestehendes Objekt
- Zur Optimierung, um Kopien von Objekten zu vermeiden
- In speziellen Memberfunktionen, wie Copy- & Move-Konstruktoren und Zuweisungsoperatoren
- Als sogenannte universelle Referenz (engl: universal reference), die bei Templates einen beliebigen Parametertyp repräsentiert.
Es gibt in C++ sogenannte Lvalue-Referenzen, die durch ein an den Typ angehängtes &
gekennzeichnet werden, und (seit C++11) zusätzlich noch Rvalue-Referenzen, die durch &&
gekennzeichnet werden.
Codebeispiele
- Unterschied von Referenz und Kopie:
int original = 5;
int kopie = original;
int& referenz = original;
kopie = 30; // weist der Kopie den Wert 30 zu. Das Original bleibt unverändert
referenz = 20; // weist der Referenz – und somit auch dem Original – den Wert 20 zu
original = 10; // ändert das Original, womit aber auch die Referenz ihren Wert ändert.
void quadrieren(int& x) {
x = x * x;
}
int main() {
int i = 5;
quadrieren(i); // Funktionsaufruf ändert den Wert von i auf 25
}
- Objektreferenzen:
Bank& nBank = Bankenverzeichnis::nachBLZ("76543210"); // eine Referenz auf ein Bankobjekt wird beschafft
Konto& nKonto1 = nBank.kontoZugriff("1234567"); // eine Referenz auf ein bestimmtes Kontoobjekt wird beschafft
Konto& nKonto2 = nBank.kontoZugriff("1111111"); // eine Referenz auf ein weiteres Kontoobjekt wird beschafft
nKonto1.einzahlung(100.00, "EUR", nKonto2); // eine Methode wird auf nKonto1 gerufen
- Klassendesign:
class Kunde
{
public:
explicit Kunde(const std::string& name); // 'name' wird aus Effizienzgründen nur als const-Referenz übergeben
explicit Kunde(std::string&& name); // Rvalue-Referenz, erlaubt ein "move" aus dem Namen (seit C++11)
Kunde(const Kunde& other); // Copy-Konstruktor
Kunde(Kunde&& other); // Move-Konstruktor (seit C++11)
const std::string& getName() const; // gibt const-Referenz auf Kundennamen zurück
std::string&& getName() &&; // gibt Rvalue-Referenz zurück, falls Objekt selbst ein RValue ist (ab C++11)
…
};
Beispiel in Pascal
Übergabe by reference (der Wert der übergebenen Variablen wird geändert)
procedure quadriere(var wert: integer);
begin
wert := wert * wert;
end;
Dieser Prozedur kann nur eine Variable übergeben werden, kein Ausdruck. wert
ist der lokale Name der als Referenz übergebenen Variablen; mit der Zuweisung eines Werts wird direkt der Inhalt der übergebenen Variablen geändert.
Übergabe by value (also nur des Werts, nicht der Variablen selbst; der Wert der übergebenen Variablen wird nicht geändert)
function quadrat(wert: integer): integer;
begin
Result := wert * wert;
end;
Selbst wenn eine Zuweisung an wert
erfolgen würde, würde dies den Inhalt einer etwa übergebenen Variablen nicht ändern: Übergeben wird nur ein Wert; der Bezeichner wert
steht für eine lokale Variable, die nur innerhalb der Funktion gültig ist.