Nous allons voir dans ce paragraphe l'emploi du mot-clé static dans les classes. Ce mot-clé intervient pour caractériser les données membres statiques des classes, les fonctions membres statiques des classes, et les données statiques des fonctions membres.
Une classe peut contenir des données membres statiques. Ces données sont soit des données membres propres à la classe, soit des données locales aux fonctions membres de la classe qui les ont déclarées avec le mot-clé static. Dans tous les cas, elles appartiennent à la classe, et non pas aux objets de cette classe. Elles sont donc communes à tous ces objets.
Il est impossible d'initialiser les données d'une classe dans le constructeur de la classe, car le constructeur initialise les données des nouveaux objets, et les données statiques ne sont pas spécifiques à un objet particulier. L'initialisation des données statiques doit donc se faire lors de leur définition, qui se fait en dehors de la déclaration de la classe. Pour préciser la classe à laquelle les données ainsi définies appartiennent, on devra utiliser l'opérateur de résolution de portée (::).
Exemple 7-13. Donnée membre statique
class test
{
static int i; // Déclaration dans la classe.
...
};
int test::i=3; // Initialisation en dehors de la classe.La variable a::i sera partagée par tous les objets de classe test, et sa valeur initiale est 3.
Les variables statiques des fonctions membres doivent être initialisées à l'intérieur des fonctions membres. Elles appartiennent également à la classe, et non pas aux objets, de plus, leur portée est réduite à celle du bloc dans lequel elles ont été déclarées. Ainsi, le code suivant :
affichera 0 et 1, parce que la variable statique compte est la même pour les deux objets.Les classes peuvent également contenir des fonctions membres statiques. Cela peut surprendre à première vue, puisque les fonctions membres appartiennent déjà à la classe, c'est-à-dire à tous les objets. En fait, cela signifie que ces fonctions membres ne recevront pas le pointeur sur l'objet this, comme c'est le cas pour les autres fonctions membres. Par conséquent, elles ne pourront accéder qu'aux données statiques de l'objet.
Exemple 7-14. Fonction membre statique
class Entier
{
int i;
static int j;
public:
static int get_value(void);
};
int Entier::j=0;
int Entier::get_value(void)
{
j=1; // Légal.
return i; // ERREUR ! get_value ne peut pas accéder à i.
}La fonction get_value de l'exemple ci-dessus ne peut pas accéder à la donnée membre non statique i, parce qu'elle ne travaille sur aucun objet. Son champ d'action est uniquement la classe Entier. En revanche, elle peut modifier la variable statique j, puisque celle-ci appartient à la classe Entier et non aux objets de cette classe.
L'appel des fonctions membre statiques se fait exactement comme celui des fonctions membres non statiques, en spécifiant l'identificateur d'un des objets de la classe et le nom de la fonction membre, séparés par un point. Cependant, comme les fonctions membres ne travaillent pas sur les objets des classes mais plutôt sur les classes elles-mêmes, la présence de l'objet lors de l'appel est facultatif. On peut donc se contenter d'appeler une fonction statique en qualifiant son nom du nom de la classe à laquelle elle appartient à l'aide de l'opérateur de résolution de portée.
| Précédent | Sommaire | Suivant |
| Pointeur this | Niveau supérieur | Redéfinition des opérateurs |