La couche objet constitue sans doute la plus grande innovation du C++ par rapport au C.
Le but de la programmation objet est de permettre une abstraction entre l'implémentation des modules et
leur utilisation, apportant ainsi un plus grand confort dans la programmation. Elle s'intègre donc
parfaitement dans le cadre de la modularité. Enfin, l'encapsulation des données permet une meilleure
protection et donc une plus grande fiabilité des programmes.
8.1. Généralités
Théoriquement, il y a une nette distinction entre les données et les opérations
qui leur sont appliquées. En tout cas, les données et le code ne se mélangent pas dans la mémoire
de l'ordinateur, sauf cas très particuliers (autoprogrammation, alias pour le chargement des programmes
ou des overlays, débogueurs, virus).
Cependant, l'analyse des problèmes à traiter se présente d'une manière plus
naturelle si l'on considère les données avec leurs propriétés. Les données constituent les variables,
et les propriétés les opérations qu'on peut leur appliquer. De ce point de vue, les données et le code
sont logiquement inséparables, même s'ils sont placés en différents endroits de la mémoire
de l'ordinateur.
Ces considérations conduisent à la notion d'objet. Un objet
est un ensemble de données sur lesquelles des procédures peuvent être appliquées. Ces procédures
ou fonctions applicables aux données sont appelées méthodes. La programmation
d'un objet se fait donc en indiquant les données de l'objet et en définissant les procédures qui peuvent
lui être appliquées.
Il se peut qu'il y ait plusieurs objets identiques, dont les données ont bien
entendu des valeurs différentes, mais qui utilisent le même jeu de méthodes. On dit que ces différents
objets appartiennent à la même classe d'objets. Une classe constitue donc une sorte
de type, et les objets de cette classe en sont des instances. La classe définit
donc la structure des données, alors appelées champs ou
variables d'instances, que les objets correspondants auront, ainsi que les méthodes
de l'objet. À chaque instanciation, une allocation de mémoire est faite pour les données du nouvel objet
créé. L'initialisation de l'objet nouvellement créé est faite par une méthode spéciale,
le constructeur. Lorsque l'objet est détruit, une autre méthode est appelée :
le destructeur. L'utilisateur peut définir ses propres constructeurs et destructeurs
d'objets si nécessaire.
Comme seules les valeurs des données des différents objets d'une classe diffèrent,
les méthodes sont mises en commun pour tous les objets d'une même classe (c'est-à-dire que les méthodes
ne sont pas recopiées). Pour que les méthodes appelées pour un objet sachent sur quelles données
elles doivent travailler, un pointeur sur l'objet contenant ces données leur est passé en paramètre.
Ce mécanisme est complètement transparent pour le programmeur en C++.
Nous voyons donc que non seulement la programmation orientée objet est plus
logique, mais elle est également plus efficace (les méthodes sont mises en commun, les données
sont séparées).
Enfin, les données des objets peuvent être protégées :
c'est-à-dire que seules les méthodes de l'objet peuvent y accéder. Ce n'est pas une obligation,
mais cela accroît la fiabilité des programmes. Si une erreur se produit, seules les méthodes de l'objet
doivent être vérifiées. De plus, les méthodes constituent ainsi une interface entre les données
de l'objet et l'utilisateur de l'objet (un autre programmeur). Cet utilisateur n'a donc pas à savoir
comment les données sont gérées dans l'objet, il ne doit utiliser que les méthodes. Les avantages
sont immédiats : il ne risque pas de faire des erreurs de programmation en modifiant les données
lui-même, l'objet est réutilisable dans un autre programme parce qu'il a une interface standardisée,
et on peut modifier l'implémentation interne de l'objet sans avoir à refaire tout le programme,
pourvu que les méthodes gardent le même nom, les mêmes paramètres et la même sémantique. Cette notion
de protection des données et de masquage de l'implémentation interne aux utilisateurs de l'objet constitue
ce que l'on appelle l'encapsulation. Les avantages de l'encapsulation seront
souvent mis en valeur dans la suite au travers d'exemples.
Nous allons entrer maintenant dans le vif du sujet. Cela permettra de comprendre
ces généralités.