7.4. Encapsulation des données

Les divers champs d'une structure sont accessibles en n'importe quel endroit du programme. Une opération telle que celle-ci est donc faisable :

clientele[0].Solde = 25000;

Le solde d'un client peut donc être modifié sans passer par une méthode dont ce serait le but. Elle pourrait par exemple vérifier que l'on n'affecte pas un solde supérieur au solde maximal autorisé par le programme (la borne supérieure des valeurs des entiers signés : 32767). Un programme qui ferait :

clientele[0].Solde = 32800;
espérerait obtenir un solde positif, or il obtiendrait un solde de -12 (valeur en nombre signé du nombre non signé 32800) !

Il est possible d'empêcher l'accès des champs ou de certaines méthodes à toute fonction autre que celles de la classe. Cette opération s'appelle l'encapsulation. Pour la réaliser, utiliser les mots-clés suivants :

Pour changer les droits d'accès des champs et des méthodes d'une classe, il faut faire précéder ceux-ci du mot-clé indiquant les droits d'accès suivi de deux points (':'). Par exemple, pour protéger les données relatives au client, on changera simplement la déclaration de la classe en :

struct client
{
private:   // Données privées :

    char Nom[21], Prenom[21];
    unsigned int Date_Entree;
    int Solde;
    // Il n'y a pas de méthodes privées.

public:    // Les données et les méthodes publiques :

    // Il n'y a pas de données publiques.
    int dans_le_rouge(void);
    int bon_client(void)
};

Par défaut, les classes construites avec struct ont tous leurs membres publics. Il est possible de déclarer une classe dont tous les éléments sont par défaut privés. Pour cela, il suffit d'utiliser le mot-clé class à la place du mot-clé struct.

Exemple 7-4. Utilisation du mot-clé class

class client
{
    // private est à présent inutile.

    char Nom[21], Prenom[21];
    unsigned int Date_Entree;
    int Solde;

public:    // Les données et les méthodes publiques.

    int dans_le_rouge(void);
    int bon_client(void);
};

Enfin, il existe un dernier type de classe, que je me contenterai de mentionner : les classes union. Elles se déclarent avec le mot-clé union comme les classes struct et class. Les données sont, comme pour les unions du C, situées toutes au même emplacement, ce qui fait qu'écrire dans l'une d'entre elle provoque la destruction des autres. Les unions sont très souvent utilisées en programmation système, lorsqu'un polymorphisme physique des données est nécessaires (c'est-à-dire lorsqu'elles doivent être interprétées de différentes façons selon le contexte).

Note : Les classes de type union ne peuvent pas avoir de méthodes virtuelles et de membres statiques. Elles ne peuvent pas avoir de classes de base, ni servir de classe de base. Enfin, les unions ne peuvent pas contenir des références, ni des objets dont la classe a un constructeur non trivial, un constructeur de copie non trivial ou un destructeur non trivial. Pour toutes ces notions, voir la suite du chapitre.