Referenz oder Zeiger?
Mit Referenzen und Zeigern kannst du von woanders, zum Beispiel aus einer Funktion, mit einer Variablen arbeiten. Sie unterscheiden sich aber in einigen Punkten:
| Referenz | Zeiger | |
|---|---|---|
| Erstellen | int& r = x; | int* p = &x; |
| Wert | r, wie eine gewöhnliche Variable | *p |
| Funktionsaufruf | fuegePunktHinzu(punktestand) | fuegePunktHinzu(&punktestand) |
| „Nichts“ | nicht möglich, eine Referenz gehört immer zu einer Variablen | nullptr, vor der Verwendung prüfen |
| Eine andere Variable | nicht möglich, eine Referenz gehört immer zur selben | p = &y; |
Wann solltest du also was verwenden? Bevorzuge Referenzen:
- Die Funktion soll eine Variable oder einen Vektor ändern: eine Referenz,
int& punktestand,std::vector<int>& ergebnisse. - Die Funktion liest nur einen Vektor oder Text: eine konstante Referenz,
const std::vector<int>& zahlen,const std::string& name. - Verwende einen Zeiger nur, wenn du „nichts“ (
nullptr) brauchst oder ihn auf eine andere Variable umlenken willst, oder wenn eine Bibliothek, die du verwendest, es verlangt.
Referenzen sind einfacher und sicherer: Du schreibst keine Sternchen, du kannst das & in einem Aufruf nicht vergessen, und eine Referenz kann nicht nullptr sein, du musst sie also nicht prüfen. Aber Zeiger bleiben in C++ wichtig. Du wirst sie bei fortgeschritteneren Themen brauchen, zum Beispiel wenn ein Programm während des Laufs neuen Speicher anfordert oder wenn du eigene Datenstrukturen baust.
So schreibst du es:
Anweisungen
- 1
Das Programm gibt
Hallo!Hallo!Hallo!aus, aber beide Funktionen verwenden ohne guten Grund Zeiger. Schreibe die FunktionausrufezeichenAnhaengenso um, dass sie statt eines Zeigers eine Referenzstd::string&bekommt. Dann brauchst du weder*in der Funktion noch&im Aufruf. - 2
Schreibe die Funktion
wiederholegenauso um. Das Programm gibt weiterhinHallo!Hallo!Hallo!aus. - 3
Schreibe unter der Funktion
wiederholeeine Funktionumrahmemit zwei Parametern vom Typstd::string: demtext, den die Funktion ändert, und demrahmen, den sie nur liest. Wähle mithilfe der Regeln oben, wie du sie übergibst. Die Funktion fügt den Rahmen am Anfang und am Ende des Textes hinzu. Rufe vor der Ausgabezeileumrahme(gruss, "**")auf. Das Programm gibt**Hallo!Hallo!Hallo!**aus. Hättest du den Rahmen als Referenz ohneconstübergeben, endete das Kompilieren mit dem Fehlerno matching function for call to 'umrahme': Text in Anführungszeichen ist keine Variable, deshalb akzeptiert eine einfache Referenz ihn nicht.