Wird geladen...

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

TypBeschreibungLebensdauer
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.

Ähnliche Artikel