Static (C++)
Das static-Schlüsselwort kann verwendet werden, um Variablen, Funktionen, Klassendatenmember und Klassenfunktionen zu deklarieren.
Standardmäßig verfügt ein Objekt oder eine Variable, die außerhalb aller Blöcke definiert wird, über eine statische Dauer und externe Verknüpfung. Statische Dauer bedeutet, dass das Objekt oder die Variable zugewiesen wird, wenn das Programm gestartet wird. Die Zuweisung wird wieder aufgehoben, wenn das Programm beendet wird. Externe Verknüpfung bedeutet, dass der Name der Variablen von außerhalb der Datei sichtbar ist, in der die Variable deklariert wird. Umgekehrt bedeutet interne Verknüpfung, dass der Name nicht außerhalb der Datei sichtbar ist, in der die Variable deklariert wird.
Das static-Schlüsselwort kann in folgenden Situationen verwendet werden:
Wenn Sie eine Variable oder eine Funktion im Dateibereich (globaler und/oder Namespacebereich) deklarieren, gibt das static-Schlüsselwort die Variable oder Funktion mit interner Verknüpfung an. Wenn Sie eine Variable deklarieren, hat die Variable eine statische Dauer und wird vom Compiler mit dem Wert 0 initialisiert, solange Sie keinen anderen Wert angeben.
Wenn Sie eine Variable in einer Funktion deklarieren, gibt das static-Schlüsselwort an, dass die Variable ihren Status zwischen den Aufrufen der Funktion beibehält.
Wenn Sie einen Datenmember in einer Klassendeklaration deklarieren, gibt das static-Schlüsselwort an, dass eine Kopie des Members für alle Instanzen der Klasse freigegeben wird. Ein statischer Datenmember muss im Dateibereich definiert sein. Ein ganzzahliger Datenmember, den Sie als const static deklarieren, kann einen Initialisierer haben.
Wenn Sie eine Memberfunktion in einer Klassendeklaration deklarieren, gibt das static-Schlüsselwort an, dass die Funktion für alle Instanzen der Klasse freigegeben wird. Eine statische Memberfunktion kann nicht auf einen Instanzmember zugreifen, weil die Funktion keinen impliziten this Zeiger aufweist. Um auf einen Instanzmember zuzugreifen, deklarieren Sie die Funktion mit einem Parameter, der ein Instanzzeiger oder -verweis ist.
Sie können die Member einer Union nicht als statisch deklarieren. Allerdings muss eine global deklarierte anonyme Union explizit als static deklariert werden.
Weitere Informationen finden Sie unter auto, extern und register.
Beispiel
Das folgende Beispiel zeigt, wie eine als static deklarierte Variable in einer Funktion ihren Status zwischen den Aufrufen der Funktion beibehält.
// static1.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
void showstat( int curr ) {
static int nStatic; // Value of nStatic is retained
// between each function call
nStatic += curr;
cout << "nStatic is " << nStatic << endl;
}
int main() {
for ( int i = 0; i < 5; i++ )
showstat( i );
}
Im folgenden Beispiel wird die Verwendung von static in einer Klasse gezeigt.
// static2.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
class CMyClass {
public:
static int m_i;
};
int CMyClass::m_i = 0;
CMyClass myObject1;
CMyClass myObject2;
int main() {
cout << myObject1.m_i << endl;
cout << myObject2.m_i << endl;
myObject1.m_i = 1;
cout << myObject1.m_i << endl;
cout << myObject2.m_i << endl;
myObject2.m_i = 2;
cout << myObject1.m_i << endl;
cout << myObject2.m_i << endl;
CMyClass::m_i = 3;
cout << myObject1.m_i << endl;
cout << myObject2.m_i << endl;
}
Das folgende Beispiel zeigt eine lokale als static deklarierte Variable in einer Memberfunktion. Die statische Variable ist im gesamten Programm verfügbar. Alle Instanzen des Typs verwenden dieselbe Kopie der statischen Variable.
Hinweis
Die Zuweisung eines Werts zu einer statischen lokalen Variablen in einer Multithreadanwendung ist nicht threadsicher und wird daher nicht zum Programmieren empfohlen.
// static3.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
struct C {
void Test(int value) {
static int var = 0;
if (var == value)
cout << "var == value" << endl;
else
cout << "var != value" << endl;
var = value;
}
};
int main() {
C c1;
C c2;
c1.Test(100);
c2.Test(100);
}