Statisch (C++)
Das static-Schlüsselwort kann verwendet werden, um Variablen, Funktionen, Klassen datenmember und Klassenfunktionen zu deklarieren.
Standardmäßig verfügt ein Objekt oder eine Variable, die außerhalb aller Blöcke definierte statische Dauer und externe Bindung.Statische Dauer bedeutet, dass das Objekt oder die Variable wenn das Programm gestartet wird und losgelassen wird, während das Programm beendet.Externe Bindung impliziert, dass der Name der Variablen von außerhalb der Datei sichtbar ist, wobei die Variable deklariert wird.Ebenso bedeutet, dass interne Bindung, dass der Name nicht außerhalb der Datei sichtbar ist, wobei die Variable deklariert wird.
Das static-Schlüsselwort kann in den folgenden Situationen verwendet werden.
Wenn Sie eine Variable oder eine benutzerdefinierte Funktion im Dateigültigkeitsbereich (global und/oder Namespacebereich) deklarieren, gibt das static-Schlüsselwort an, dass die Variable oder Funktion interne Bindung verfügt.Wenn Sie eine Variable deklarieren, hat die eine statische Variable vom Compiler und initialisiert sie auf 0 festgelegt, es sei denn, Sie einen anderen Wert angeben.
Wenn Sie eine Variable in einer Funktion deklariert, gibt das static-Schlüsselwort an, dass die Variable ihren Zustand zwischen den Aufrufen dieser Funktion beibehalten werden.
Wenn Sie einen Datenmember in einer Klassendeklaration deklarieren, gibt das static-Schlüsselwort an, dass eine Kopie eines Members von allen Instanzen der Klasse freigegeben wird.Ein statischer Datenmember muss im Dateigültigkeitsbereich definiert sind.Ein ganzzahliger Datenmember deklarieren, den Sie während conststatic einen Initialisierer haben kann.
Wenn Sie eine Memberfunktion einer Klassendeklaration deklarieren, gibt das static-Schlüsselwort an, dass die Funktion von allen Instanzen der Klasse freigegeben wird.Eine statische Memberfunktion kann nicht glied ein Instanz verweisen, weil die Funktion keinen impliziten this Zeiger aufweist.Um eine Instanz glied zu beheben, deklarieren Sie die Funktion mit einem Parameter ein Zeiger oder Verweis Instanz ist.
Sie können die Member einer Union nicht als statisch deklariert.Allerdings muss eine global deklarierte anonyme Union explizit deklariert werden static.
Weitere Informationen finden Sie unter Auto, externund Register.
Beispiel
Im folgenden Beispiel wird gezeigt, wie eine Variable, die static in einer Funktion deklariert wurde, seinen Zustand zwischen den Aufrufen dieser Funktion beibehalten werden.
// 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 an.
// 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;
}
Im folgenden Beispiel wird eine lokale Variable an, die static in einer Memberfunktion deklariert ist.Die statische Variable entspricht dem gesamten programm verfügbar. Alle Instanzen des Typs verwenden die gleiche Kopie der statischen Variablen.
Hinweis |
---|
Der Wert einer statischen lokalen Variablen in einer Multithreadanwendung zuzuweisen ist nicht threadsicher, und wir empfehlen daher nicht als Programmierstil. |
// 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);
}