static?



  • hi Leute!
    was genau bringt es, eine Variable als static zu deklarieren, (wenn sie keine Elementvariable einer Klasse ist, und dabei vielleicht zur Kontrolle der Anzahl der Objekte gut ist)?
    Oder vielmehr: was für Eigenschaften hat sie dann?
    mfg
    Cortex



  • Soweit ich weiß (als C-Progger):

    wird eine Variable innerhalb einer Funktion als statisch
    deklariert, wird sie zwischen zwei Funktionsaufrufen
    ihren Inhalt beibehalten.

    Außerdem haben statische globale Variablen (und Funktionen)
    interne Bindung, die sind dann nur innerhalb einer *.c datei
    verfügbar.

    Naja, statische lokale Variable in einer Funktion können z.B. als Zähler dienen, wie oft eine Funktion aufgerufen wurde



  • Hallo,
    dies gilt alles auch für C++. Allerdings gibt es in C++ eine andere und bevorzugte Variante Variablen und Funktionen mit interner Bindung zu erstellen. Das ganze wird über "unnamed namespaces" gemacht.

    // IrgendEineDatei.c
    static int i = 7; // C-Variante einer Variablen mit interner Bindung
    //...
    //IrgendEineDatei.cpp
    namespace
    {
       int i = 7;    // C++-Variante
    }
    


  • Vielleicht lohnt es sich, mal die verschiedenen Auswirkungen von static zusammenzufassen (IMHO übrigens eines der am meisten überfrachteten Schlüsselwörter der Sprache):

    - static bei globalen Variablen/Konstanten verändert deren Sichtbarkeit. Sie können nur noch in derselben Datei verwendet werden und sind von jeder anderen Datei aus unsichtbar. Diese Form von static sollte man zugunsten von unnamed namespaces nicht mehr verwenden.

    - static bei Variablen/Konstanten innerhalb einer Funktion ändert deren Lebensdauer: Sie werden initialisiert, sobald das Programm erstmalig deren Scope betritt und bleiben bis zum Ende des Programms erhalten. Sofern nichts anderes angegeben wird, werden Objekte eines eingebauten Typs auf einen Nullwert initialisiert.

    - static bei Variablen/Konstanten in einer Klasse definiert sog. Klassenvariablen/-konstanten: Im Gegensatz zu Instanzvariablen bzw. -konstanten gibt es diese Objekte nur einmal pro Klasse und sie sind zugreifbar, ohne daß man ein Objekt der Klasse benötigt. Klassenobjekte werden innerhalb der Klasse deklariert und müssen außerhalb der Klasse genau einmal definiert werden.

    - static bei Memberfunktionen definiert sog. Klassenfunktionen: Im Gegensatz zu normalen Memberfunktionen braucht man hier kein Objekt der Klasse, um sie aufrufen zu können; innerhalb der Klassenfunktionen gibt es deshalb keinen this-Pointer.

    Stefan.


Anmelden zum Antworten