Übergabe als Wert und als Referenz
In dieser Lektion lernst du, wie eine Funktion eine Variable des aufrufenden Codes ändern kann und wie du einen großen Vektor an eine Funktion übergibst, ohne ihn ganz zu kopieren. Referenzen machen beides. Im zweiten Teil der Lektion lernst du Zeiger kennen: Sie arbeiten mit den Adressen von Variablen im Speicher, und du wirst ihnen in vielen C++-Programmen und -Bibliotheken begegnen.
Erinnere dich zuerst, was beim Aufruf einer Funktion passiert. Der Wert des Arguments wird in den Parameter kopiert. Der Parameter ist eine neue lokale Variable, ändert die Funktion ihn, ändert sie also nur ihre eigene Kopie:
#include <iostream>
void fuegePunktHinzu(int punkte) {
punkte = punkte + 1;
std::cout << "In der Funktion: " << punkte << std::endl;
}
int main() {
int punktestand = 10;
fuegePunktHinzu(punktestand);
std::cout << "In main: " << punktestand << std::endl;
return 0;
}Das gibt aus:
In der Funktion: 11
In main: 10Das heißt Übergabe als Wert (englisch pass by value): Die Funktion hat nur den Wert 10 bekommen, nicht die Variable punktestand. Mit dem Vektor in der Lektion über Funktionen war es genauso: Die Funktion bekam eine Kopie davon. Meistens ist das gut, denn so kann eine Funktion deine Variablen nicht aus Versehen ändern.
Willst du aber, dass die Funktion die Variable ändert, schreibe das Zeichen & hinter den Typ des Parameters:
#include <iostream>
void fuegePunktHinzu(int& punkte) {
punkte = punkte + 1;
}
int main() {
int punktestand = 10;
fuegePunktHinzu(punktestand);
fuegePunktHinzu(punktestand);
std::cout << "Punktestand: " << punktestand << std::endl;
return 0;
}Das gibt aus:
Punktestand: 12Der Parameter int& punkte ist eine Referenz auf einen int. Eine Referenz ist keine Kopie: Sie ist ein weiterer Name für die Variable, die du der Funktion übergibst. Im Aufruf fuegePunktHinzu(punktestand) ist punkte in der Funktion nur ein anderer Name für punktestand, alles, was die Funktion mit punkte macht, passiert also mit punktestand. Das heißt Übergabe als Referenz (englisch pass by reference).
Der Aufruf sieht genauso aus wie vorher. Dass die Funktion deine Variable ändern darf, erkennst du nur am & in der ersten Zeile der Funktion. Leerzeichen um & spielen keine Rolle: int& punkte und int &punkte bedeuten dasselbe. In diesem Kurs steht & direkt hinter dem Typ.
Achte auf diese Fehler:
- Vergisst du das
&, lässt sich das Programm trotzdem kompilieren und läuft, aber die Variable ändert sich nicht, und es wird kein Fehler angezeigt. Wenn eine Funktion „nichts tut“, prüfe zuerst das&. - Ein Referenzparameter braucht eine Variable. Der Aufruf
fuegePunktHinzu(5)endet mit dem Fehlerno matching function for call to 'fuegePunktHinzu'(keine Funktion passt zum Aufruf) und der Notecandidate function not viable: expects an lvalue for 1st argument. Ein lvalue ist grob gesagt „etwas, dem man etwas zuweisen kann“, zum Beispiel eine Variable. Die Zahl5ist keine Variable, die die Funktion ändern könnte.
So schreibst du es:
Anweisungen
- 1
Das Programm gibt
Geld: 50aus, weil die Funktionverdopplenur ihre eigene Kopie verdoppelt. Ändere ihren Parameter in eine Referenz, damit die Funktion die Variablegeldverdoppelt. Das Programm gibt dannGeld: 100aus. - 2
Schreibe unter der Funktion
verdoppleeine Funktionbezahlemit zwei Parametern: einer Referenzgeldvom Typint&und einem Betragbetragvom Typint. Die Funktion zieht den Betrag vom Geld ab. Rufe am Ende vonmain(vorreturn 0;)bezahle(geld, 30)auf und gib darunter das Geld genauso aus wie oben. Das Programm gibtGeld: 100und dannGeld: 70aus.