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.
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é.