1
Les concepts de base de la POO Application en C++
Encapsulation
Héritage
Polymorphisme
2
Les concepts de base de la POO La notion d'objets
Intuitivement, un objet est une représentation d'une entité du monde réel.
une voiture, une maison, une personne, …
Un objet est caractérisé par un ensemble de propriétés
une voiture possède une marque, un modèle, un numéro d'immatriculation, …
une maison a une adresse, un style, …
une personne est connue par son nom, son prénom, sa date de naissance, …
Les objets peuvent avoir des liens entre eux :
une personne possède une voiture, une maison, …
3
Les concepts de base de la POO La notion d'objets
PERSONNE
MAISON VOITURE
possède habite
Notion d'objets, relations entre les objets, ensemble d'objets,….
4
Les concepts de base de la POO La notion d'objets
On peut parler d'objets particuliers :
voiture : une Fiat Tipo, une Renault Mégane, …
mais tous ces objets ont les mêmes caractéristiques
une marque, un modèle, …
On peut donc aussi parler d'ensemble d'objets.
Îdescription d'une classe d'objets : classevoiture
Îdescription d'un objet particulier : une instance de la classe
classe voiture
marque, modèle, numéro d'immatriculation, …
un objet particulier
marque = Fiat, modèle=Tipo, numéro=5678FV21
5
Les concepts de base de la POO La notion d'objets
Des objets peuvent avoir des propriétés communes et des propriétés spécifiques.
Par exemple, tous les véhicules possèdent une marque, un modèle, un numéro, …
les camions ont en plus une charge maximale,
les véhicules d'entreprise font partie d'une société,
une ambulance possède un équipement,
etc …
6
Les concepts de base de la POO La notion d'objets
Hiérarchie de généralisation/spécialisation
VEHICULE
CAMION VEHICULE AMBULANCE
D'ENTREPRISE
7
La notion d'objets
La description des objets et de leurs caractéristiques s'accompagne de la description des opérations applicables sur ces objets.
opérations pour connaître les propriétés de l'objet
opérations pour mettre à jour ces propriétés
opérations pour manipuler les objets
Par exemple, pour une voiture, on peut vouloir
connaître sa marque, son modèle, …
changer son numéro d'immatriculation, …
dessiner cette voiture sur un écran ou une imprimante, …
8
Les concepts de base de la POO
Encapsulation :
description d'une classe d'objets, de ses propriétés et des opérations sur ces objets dans un même ensemble
définition de droits d'accès sur les objets ou les opérations sur les objets
Héritage :
possibilité de définir de nouveaux objets par spécialisation d'objets existants
hiérarchies de généralisation/spécialisation
Réutilisation
Polymorphisme
mécanisme sophistiqué qui permet de gérer les opérations sur les objets d'une hiérarchie
9
Les concepts de base de la POO Encapsulation
On veut construire un objet «complexe » constitué de deux éléments : r et i
(respect. partie réelle et partie imaginaire) et d'opérations pour le manipuler.
initialiser : affecte les champs d'un complexe
lire_r : retourne la valeur de la partie réelle
lire_i : retourne la valeur de la partie imaginaire
10
Les concepts de base de la POO Encapsulation
Définition d'une classe
class complexe {private :
int r, i; // description des champs public :
// description des méthodes int lire_r(void);
int lire_i(void);
void ecrire(int, int);
};
11
Les concepts de base de la POO Encapsulation
int complexe :: lire_r(void) { return(r); }
int complexe :: lire_i(void) {return(i); }
void complexe :: ecrire(int vr, int vi) {r=vr; i=vi; }
par défaut les droits sont fixés à la valeur "private"
sur l'exemple, les droits sur les membres de la classe (r et i) sont privés
12
Les concepts de base de la POO Encapsulation
Les droits d'accès
sur les membres d'une classe peuvent être : private
Les membres placés en mode privé ne sont accessibles qu'aux membres de la classe elle-même.
protected
Les membres placés en mode protégé sont accessibles aux membres de la structure elle même et aux membres des classes descendantes (dans une chaîne d'héritage).
public
Les membres placés en mode public sont accessibles par tout membre situé dans la portée de la classe (en général dans tout le texte source).
13
Les concepts de base de la POO Encapsulation
Déclaration des objets d'une classe
nom_classe nom_objet;
Cette déclaration rend disponible un objet pour lequel sont accessibles tous les membres déclarés "public" dans la définition de la classe.
Pour désigner un membre d'un objet on utilise la notation
nom_objet. nom_membre
Pour les membres champs, cette notation permet un accès aux champs de la structure.
Pour les membres méthodes, cette notation permet d'exécuter la méthode (c'est un appel de fonction).
14
Les concepts de base de la POO Encapsulation
void main (void ) { complexe c1, c2 ;
int vr, vi;
c1.ecrire ( 0 , 0 );
cout << "partie réelle ?"; cin >> vr;
cout << "partie imaginaire ?"; cin >> vi;
c2.ecrire( vr , vi );
cout << "vérification :\n";
cout << "1" << c1.lire_r () << " + i * " << c1.lire_i () ; cout << "2" << c2.lire_r () << " + i * " << c2.lire_i () ; }
15
Les concepts de base de la POO Encapsulation
Remarques
Le programme principal ne peut pas accéder directement aux champs r et i d'un objet de la classe complexe.
Ses membres ont été déclarés comme privés, donc interdits en accès à toute fonction non membre de la classe.
L'usage des fonctions lire_r, lire_i et ecrire est obligatoire.
16
Les concepts de base de la POO Encapsulation
Méthodes amies
Idée intuitive : possibilité de donner des droits spéciaux
de manipulation des champs privés ou protégés d'une classe
à une méthode “externe” à la classe.
nécessité de “nommer” cette méthode comme ayant des droits spéciaux dans la classe concernée
concept de méthode amie d’une classe
C’est une méthode :
qui n'est pas membre de la classe
mais qui a le droit de manipuler les membres privés et protégés de la classe
La déclaration se fait par le mot-clé "friend"
17
Les concepts de base de la POO Encapsulation
Soit “matrice” une classe qui modélise une matrice carrée d’entiers, et certaines opérations sur les matrices (saisie, affichage, produit,...)
Soit “vecteur” une classe similaire sur les vecteurs
On souhaite définir le produit d’une “matrice” par un
“vecteur” de façon externe à ces deux classes mais en manipulant directement les champs privés de ces classes.
18
Les concepts de base de la POO Encapsulation
class matrice { int mat[MAX][MAX];
public : void affiche(void);
void saisie(void);
...
friendvecteur mult_mat_vect(matrice, vecteur);
};
class vecteur { int vect[MAX];
public : void affiche(void);
void saisie(void);
...
friendvecteur mult_mat_vect(matrice, vecteur);
};
19
Encapsulation
Définition de la fonction de multiplication vecteur mult_mat_vect(matrice m, vecteur v)
{ ... }
La fonction “mult_mat_vect” est déclarée amie des deux classes
“vecteur” et “matrice”
pas d'opérateur de résolution de portée car non membre de la classe
peut accéder aux membres privés des deux classes
Appel de la fonction vecteur v1,v2;
matrice mt;
...
v2= mult_mat_vect(mt,v1);
20
Encapsulation
Autre possibilité de définition d’une méthode amie
Une méthode amie d’une classe peut être membre d’une autre classe.
Sur l’exemple ci-dessus, on peut associer la fonction mult_mat_vect à la classe “matrice” et la déclarer comme amie de la classe “vecteur”.
class matrice { int mat[MAX][MAX];
public : void affiche(void);
void saisie(void);
vecteur mult_mat_vect(vecteur v);
...
};
21
Les concepts de base de la POO Encapsulation
class vecteur { int vect[MAX];
public :
void affiche(void);
void saisie(void);
...
friend vecteur matrice :: mult_mat_vect(matrice m, vecteur v);
};
22
Les concepts de base de la POO Encapsulation
Définition de la méthode de multiplication vecteur matrice :: mult_mat_vect(vecteur v)
{ ... }
Appel de la méthode vecteur v1,v2;
matrice mt;
...
v2= mt.mult_vect_mat(v1);
23
Les concepts de base de la POO Encapsulation
Lorsque toute les fonctions d’une classe sont des amies d’une autre classe, on peut déclarer globalement la classe comme étant amie de la première.
On souhaite par exemple que toutes les méthodes de la classe
“matrice” soient amies de la classe “vecteur”, on peut écrire : class vecteur
{ ...
friend class matrice;
...
};
La définition de fonctions "amies" peut remettre en cause les mécanismes de protection liés à l'encapsulation des données
utiles pour surcharger les opérateurs prédéfinis
24
Les concepts de base de la POO
Surcharge des méthodes et des opérateurs
Les méthodes d'une classe peuvent être surchargées
S urcharge la méthode "ecrire" de la classe complexe selon un deuxième profil :
void ecrire(void)
qui affecte les parties réelles et imaginaires à 0.
25
Les concepts de base de la POO
Surcharge des méthodes et des opérateurs class complexe
{private :
// description des champs int r, i;
public :
// description des méthodes membres int lire_r(void);
int lire_i(void);
void ecrire(int, int);
void ecrire(void) };
26
Les concepts de base de la POO
Surcharge des méthodes et des opérateurs void complexe :: ecrire(int vr, int vi)
{ r=vr; i=vi; }
void complexe :: ecrire(void) { r=0; i=0; }
Remarque : dans ce cas particulier, le
mécanisme de valeur par défaut des paramètres pourrait être utilisé.
void complexe :: ecrire(int r=0, int i=0);
27
Les concepts de base de la POO
Surcharge des méthodes et des opérateurs
La surcharge des opérateurs peut être réalisée à l’aide :
De méthodes membres de la classe,
de méthodes indépendantes et amies de la classe.
La 2 ème solution remet en cause l’encapsulation « stricte » des données de la classe.
Lorsque la surcharge est faite à l’aide d’une méthode indépendante, le nombre d’arguments doit être celui de l’opérateur de base.
Pour une méthode membre, le premier argument est toujours l’instance courante de la classe.
Si l’opérateur est unaire, la méthode membre n’aura donc pas d’argument.
Et si l’opérateur est binaire, l’argument est le membre droit de l’opérateur.
28
Les concepts de base de la POO
Surcharge des méthodes et des opérateurs
class complexe {private :
// description des champs int r, i;
public:
// description des méthodes membres int lire_r(void);
int lire_i(void);
void ecrire(int, int);
void ecrire(void)
complexe operator+ (complexe);
complexe operator- (complexe);
};
29
Les concepts de base de la POO
Surcharge des méthodes et des opérateurs
Surcharge de l'opérateur +
complexe complexe :: operator+ (complexe c) { complexe cpl;
cpl.r = r + c.r;
cpl.i = i + c.i;
return(cpl);
}
30
Les concepts de base de la POO
Surcharge des méthodes et des opérateurs
Utilisation de l'opérateur surchargé void main (void)
{ complexe c1, c2, c3;
c1.initialiser(4,4);
c2.initialiser(5,5);
c3 = c1 + c2; // c3 = c1.operator+(c2);
cout << c3.lire_r() << c3.lire_i() ;
}
31
Initialisation des objets d'une classe
De façon classique, l'initialisation d'un objet peut être faite par un appel explicite à une méthode d'écriture
class complexe {private :
int r, i;
public:
// description des méthodess membres void ecrire(int, int);
void ecrire(void) }; ...
32
Initialisation des objets d'une classe void main (void)
{ complexe c1,c2;
/* appel explicite de la méthode ecrire */
c1.ecrire(5,8);
c2.ecrire();
}
possibilité d'omission de l'appel de la fonction
idée pour plus de sécurité :
appel implicite à une méthode d'initialisation à la déclaration d'un objet de la classe
33
Les concepts de base de la POO
Initialisation des objets d'une classe
C++ propose une solution simple et élégante pour répondre à ce problème
possibilité de décrire une (ou des) méthode(s)
de même nom que la classe
et considérée comme des méthodes d'initialisation associées à chaque déclaration d'un objet
Les constructeurs
De façon similaire, il est possible de définir un destructeur,
méthode dont le nom est ~nom_classe,
appelée lorsqu'une variable est détruite.
34
Les concepts de base de la POO
Initialisation des objets d'une classe
Définition de la classe complexe avec un constructeur class complexe
{private : int r, i;
public :
// description d’un constructeur avec 2 arguments complexe (int, int);
// description des méthodes membres ...
};
35
Les concepts de base de la POO
Initialisation des objets d'une classe complexe :: complexe (int vr, int vi)
{ r=vr; i=vi; }
Déclaration d'objets avec le constructeur void main(void)
{ complexe c1(4,7);
complexe c2 = complexe (4,7);
… }
36
Les concepts de base de la POO
Initialisation des objets d'une classe
C++ permet de définir plusieurs constructeurs dont les profils sont différents (par leur nombre de paramètres)
pas d'ambiguïté pour le compilateur class complexe
{private : int r, i;
public : complexe (int, int);
complexe(int);
...
};
complexe :: complexe (int vr) { r=vr; i=0;}
37
Les concepts de base de la POO
Initialisation des objets d'une classe
C++ distingue plusieurs types de constructeurs. L’un d’eux est le constructeur par défaut i.e. c’est un constructeur sans paramètre
class complexe {private :
int r, i;
public :
complexe(void); // constructeur par défaut complexe (int, int);
complexe(int);
...
};
38
Les concepts de base de la POO
Initialisation des objets d'une classe complexe :: complexe (void)
{ r=0; i=0; }
Il est conseillé de définir systématiquement un constructeur par défaut.
Un constructeur dont tous les arguments ont une valeur par défaut peut être assimilé à un constructeur par défaut
complexe (int vr=0, int vi=0);
39
Les concepts de base de la POO
Initialisation des objets d'une classe
Le constructeur par copie
Son rôle est de créer une copie d’une instance existante d’un objet :
traitement réalisé par défaut : recopie bit à bit d’une zone de mémoire vers une autre
en général suffisant, sauf lorsque de l’allocation dynamique doit être réalisée pour construire l’objet cible
Le constructeur par copie est appelé à chaque fois qu’il est nécessaire de recopier une instance :
lors d’une déclaration d’une instance si l’initialisation est faite à l’aide de la valeur d’une autre
Lors du passage par valeur d’une instance à une fonction
lors du renvoi d’une instance par une fonction
l’utilisation de l’affectation ne provoque pas l’appel du constructeur par copie