Static (C++)
Le mot clé static permet de déclarer des variables, des fonctions, des membres de données de classe et des fonctions de classe.
Par défaut, un objet ou une variable définie à l'extérieur de tous les blocs a une durée statique et une liaison externe. La durée statique signifie que l'objet ou la variable est alloué au démarrage du programme et est libéré à la fin de l'exécution du programme. 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 du fichier dans lequel la variable est déclarée.
Le mot clé static peut être utilisé dans les situations suivantes :
Lorsque vous déclarez une variable ou une fonction au niveau de la portée du fichier (portée globale et/ou portée de l'espace de noms), le mot clé static spécifie que la variable ou la fonction a une liaison interne. Lorsque vous déclarez une variable, la variable a une 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é 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é static spécifie qu'une copie du membre est partagée par toutes les instances de la classe. Des données membres statiques doivent être définies au niveau de la portée du fichier. Une donnée membre intégrale que vous déclarez comme const static peut avoir un initialiseur.
Lorsque vous déclarez une fonction membre dans une déclaration de classe, le mot clé static indique que la fonction est partagée par toutes les instances de la classe. Une fonction membre static ne peut pas accéder à un membre d'instance car la fonction n'a pas de pointeur this implicite. Pour accéder à un membre d'instance, déclarez la fonction 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 comme static.
Pour plus d'informations, consultez auto, extern et register.
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 de 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 pour la totalité du programme. Toutes les instances du type partagent la même copie de la variable statique.
Notes
L'assignation d'une valeur à une variable locale statique dans une application multithread n'est pas thread-safe et nous ne la 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);
}