1 Les concepts de base de la POO Application en C++ Les concepts

Transcription

1 Les concepts de base de la POO Application en C++ Les concepts
Les concepts de base de la POO
La notion d'objets
Les concepts de base de la POO
Application en C++
Intuitivement, un objet est une représentation d'une
entité du monde réel.
„
„
„
Encapsulation
„Héritage
„Polymorphisme
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, …
2
1
Les concepts de base de la POO
La notion d'objets
Les concepts de base de la POO
La notion d'objets
„
On peut parler d'objets particuliers :
„
PERSONNE
„
mais tous ces objets ont les mêmes caractéristiques
„
On peut donc aussi parler d'ensemble d'objets.
„
possède
une marque, un modèle, …
habite
„
„
VOITURE
voiture : une Fiat Tipo, une Renault Mégane, …
MAISON
„
classe voiture
„
un objet particulier
„
Notion d'objets, relations entre les objets, ensemble d'objets,….
Î description d'une classe d'objets : classe voiture
Î description d'un objet particulier : une instance de la classe
„
marque, modèle, numéro d'immatriculation, …
marque = Fiat, modèle=Tipo, numéro=5678FV21
3
4
Les concepts de base de la POO
La notion d'objets
„
„
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.
VEHICULE
Par exemple, tous les véhicules possèdent une
marque, un modèle, un numéro, …
„
„
„
„
CAMION
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 …
„
5
VEHICULE
D'ENTREPRISE
AMBULANCE
Hiérarchie de généralisation/spécialisation
6
1
Les concepts de base de la POO
La notion d'objets
„
Les concepts de base de la POO
La description des objets et de leurs caractéristiques
s'accompagne de la description des opérations
applicables sur ces objets.
„
„
„
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
„
„
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
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
„
„
„
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, …
Polymorphisme
„
mécanisme sophistiqué qui permet de gérer les opérations sur les objets
d'une hiérarchie
„
7
8
Les concepts de base de la POO
Encapsulation
„
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.
„
„
„
„
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);
};
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
9
10
Les concepts de base de la POO
Encapsulation
„
int complexe :: lire_r(void)
{ return(r);
„
„
„
Les droits d'accès sur les membres d'une classe peuvent être :
„
private
„
}
void complexe :: ecrire(int vr, int vi)
{r=vr;
„
}
int complexe :: lire_i(void)
{return(i);
„
Les concepts de base de la POO
Encapsulation
„
i=vi; }
protected
„
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
11
„
Les membres placés en mode privé ne sont accessibles qu'aux membres
de la classe elle-même.
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).
12
2
Les concepts de base de la POO
Encapsulation
„
void main (void )
{ complexe c1, c2 ;
int vr, vi;
c1.ecrire ( 0 , 0 );
Déclaration des objets d'une classe
„
„
„
Les concepts de base de la POO
Encapsulation
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.
cout << "partie réelle ?"; cin >> vr;
cout << "partie imaginaire ?"; cin >> vi;
c2.ecrire( vr , vi );
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).
}
cout << "vérification :\n";
cout << "1" << c1.lire_r () << " + i * " << c1.lire_i () ;
cout << "2" << c2.lire_r () << " + i * " << c2.lire_i () ;
13
14
Les concepts de base de la POO
Encapsulation
„
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.
„
Méthodes amies
„
Idée intuitive : possibilité de donner des droits spéciaux
„
„
Ses membres ont été déclarés comme privés, donc
interdits en accès à toute fonction non membre de la
classe.
„
nécessité de “nommer” cette méthode comme ayant des
droits spéciaux dans la classe concernée
„
C’est une méthode :
„
„
„
de manipulation des champs privés ou protégés d'une classe
à une méthode “externe” à la classe.
L'usage des fonctions lire_r, lire_i et ecrire est
obligatoire.
„
„
concept de méthode amie d’une classe
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"
15
Les concepts de base de la POO
Encapsulation
„
„
„
16
Les concepts de base de la POO
Encapsulation
class matrice
{ int mat[MAX][MAX];
public :
void affiche(void);
void saisie(void);
..........................
friend vecteur mult_mat_vect(matrice, vecteur);
};
class vecteur
{ int vect[MAX];
public :
void affiche(void);
void saisie(void);
..........................
friend vecteur mult_mat_vect(matrice, vecteur);
};
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.
17
18
3
Les concepts de base de la POO
Encapsulation
„
Les concepts de base de la POO
Encapsulation
Définition de la fonction de multiplication
„
„
„
„
Autre possibilité de définition d’une méthode amie
Une méthode amie d’une classe peut être membre d’une autre classe.
„
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
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);
..........
};
Appel de la fonction
vecteur v1,v2;
matrice mt;
..........
v2= mult_mat_vect(mt,v1);
19
20
Les concepts de base de la POO
Encapsulation
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);
};
„
„
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);
21
22
Les concepts de base de la POO
Encapsulation
„
„
„
Les concepts de base de la POO
Surcharge des méthodes et des opérateurs
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 :
Les méthodes d'une classe peuvent être
surchargées
„
Surcharge la méthode "ecrire" de la classe
complexe selon un deuxième profil :
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
„
„
„
void ecrire(void)
„
qui affecte les parties réelles et imaginaires à 0.
utiles pour surcharger les opérateurs prédéfinis
23
24
4
Les concepts de base de la POO
Les concepts de base de la POO
Surcharge des méthodes et des opérateurs
Surcharge des méthodes et des opérateurs
void complexe :: ecrire(int vr, int vi)
{ r=vr; i=vi; }
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)
};
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);
25
Les concepts de base de la POO
Les concepts de base de la POO
Surcharge des méthodes et des opérateurs
„
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.
„
„
26
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.
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);
};
27
Les concepts de base de la POO
28
Les concepts de base de la POO
Surcharge des méthodes et des opérateurs
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);
}
„
29
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() ;
}
„
30
5
Les concepts de base de la POO
Les concepts de base de la POO
Initialisation des objets d'une classe
„
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é :
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)
...
};
„
appel implicite à une méthode d'initialisation à la
déclaration d'un objet de la classe
31
32
Les concepts de base de la POO
Les concepts de base de la POO
Initialisation des objets d'une classe
„
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,
„
„
„
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
...
};
méthode dont le nom est ~nom_classe,
appelée lorsqu'une variable est détruite.
33
34
Les concepts de base de la POO
Les concepts de base de la POO
Initialisation des objets d'une classe
Initialisation des objets d'une classe
complexe :: complexe (int vr, int vi)
{ r=vr;
i=vi; }
„
„
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);
...
};
Déclaration d'objets avec le constructeur
void main(void)
{ complexe c1(4,7);
complexe c2 = complexe (4,7);
…
}
complexe :: complexe (int vr)
{
r=vr; i=0;}
35
36
6
Les concepts de base de la POO
Les concepts de base de la POO
Initialisation des objets d'une classe
„
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);
complexe (int, int);
complexe(int);
...
};
complexe :: complexe (void)
{
r=0; i=0; }
„
„
// constructeur par défaut
37
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);
38
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
39
7