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 :
- l’objet est plus facile à utiliser pour quelqu’un d’extérieur, il lui suffit d’utiliser les méthodes.
- 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.
- 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()
etget_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
.