Static (C++)
le mot clé d' static peut être utilisé pour déclarer des variables, des fonctions, des données membres de classe et des fonctions de classe.
par défaut, un objet ou une variable qui sont définis en dehors de tous les blocs a la durée statique et la liaison externe.La durée statique signifie que l'objet ou la variable est alloué lorsque le programme démarre et est libéré lorsque le programme se termine.La liaison externe signifie que le nom de la variable est visible de l'extérieur du fichier dans lequel la variable est déclarée.Inversement, une liaison interne signifie que le nom n'est pas visible hors de le fichier dans lequel la variable est déclarée.
le mot clé d' static peut être utilisé dans les situations suivantes.
Lorsque vous déclarez une variable ou une fonction dans la portée du fichier (global et/ou portée de l'espace de noms), le mot clé d' static spécifie que la variable ou la fonction a une liaison interne.Lorsque vous déclarez une variable, la variable a la durée statique et le compilateur l'initialise à 0 sauf si vous spécifiez une autre valeur.
Lorsque vous déclarez une variable dans une fonction, le mot clé d' static spécifie que la variable conserve son état entre les appels à cette fonction.
Lorsque vous déclarez une donnée membre dans une déclaration de classe, le mot clé d' static spécifie qu'une copie du membre est partagée par toutes les instances de la classe.Une donnée membre statique doit être définie au niveau de la portée du fichier.Une donnée membre intégral que vous déclarez comme conststatic peut avoir un initialiseur.
Lorsque vous déclarez une fonction membre dans une déclaration de classe, le mot clé d' static indique que la fonction est partagée par toutes les instances de la classe.Une fonction membre statique ne peut pas accéder à un membre d'instance parce que la fonction n'a pas un pointeur implicite d' this .Pour accéder à un membre d'instance, déclarez -la avec un paramètre qui est un pointeur ou une référence d'instance.
Vous ne pouvez pas déclarer les membres d'une union comme static.Toutefois, une union anonyme globalement déclarée doit être explicitement déclarée static.
Pour plus d'informations, consultez auto, extern, et le registre.
Exemple
l'exemple suivant montre comment une variable déclarée static dans une fonction conserve son état entre les appels à cette fonction.
// 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 );
}
L'exemple suivant illustre l'utilisation d' static dans une classe.
// 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;
}
l'exemple suivant montre une variable locale déclarée static dans une fonction membre.La variable statique est disponible au programme entière ; toutes les instances du type partagent la même copie de la variable statique.
[!REMARQUE]
Assigner une valeur à une variable locale statique dans une application multithread n'est pas thread-safe et la nous ne recommandons pas comme pratique de programmation.
// 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);
}