Programmer en C++
Les classes : Membre statique

1. Membre statique

Une variable membre statique n'a rien à voir avec une constante. C'est une variable commune à plusieurs instances (plusieurs objets d'une même classe). Pour mieux comprendre, examinons les deux situations suivantes :

class Point
{
private:
    int x;
    int y;
    int n;
public:
    ...
};

int main()
{
    Point a(2, 4, 0), b(1, 5, 3);
    ...

Le programme crée deux instances, a et b, contenant chacune leurs propres variables membres : x, y et n.

class Point
{
private:
    int x;
    int y;
    static int n;
public:
    ...
};

int main()
{
    Point a(2, 4), b(1, 5);
    ...

On retrouve la même chose avec x et y, mais cette fois n devient une variable commune aux deux instances.

2. Initialisation d'un membre statique

Dans le premier cas, la valeur de "n" étant propre à chaque instance, il fortement recommandé d'utiliser le constructeur pour l'initialiser. Un argument est donc ajouté.
Dans le deuxième cas, devoir réinitialiser "n" à chaque création d'une instance semble absurde. C'est pourquoi il a été choisi d'initialiser la variable statique à l'extérieur de la déclaration de la classe, ce qui se fait en écrivant :

int Point::n = 0;     // Initialisation de la variable statique

Voyons maintenant un exemple :

#include <iostream>

using namespace std;

// Déclaration de la classe Point
class Point
{
private:
    int x;
    int y;
    static int compteur;     // Déclaration d'un membre statique
public:
    Point(int, int);     // Constructeur
    ~Point();           // Destructeur
};

int Point::compteur = 0;     // Initialisation de la variable statique

int main()
{
    Point a(5, -3), b(0, 0);
    return 0;
}

// Définitions des fonctions de la classe Point
Point::Point(int abscisse, int ordonnee)     // Constructeur
{
    cout << "Ajout : Il y a maintenant " << ++compteur << " point(s)." << endl;
    x = abscisse;
    y = ordonnee;
}

Point::~Point()     // Destructeur
{
    cout << "Suppression : Il y a maintenant " << --compteur << " point(s)." << endl;
}

Voici ce qu'on obtient :

Ajout : Il y a maintenant 1 point(s).
Ajout : Il y a maintenant 2 point(s).
Suppression : Il y a maintenant 1 point(s).
Suppression : Il y a maintenant 0 point(s).

Je ne comprends pas, la variable "compteur" est déclarée "privée" et pourtant nous pouvons la manipuler de l'extérieur de la classe. Je vous rassure c'est normal, un membre statique possède toujours ce privilège qu'il soit publique, ou privé.