Gültigkeitsbereich (Scope) und Lebensdauer in C++
Lernen Sie Scope und Lebensdauer in C++, um Variablenzugriff und Objektlebenszyklen zu verstehen.
In C++-Programmen hat jede Variable einen Gültigkeitsbereich (Scope) und eine Lebensdauer (Lifetime). Der Gültigkeitsbereich bestimmt, in welchem Teil des Programms eine Variable zugänglich ist, während die Lebensdauer angibt, wie lange sie im Speicher existiert. Diese Konzepte sind besonders wichtig im Zusammenhang mit Funktionen, Schleifen und Speicherverwaltung.
1. Was ist ein Gültigkeitsbereich (Scope)?
Der Gültigkeitsbereich beschreibt den Bereich, in dem eine Variable definiert ist.
In C++ ist die Sichtbarkeit von Variablen auf die geschweiften Klammern ({ }) beschränkt, in denen sie deklariert wurden.
Lokaler Gültigkeitsbereich
Variablen, die innerhalb einer Funktion oder eines Blocks definiert sind, sind nur in diesem Block gültig.
#include <iostream>
using namespace std;
int main() {
int zahl = 10; // lokale Variable
cout << zahl << endl;
}
// 'zahl' ist hier nicht mehr zugänglich
Im obigen Beispiel ist die Variable zahl nur innerhalb der Funktion main() verwendbar.
2. Block-Ebene (Block Scope)
In C++ erzeugt jedes Paar geschweifter Klammern ({ }) einen eigenen Gültigkeitsbereich.
Dies wird häufig in Schleifen und Bedingungsanweisungen verwendet.
int main() {
int a = 5;
if (a > 0) {
int b = 10; // nur innerhalb dieses if-Blocks gültig
cout << a + b << endl;
}
// cout << b; // Fehler! 'b' ist hier nicht sichtbar
return 0;
}
Hinweis: Variablen mit demselben Namen können in verschiedenen Blöcken definiert werden. Eine innere Variable mit demselben Namen „verdeckt“ jedoch die äußere Variable.
int x = 5;
int main() {
int x = 10; // äußere Variable 'x' wird verdeckt
cout << x << endl; // 10
return 0;
}
3. Globaler Gültigkeitsbereich
Variablen, die außerhalb aller Funktionen definiert werden, heißen globale Variablen. Auf sie kann von jedem Teil des Programms aus zugegriffen werden.
#include <iostream>
using namespace std;
int zaehler = 0; // globale Variable
void Erhoehen() {
zaehler++;
}
int main() {
Erhoehen();
Erhoehen();
cout << "Zähler: " << zaehler << endl; // 2
return 0;
}
Globale Variablen sollten mit Vorsicht verwendet werden, da sie von überall im Programm verändert werden können.
4. Das Schlüsselwort static und Lebensdauer
Mit dem Schlüsselwort static kann die Lebensdauer einer Variablen verändert werden.
static-Variablen werden nur einmal erstellt und bleiben bis zum Ende des Programms im Speicher.
#include <iostream>
using namespace std;
void Zaehlen() {
static int zaehler = 0; // wird nur einmal erstellt
zaehler++;
cout << "Funktion wurde " << zaehler << " Mal aufgerufen." << endl;
}
int main() {
Zaehlen();
Zaehlen();
Zaehlen();
return 0;
}
Ausgabe:
Funktion wurde 1 Mal aufgerufen.
Funktion wurde 2 Mal aufgerufen.
Funktion wurde 3 Mal aufgerufen.
Die static-Variable behält ihren Wert zwischen den Funktionsaufrufen bei.
Dies ist nützlich für Zähler oder Zwischenspeicher (Cache).
5. Der Bereichsauflösungsoperator (::)
Wenn es globale und lokale Variablen mit demselben Namen gibt,
kann man mit dem Bereichsauflösungsoperator (::) auf die globale Variable zugreifen.
#include <iostream>
using namespace std;
int x = 100; // globale Variable
int main() {
int x = 10; // lokale Variable
cout << "Lokales x: " << x << endl;
cout << "Globales x: " << ::x << endl; // Zugriff auf globale Variable
return 0;
}
Ausgabe:
Lokales x: 10
Globales x: 100
6. Automatische und statische Lebensdauer
| Typ | Beschreibung | Lebensdauer |
|---|---|---|
| Automatisch | Variablen, die innerhalb einer Funktion definiert sind. Standardmäßig automatisch. | Wird bei Funktionsaufruf erstellt und beim Verlassen zerstört. |
| Statisch | Wird mit dem Schlüsselwort static definiert. |
Wird beim Programmstart erstellt und bleibt bis zum Ende bestehen. |
7. Beispiel: Zählervergleich
Im folgenden Beispiel wird der Unterschied zwischen automatic und static Variablen gezeigt.
#include <iostream>
using namespace std;
void Zaehler() {
int automatisch = 0;
static int dauerhaft = 0;
automatisch++;
dauerhaft++;
cout << "Automatisch: " << automatisch
<< " | Statisch: " << dauerhaft << endl;
}
int main() {
Zaehler();
Zaehler();
Zaehler();
return 0;
}
Ausgabe:
Automatisch: 1 | Statisch: 1
Automatisch: 1 | Statisch: 2
Automatisch: 1 | Statisch: 3
Wie man sieht, wird die automatisch-Variable bei jedem Aufruf neu initialisiert,
während die statisch-Variable ihren Wert beibehält.
8. TL;DR
- Der Gültigkeitsbereich legt fest, wo eine Variable zugänglich ist.
- Lokale Variablen gelten nur innerhalb des Blocks, in dem sie definiert wurden.
- Globale Variablen sind im gesamten Programm sichtbar, sollten aber vorsichtig verwendet werden.
static-Variablen behalten ihren Wert bis zum Programmende.- Mit dem Operator
::kann auf globale Variablen zugegriffen werden. - Alle Beispiele können in Visual Studio 2022 oder GCC 11+ ausgeführt werden.