Pointeurs, références & allocation dynamique Rappels sur les fonctions Les spécificités du C++ Structures et classes Encapsulation des données Notions de constructeur et de destructeur Fonctions et classes amies Surcharge d'opérateur Héritage Notions de patrons de fonctions et de classes Introduction à la librairie standard STL
Compilation et directives de préprocesseur Convention d'écriture et organisation des programmes Écriture/lecture sur l'entrée/sortie standard Les membres données statiques Utilisation de enum et de typedef
Retour menu principal

Encapsulation des données


L’encapsulation, littéralement la mise sous capsule, consiste à interdire l’accès de certains membres d’une classe à toutes fonctions extérieures à la classe. En d’autres termes, il n’est pas possible d’agir directement sur les données d’un objet, toutes modifications des membres de l’objet se faisant par l'intermédiaire des méthodes associées.

Intérêt de l’encapsulation

Avantages

  • Lors de la programmation et surtout de la réutilisation d’un objet dans un autre programme, l’encapsulation empêche la modification non voulu des données membres,
  • L’objet, vu de l’extérieur, n’est caractérisé que par ses méthodes. La manière dont elles fonctionnent (i.e. les rouages à l’intérieur de l’objet) n’a pas d’importance. Ainsi :
    1. l’objet est plus facile à utiliser pour quelqu’un d’extérieur, il lui suffit d’utiliser les méthodes.
    2. la maintenance et l’amélioration de l’objet est grandement facilitée. Tant que la finalité des méthodes ne change pas, on peut modifier les rouages sans perturber pour autant les utilisateurs de la classe.
    3. l’objet est facilement réutilisable.

Vu de “l’extérieur”, un objet se caractérise par les spécifications (noms, arguments et rôles) de ses méthodes, la manière dont sont réellement implantées les données étant finalement sans importance1.

Inconvénients

De prime abord, peut paraître inutile et lourd à utiliser

Syntaxe

Les mots clés sont private et public 2.

class point
{
private :
  int m_X; // x et y sont alors privés
  int m_Y;

public :
  void affiche();
  void initialise(int abs, int ord);
  int get_x() { return m_X; }
  int get_y() { return m_Y; }
};

Utilisation

Tout objet bien conçu doit encapsuler ses membres. En pratique cela nécessite :

  • des méthodes pour accéder aux valeurs des membres encapsulés (dans l’exemple précédent, il s’agit de get_x() et get_y()),
  • des méthodes pour modifier les membres (la méthode initialise(int,int) permet une telle modification).

Dans l’exemple précédent, pour accéder au membre m_X on écrira

point my_point;
cout << my_point.get_x() << endl;

et non

cout << my_point.m_X << endl;

qui sera, quoiqu’il arrive, rejeté par le compilateur en raison de l’encapsulation de m_X.

Par défaut, les données i.e. les membres d’une classe sont privées à l’inverse d’une structure où les données sont par défaut publiques. Par conséquent, le mot clé private n’est pas nécessaire dans la déclaration de la classe Point.

Notes :

1

une telle notion est communément appelée “abstraction des données” exprimant le fait que les détails de l’implémentation demeurent cachés

2

ainsi que protected qui est intermédiaire et qui s’utilise pour les classes dérivées.