Lokale Variablen
In einer Funktion kannst du Variablen erstellen, genau wie in main. Aber eine solche Variable existiert nur innerhalb der Funktion: Sie wird erstellt, wenn die Funktion läuft, und verschwindet, wenn die Funktion endet. Außerhalb der Funktion kennt C++ sie nicht:
#include <iostream>
#include <string>
void sageHallo() {
std::string gruss = "Hallo!";
std::cout << gruss << std::endl;
}
int main() {
sageHallo();
std::cout << gruss << std::endl;
return 0;
}Das Programm lässt sich nicht kompilieren:
main.cpp:11:18: error: use of undeclared identifier 'gruss'
11 | std::cout << gruss << std::endl;
| ^~~~~
1 error generated.In Zeile 11 versucht main, die Variable gruss auszugeben, die nur innerhalb der Funktion sageHallo existiert. Mit Parametern ist es genauso: Sie existieren nur innerhalb ihrer Funktion.
Der Teil eines Programms, in dem eine Variable existiert, heißt ihr Gültigkeitsbereich (englisch scope). Eine Variable, die in einer Funktion erstellt wird, ist lokal: Sie gehört nur zu dieser Funktion. Das gilt auch für main, denn auch sie ist eine Funktion. Andere Funktionen können die Variablen von main also nicht sehen:
#include <iostream>
#include <string>
void gibEtikettAus(std::string produkt) {
std::cout << ladenName << ": " << produkt << std::endl;
}
int main() {
std::string ladenName = "Tierwelt";
gibEtikettAus("Hundefutter");
return 0;
}Dieses Programm lässt sich nicht kompilieren. Der Fehler use of undeclared identifier 'ladenName' steht in Zeile 5, innerhalb der Funktion, die die Variable aus main nicht kennt. Braucht eine Funktion einen Wert aus main, übergib ihn als Argument: Gib der Funktion einen Parameter std::string laden und rufe sie als gibEtikettAus(ladenName, "Hundefutter") auf. (Variablen, die außerhalb aller Funktionen erstellt werden, wären für alle Funktionen sichtbar, aber wir verwenden sie in diesem Kurs nicht. In einem längeren Programm ist es schwer zu überblicken, welche Funktion sie geändert hat.)
Jeder Block in geschweiften Klammern hat seinen eigenen Gültigkeitsbereich. Eine Variable, die in einem if oder einer Schleife erstellt wird, existiert nur bis zu ihrem }, und die Variable i aus for (int i = 0; ...) existiert nur in der Schleife.
Warum ist es nützlich, dass lokale Variablen in ihren Funktionen bleiben?
- Funktionen kommen sich nicht in die Quere. Zwei Funktionen können jeweils eine Variable namens
gesamthaben, und das sind zwei verschiedene Variablen: Ändert man die eine, ändert sich die andere nicht. - Um eine Funktion zu verwenden, musst du nur wissen, was du ihr gibst (die Argumente) und was sie dir zurückgibt (den Rückgabewert). Wie sie innen funktioniert, ist ihre eigene Sache.
- Jeder Aufruf beginnt von vorn: Die Variablen der Funktion werden neu erstellt, ohne dass vom vorigen Aufruf etwas übrig bleibt.
Auch ein Parameter ist eine lokale Variable. Beim Aufruf der Funktion bekommt der Parameter eine Kopie des Arguments. Ändert die Funktion den Parameter, bleibt die Variable in main gleich:
#include <iostream>
void setzePunkteZurueck(int punkte) {
punkte = 0;
}
int main() {
int punkte = 10;
setzePunkteZurueck(punkte);
std::cout << punkte << std::endl;
return 0;
}Dieses Programm gibt aus:
10Die Funktion hat ihren Parameter punkte auf 0 gesetzt. Aber die Variable punkte in main ist eine andere Variable, die nur denselben Namen hat, und sie blieb 10.
Die Regel ist also einfach: Werte gehen über die Parameter in eine Funktion hinein und kommen mit return heraus. Brauchst du einen Wert aus dem Inneren einer Funktion, greife nicht nach ihrer Variablen. Gib den Wert zurück und speichere ihn dort, wo du die Funktion aufrufst.
So schreibst du es:
Anweisungen
- 1
Das Programm lässt sich nicht kompilieren, weil
gesamtnur innerhalb der Funktion existiert. Behebe das: Ändere den Rückgabetyp der Funktion inintund gibgesamtaus ihr zurück. Speichere inmaindas Ergebnis des Aufrufsgesamtpreis(25, 4)in einer Variablenrechnungund gibrechnungstattgesamtaus. Das Programm gibt100aus. - 2
Jede Bestellung kostet auch Lieferung. Ihr Preis steht in der Variablen
lieferunginmain. Die Funktion kann sie nicht sehen, weil sie lokal inmainist. Gib der Funktion einen dritten Parameter,lieferungvom Typint, addiere ihn in der Funktion zum Gesamtpreis und übergib im Aufruf die Variablelieferung:gesamtpreis(25, 4, lieferung). Das Programm gibt dann105aus.