I.II LES CLASSES
(suite)

  1. Membre donnée static :
  1. Le qualificatif static pour une données membre:

Si nous déclarons une classe exemple1 munie de données x et y de type int, lorsque nous déclarons deux objets de cette classe a et b nous obtenons le schéma symbolique suivant :


class exemple1
        {
         int x;
         int y;
          .
          .
          .
        };


           ----      ----
a.x  ---> |    |    |    | <--- b.x 
          |    |    |    | 
           ----      ----
          |    |    |    |
 a.y ---> |    |    |    | <--- b.y  
           ----      ----

          Objet a   Objet b

Nous voyons bien ici que pour chaque objet de classe exemple1 il y a des emplacements mémoire différents qui ont été retenus.

Si maintenant nous désirons que chaque objet de la classe exemple1 partage une donnée pour laquelle la valeur serait commune à tous ces objets. Nous pourrions faire en sorte part un programme que cela soit possible, mais cela serait très lourd et fastidieux. Une façons parmi d'autre serait de déclaré la donnée commune a tous les objets en donnée statique (mot clé static) :


class exemple2
        {
    static int x;
    int y;
     .
     .
     .
    };


             ----       
   a.x ---> |    | <--- b.x 
            |    |    
           ---- ----
          |    |    |
 a.y ---> |    |    | <--- b.y  
           ---- ----

       Objet a   Objet b

La donnée x de la classe exemple2 devient une sorte de variable globale dont la porté est limité à la classe.

  1. Initialisation des membres données statiques :

Une donnée membre statique pose des problème d'initialisation, en effet comme elle est unique pour la classe elle devient indépendante des objets de cette classe(elle existe même si il n'en existe pas!!). Donc son initialisation ne peut plus être faite par le constructeur d'objets de la classe. On pourrait croire que l'on pourrait l'inisialisé dans la déclaration de la classe :

class exmpl2
        {
         static int x=2;  //erreur 
         int y;
            .
            .
            .
        };

En effet, ceci n'est pas permit compte tenu des capacités de compilation séparée de la classe, il pourrait y avoir plusieurs emplacement mémoire pour la donnée statique dans différents modules objets. Un membre donné statique doit être initialiser a l'extérieur de la déclaration de la classe (avec la définition des fonctions membres) de la façon suivante :

int exmpl2::x=2;

Attention une donnée membre statique n'est pas initialiser par défaut a zéro!! La donnée statique peut être comme n'importe quel donnée membre privé ou public et se voit utilisé de la même manière que les autre données membre.

exemple de programme

 

  1. Exploitation d'une classe : la classe comme "composante logicielle" :

Jusqu'ici nous avions écrit la définition des fonctions membre de classe à la suite de sa déclaration. Dans la pratique il n'en sera pas de même. Dans un souci de réutilisabilté des fonctions c'est deux composants seront dans deux fichiers séparés comme d'ailleurs la plupart des fonctions des bibliothèques sources en C++(iostream.h, conio.h....). Nous disposerons donc maintenant :

 

Note classe point devient :


class point 
   {
        int x;   //déclaration des membres privé
        int y;

public:
        point(int,int); //constructeur
        void deplace(int,int);
        coid affiche();

   };

Ce fichier ne nomme point.h, nous allons ensuite compilé la définitions suivante pour obtenir le module objet correspondant:


#include <iostream.h>
#include "point.h"

point::point(int abs, int ord)
        {
         x=abs;
         y=ord;
        }

void point::deplace(int dx,int dy)
        {
         x+=dx;
         y+=dy;
        }

void point::affiche()
        {
         cout<<je suis en "<<x<<" "<<y<<endl;

Ceci est le fichier à compiler pour obtenir le module objet de la classe point.

Pour utilisé cette classe il faudra inclure le fichier point.h dans votre programme et faire le lien avec le module objet lors de l'édition des liens. Seul les fonctions réellement utilisées seront incorporées lors de l'édition des liens.