Zum Inhalt springen

Referenz (Programmierung)

aus Wikipedia, der freien Enzyklopädie
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 1. Juli 2015 um 10:53 Uhr durch RokerHRO (Diskussion | Beiträge) (Codebeispiele). Sie kann sich erheblich von der aktuellen Version unterscheiden.

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:

  1. Als (kürzerer oder verständlicherer) Aliasname für ein bereits bestehendes Objekt
  2. Zur Optimierung, um Kopien von Objekten zu vermeiden
  3. In speziellen Memberfunktionen, wie Copy- & Move-Konstruktoren und Zuweisungsoperatoren
  4. 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.
Parameterübergabe als Referenz:
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.