004
06.10.2003, 11:54 Uhr
virtual
Sexiest Bit alive (Operator)
|
static beinflusst die Sichtbarkeit (und damit eben Verwendbarkeit) von Bezeichnern. Bezeichner sind Variablen und Funktionen. static ist eine "Speicherklasse".
In der Reinen C Welt kann man static in zwei Scopes (="Gültigkeitsbereichen) verwenden: einmal im Funktionsscope zum anderen im Übersetzungseinheitsscope. In beiden Fällen bewirkt static, daß die Variable/Funktion nur im umgebenden Scope sichtbar ist:
C++: |
static int eine_var = 100; static int eine_func() { static int x; }
|
eine_var und eine_func Sind nur innerhalb der Datei nutzbar, in der sie definiert wurden. Hat man ein Program, welches aus mehreren Quelldateien besteht, so gibt es keine Möglichkeit, auf diese Bezeichner aus einer anderen Quelldateizuzugreifen. Bei Der Variablen x Verhält es sich so, daß sie nur in eine_func Sichtbar ist, wie jede Andere lokale Variable auch. Allerdings überschreibt es die Speicherklasse auto, die normalerweise jeder lokalen Variablen mitgeliefert wurde. auto bewirkt, daß die Variable nach Verlassen der Routine gelöscht wird. Da das auto durch static außer Kraft gesetzt wird, bleibt die Variable über Funktionsaufrufe hinaus erhalten, wie loddab richtig erwähnt. In der C++ Welt gibt es noch als gültigen Scope Klassen, worauf auch static angewendet werden kann.
Da das obige relative Abstrakt ist, hier nochmal die Erklärung, wie man es anwendet:
static bei einfachen Variablen: Bewirkt wie erwähnt, daß die Variable ihren Wert über zwei Funktionsaufrufe behält. Im unterschied zu einer ordinären globalen Variable ist sie allerdings nur im umgebenden Scope (Klasse, Übersetzungseinheit, Funktion) sichtbar. Während man bei Übersetzungseinheiten und Funktionen nicht von aussen auf die Variable zugreifen kann, ist dies bei static Variablen mit hilfe des Scope-Resolution-Operators möglich:
C++: |
class X { public: static int y; }; ... X::y = 1; // "::" ist der Scope-Resolution-Operator
|
static bei Funktionen folgt den gleichen Regeln Variablen: Funktionen die lokal in einer Übersetzungseinheit sind, lassen sich auch nur dort verwenden. Man benutzt static hier also, um soetwas wie "lokale Funktionen" zu erreichen, wobei "lokal" als "lokal zu einem Modul" zu verstehen ist, da man meist in einer C Datei ganze Module implementiert, nicht nur einzelne Funktionen (was aber auch vorkommt). -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) |