EPFL
Faculté Informatique & Communications
Cours d'informatique

Mini-Référence :
Introduction à la POO : Classes et Objets


Généralités

L'idée centrale à la base de la programmation objet est de regrouper, dans un même élément informatique (appelée «objet») les descriptions statique (les données) et dynamique (les opérations) issues de la modélisation d'une entité.
Le regroupement de ces descriptions se fait, dans un langage typé comme C++, au moyen de la définition d'un type abstrait de donnée complet, appelé classe, décrivant de manière abstraite et générique un ensemble (une classe) d'objets potentiels, et constituant un type (au sens du langage de programmation).

Le regroupement des données et des opérations est appelé encapsulation. (Pour être précis, l'encapsulation induit de plus une notion d'identité; l'objet ainsi construit est un tout, et possède une frontière... de cette frontière découle deux niveaux de perception de l'objet: le niveau externe, qui est la partie visible l'objet, depuis son l'extérieur (hors de la frontière), et le niveau interne, qui représente le corps de l'objet).

L'aspect statique, modélisé par des structures de données, est présent dans la classe sous la forme de spécification d'attributs, et l'aspect dynamique est lui représenté par la définition de méthodes (implémentant les opérations réalisables sur les objets).

OBJET = (valeur d') attributs + (accès aux) méthodes (+ identité)

Au niveau de la programmation, la création d'un objet appartenant à une classe donnée (i.e. une réalisation particulière de la classe) se fait par une simple déclaration de variable dont le type est celui implémenté par la classe. L'objet ainsi créé est appelé instance (de la classe), et le processus de 'création' est appelé instanciation

Concrètement une classe définit:

  • les attributs possédés par chacune des instances;
  • les méthodes applicables à chacune des instances;

Les classes en C++

La définition (i.e. déclaration) d'une classe en C++ s'effectue au moyen de la clause class est :

  class nom_classe
   {
     ...
   };

Notez le point-virgule (;) à la fin de la déclaration.

Une fois déclarée, une classe peut s'utiliser comme une autre variable :

nom_classe monobjet;
On parle alors d'instance ou d'objet (monobjet ici).

Exemple :

class Rectangle {
...
};

...

Rectangle r0;

Les attributs et les méthodes

Pour être intéressante, une classe doit contenir un certain nombre d'éléments (encapsulation) : les attributs (similaires aux champs d'une structure) et les méthodes, qui sont les fonctions propres à une classe.

La syntaxe de la déclaration des attributs est la syntaxe normale de déclaration des variables :

type nom_attribut;

Exemple :

class Rectangle {
   double longueur;
   double hauteur;
};

La syntaxe de la définition des méthodes d'une classe est la syntaxe normale de définition des fonctions, à l'exception de la clause optionnelle const, permettant de signaler une méthode de type «prédicat» (ne modifiant pas l'état interne de l'objet) par opposition aux méthodes «d'actions» (qui peuvent modifier des attributs de l'objet).

type_retour nom_methode ( type_arg1 nom_arg1,...) [const]
 {
    // corps de la méthode
    ...
 }

Exemple :

class Rectangle {
   double surface() const {
      return longueur * largeur;
   }
   void setLargeur(double l) {
      largeur = l;
   }
   double longueur;
   double largeur;
};

Accès aux attributs et aux méthodes

  • L'invocation des méthodes définies pour une instance de nom monobjet se fait à l'aide d'expressions de la forme l:
    monobjet.nom_methode(val_arg1, ...)
  • À l'intérieur du bloc définissant une méthode, l'accès aux attributs de l'objet pour lequel la méthode est invoquée se fait en spécifiant simplement le nom de l'attribut.
  • Il existe un attribut particulier, toujours défini et propre à chaque instance : this.

    this est un pointeur sur l'instance courante de l'objet.

    Il peut en particulier être utilisé en cas d'ambiguïté de nom d'attribut (ou de méthode), par exemple dans le cas du masquage d'un attribut par un argument de méthode :

     this->nom_attribut
  • En dehors des méthodes, ou pour accéder à un attribut d'une autre instance que celle pour laquelle la méthode à été invoquée, l'attribut nom_attribut de l'instance monobjet peut être référencé par une expression de la forme :
    monobjet.nom_attribut
    si tant est qu'il soit accessible de l'extérieur (c.-à-d. fait partie de l'interface)
  • Les attributs et méthodes ne faisant pas partie de l'interface (c.-à-d. non accessibles hors de l'objet) se déclarent sous le mot clé private:
  • Les attributs et méthodes faisant partie de l'interface (c.-à-d. accessibles hors de l'objet) se déclarent sous le mot clé public:

Exemple :

class Rectangle {
public:
   double surface()  {
      return longueur * largeur;
   }
   void setLargeur(double largeur) {
      this->largeur = largeur;
   }
private:
   double longueur;
   double largeur;
};

Dernière mise à jour : $Date: 2009-09-11 17:10:52 +0200 (Fri, 11 Sep 2009) $  ($Revision: 25 $)