29/01/2019
UNIVERSITÉ DES SCIENCES ET DE LA TECHNOLOGIE D’ORAN « USTOMB »
FACULTÉ DE GÉNIE ÉLECTRIQUE - DÉPARTEMENT D’ELN
MASTER 1:RT/II/ESE/ EB
MODULE: POO
C++ : Approche orientée
objets
La responsable du module: Dr. Zouagui-Meddeber L.
[email protected]1
1
Objet - classe
• Un objet est une structure informatique
regroupant :
– Des variables, caractérisant l’état de l’objet,
– Des fonctions, caractérisant le comportement de
l’objet.
• Un ensemble d’objets de même type s’appelle une
classe.
• En C++, la programmation d’une classe se fait en
trois phases : déclaration, définition, utilisation
(en abrégé : D.D.U).
2
1
29/01/2019
Objet
Approche procédurale :
"Que doit faire mon programme ?"
Approche orientée-objet :
"De quoi doit être composé mon programme ?"
Cette composition est conséquence d'un choix de
modélisation fait pendant la conception
Exemple: Gestion d'une bibliothèque
L’attentat
Yasmina Khadra
El Watan Amina Kara Djamila Nait
Directrice Lectrice
L’incendie Mohamed Daoud
Bachir Abidi Lecteur
Mohamed Dib Bibliothécaire
Classe
Des objets similaires peuvent être informatiquement décrits par
une même abstraction : une classe
même structure de données et méthodes de traitement
valeurs différentes pour chaque objet
Classe Lecteur
Classe Livre Classe Employé -nom, prénom
-titre, auteur Classe Journal -nom, prénom, statut
-titre
Germinal
E. Zola
Le Monde Alice Dupont Anne Durand
Directrice Lectrice
Le seigneur des anneaux Arsène Deschamps
Michel Martin Lecteur
J.R.R.Tolkien Bibliothécaire
2
29/01/2019
Contenu d'une classe
Une classe est composée de plusieurs membres dont chacun est soit :
un attribut : variable typée
une méthode (ou opération) : ensemble d'instructions de traitement
L’approche objet considère comme indissociable les données et les méthodes pour
les manipuler.
class CompteBancaire
{
String proprietaire;
Attributs double solde;
double getSolde()
{
return solde;
Méthodes }
void credite(double val)
{
solde = solde + val;
}
}
Objets
• Les instances possèdent :
– Des caractéristiques dont les types sont semblables :
les attributs.
– Des comportements qui leur sont tous identiques : les
méthodes.
– Chaque instance d’une classe possède les mêmes
champs et les mêmes méthodes que les autres. Mais
les valeurs de ces champs peuvent varier d’un objet à
l’autre.
3
29/01/2019
CLASSE
ETUDIANT Nom de la classe
N°INS: int
NOM_ET: string(50)
PRENOM_ET: string(50) Les attributs de
ADRESSE: string(100) la classe
NOTES: double
Calcul_moyenneG(…): double
Les méthodes la
classe
ETUDIANT 1 ETUDIANT 2 ETUDIANT 3
3255 4269 3955
Bentabet Ziane Badji
Mohamed karima Anes
Oran Alger Tlemcen
12.5; 10.0; 8.5 13.75; 11.0; 16.5 8.5; 10.5;16.0
Calcul_moyenneG(…) Calcul_moyenneG(…) Calcul_moyenneG(…)
Instance1 : Objet1 Instance2 : Objet2 Instance3 : Objet3 7
Concepts de base de l’approche
orientée-objets
• Modélisation (classes, instances)
• Encapsulation
– C’est la protection que les objets accordent à leurs
attributs.
• Activation (méthodes, messages)
– C’est la capacité à actionner un objet depuis
l’extérieur, par l’appel de ses méthodes.
• Héritage
– Héritage des propriétés (attributs et méthodes).
8
4
29/01/2019
Classes : syntaxe C++
• Définition simple d'une classe :
class <nom>
{
public:
<prototypes de fonctions membres public>
private:
<données membres>
<prototypes de fonctions membres private>
};
9
Classes : syntaxe C++
• La définition d'une classe débute par le mot clé
réservé : class
Nom de la classe
Mot-clé « class »
Accolade ouvrante
Définitions d’attributs :
Type + nom de variable
Déclarations de méthodes :
fonctions qui sont «connues » par la classe
Accolade fermante
Point-virgule 10
5
29/01/2019
Classes : syntaxe C++
• Class vs struct
11
Classes : syntaxe C++
• Méthodes d’objets
– Les méthodes d’objets (ou d’instances) sont des
fonctions qu’il est possible d’appliquer à un objet
d’une classe.
– Synonymes : « fonctions membres » ou simplement
«méthodes».
– L’ensemble des méthodes forment la partie
comportementale (dynamique) d’un objet.
12
6
29/01/2019
Classes : syntaxe C++
• La classe Point a deux membres données privés
x et y.
• Elle a trois méthodes publiques ‘initialise’,
‘deplace’ et ‘affiche’.
13
Classes : syntaxe C++
• L'opérateur de portée :: indique la classe à
laquelle appartient la méthode.
14
7
29/01/2019
Classes : syntaxe C++
• Utilisation :
15
Classes : syntaxe C++
• Comme d’habitude, il faut distinguer les notions
de définition et de déclaration.
• On peut procéder de deux manières pour
introduire une méthode dans une classe :
1. Définir la fonction au sein de la définition de la classe
elle-même.
2. Déclarer la fonction dans la classe, et la définir
ailleurs.
16
8
29/01/2019
Classes : définition vs déclaration
• EN GENERAL :
– On définit la classe et on déclare ses méthodes dans
un fichier dont le nom est celui de la classe et portant
l’extension « .h »
– On définit les méthodes (leur corps) dans un fichier
dont le nom est aussi celui de la classe et portant
l’extension « .cpp » qui inclut le précédent.
17
Classes : définition vs déclaration
18
9
29/01/2019
Séparation entre la déclaration et
l’implémentation d’une classe
19
Classes : définition vs déclaration
20
10
29/01/2019
Classes : encapsulation
• L’encapsulation est une notion fondatrice de
l’approche orientée-objets. C’est elle qui garantit
la modularité des programmes. Dans l’esprit le
plus pur de l’approche objet, les attributs seront
donc déclarés privés (private), nous verrons plus
loin cette notion.
• C’est une bonne pratique de protéger les données
des objets pour respecter le principe de
l’encapsulation.
21
Notion d’encapsulation
22
11
29/01/2019
Classe : encapsulation
• On voit apparaître un nouveau mot-clé « public »
dans l’exemple. Il signifie que tout ce qui suit est
de portée générale et peut être appelé depuis
n’importe quel endroit dans le code.
• Les deux méthodes ont accès à tous les attributs
quels qu’ils soient. Enfin, une méthode peut
appeler n’importe quelle autre méthode de la
même classe, quelle qu’elle soit.
23
Classe : encapsulation
24
12
29/01/2019
Classe : encapsulation
• Les spécificateurs private, protected et public
peuvent apparaître dans un ordre et un nombre
quelconque dans la définition d'une classe. Un
spécificateur définit les règles d'accès applicables
jusqu'au spécificateur suivant.
• Si aucun spécificateur n'est précisé :
– Les membres sont privés (private) par défaut pour une
classe (class) ;
– Ils sont publics (public) par défaut pour une structure
(struct). 25
Classe : encapsulation
26
13
29/01/2019
Spécificateur private
• L'accès aux données et fonctions privées d'une
classe (private) est réservé aux méthodes de la
classe elle-même, ainsi qu'à des fonctions ou à
des classes
• étrangères déclarées amies (friend).
27
Spécificateurs protected, public
• Le spécificateur protected a un effet semblable à
private, mais avec une limitation moins sévère des
accès. En effet, l'accès est également autorisé aux
méthodes des sous-classes et aux amis de ces
sous-classes.
• Le spécificateur public signifie que la méthode ou
l'attribut est accessible depuis n'importe quelle
autre fonction du programme. Pour respecter
l'esprit de la programmation objet, il faut
cependant éviter de rendre publics des attributs. 28
14
29/01/2019
Accès aux membres (attributs et méthodes)
• On accède aux
attributs et aux
méthodes d'un objet
par la notation
pointée (ou la
notation fléchée dans
le cas d'un pointeur
sur un objet).
29
Accès aux membres (attributs et méthodes)
• Par souci de simplicité, on a
déclaré tous les membres
publics.
• « pa » est du type « Point »,
on accède à ses attributs et
appelle ses méthodes par la
notation pointée.
• « pb » est du type « pointeur
vers Point », on utilise la
notation fléchée
• « tp[0] » est du type « Point »,
notation pointée
• « tp » est du type « pointeur
vers Point », notation fléchée 30
15
29/01/2019
Accès aux membres (attributs et méthodes)
31
Encapsulation : notion d’accesseurs
• Pour respecter le principe d’encapsulation des
données, on ne rend pas les attributs publics. Si
leur accès est nécessaire, une bonne pratique
consiste à le faire par des méthodes.
• Ces méthodes s’appellent des accesseurs
(setters/getters en anglais).
32
16
29/01/2019
Encapsulation : notion d’accesseurs/Modificateurs
33
Encapsulation : notion d’accesseurs/Modificateurs
#include <iostream>
#include "rectangle.h"
using namespace std;
int main()
{
Rectangle *R1=new Rectangle;
R1->largeur=10;// erreur de compilation
R1->hauteur=30;// erreur de compilation
R1->setHauteur(20);
R1->setLargeur(6);
cout<<R1->getHauteur()<<endl;
cout<<R1->getLargeur()<<endl;
return 0;
}
34
17
29/01/2019
Classes - Recommandations de style
• Mettre :
– La première lettre du nom de la classe en majuscule.
– La liste des membres publics en premier.
– Les noms des méthodes en minuscules.
– Le caractère _ comme premier caractère du nom
d’une donnée membre.
• Exemple :
35
Constructeurs/Destructeurs
• Les constructeurs et les destructeurs sont les
méthodes les plus importantes d'une classe.
– C'est là que sont créées toutes les données qui seront
ensuite utilisées dans le programme ;
– On y manipule allocation et désallocation dynamique
de la mémoire ;
36
18
29/01/2019
Constructeurs
• Un constructeur est une méthode particulière qui
est appelée automatiquement juste après une
création d’objet. Il porte le même nom que la
classe, et n'a pas de type de retour.
• Un constructeur sert à initialiser l'objet au
moment de sa création.
• Syntaxe :
<nom>(<liste des paramètres>): <liste d’initialisation>
{ // code du constructeur, éventuellement vide}
37
Constructeurs
38
19
29/01/2019
Constructeurs
39
Constructeurs
40
20
29/01/2019
Constructeurs
Constructeurs
21
29/01/2019
Destructeurs
• Les destructeurs sont les symétriques des
constructeurs. On trouve dans un destructeur des
tâches qui sont du domaine du "nettoyage" :
– Libération de la mémoire allouée dynamiquement ;
– Enregistrement de données, fermeture de fichiers ...
• Le nom du destructeur est le même que celui de
la classe, précédé du signe tilde "~". Un
destructeur ne possède pas de valeur de retour et
n'a aucun argument.
43
Destructeurs
44
22
29/01/2019
Destructeurs
• Dans l'immense majorité des situations, les
destructeurs sont appelés implicitement pendant
l'exécution du programme.
• Pour les objets créés dynamiquement, il faut
cependant appeler explicitement la destruction
sur le pointeur.
45
Destructeurs
46
23
29/01/2019
Constructeurs/Destructeurs
47
Constructeurs/Destructeurs
48
24
29/01/2019
Pointeur this
• Chaque méthode d'objet dispose en fait d'un
argument supplémentaire, ajouté
automatiquement par le compilateur. Cet
argument est un pointeur du nom de this, vers
l'objet à qui est appliqué la méthode.
• this est un pointeur constant dont la valeur est
l'adresse de l'objet (permet de désigner l'objet
courant).
• L'intérêt du pointeur this se fait sentir dans au
moins deux cas :
49
Pointeur this
1. Lorsque les attributs de l'objet sont masqués par des
déclarations qui utilisent les mêmes noms :
2. Lorsqu'on veut retourner l'adresse de l'objet :
50
25
29/01/2019
Pointeur this
this->
• Exemple :
51
Pointeur this
Création ou allocation statique
Création ou allocation dynamique
52
26
29/01/2019
Classes : fonctions amies
• Une fonction amie d'une classe C est une fonction
qui, sans être membre de cette classe, a le droit
d'accéder à tous ses membres, aussi bien publics
que privés.
• Une fonction amie doit être déclarée ou définie
dans la classe qui accorde le droit d'accès,
précédée du mot réservé friend. Cette déclaration
doit être écrite indifféremment parmi les membres
publics ou parmi les membres privés :
53
Classes : fonctions amies
• Fonction extérieure à la classe ayant accès aux
données privées de la classe
• Plusieurs situations d’« amitié »
– Une fonction indépendante, amie d’une classe.
– Une méthode d’une classe, amie d’une autre classe.
– Une fonction amie de plusieurs classes.
– Toutes les méthodes d’une classe amies d’une autre
classe.
54
27
29/01/2019
Classes : fonctions amies
55
Classes : fonctions amies
56
28
29/01/2019
Classe : surcharge d’opérateurs
• En C++, on peut surcharger la plupart des
opérateurs usuels du langage, c’est-à-dire les
reprogrammer pour que, dans un certain
contexte, ils fassent autre chose que ce qu’ils font
d’habitude.
– Opérateurs qu’on peut surcharger en C++ :
57
Classes - résumé
• Exemple de classe :
58
29
29/01/2019
Classes - résumé
59
Classes - résumé
60
30
29/01/2019
Classe : résumé
r1 : allocation statique
class Rectangle
{ main()
private: {
Rectangle r1;
int width;
r1.set(5, 8);
int length;
}
public:
void set(int w, int l); r1
width = 5
int compute_area(); length = 8
};
61
Classe : résumé
r2 est un pointeur sur l’objet Rectangle
class Rectangle
{ main()
{
private: Rectangle r1;
int width; r1.set(5, 8); // notation pointée
int length; Rectangle *r2;
r2 = &r1;
public: r2->set(8,10); // notation fléchée
void set(int w, int l); }
int compute_area(); 5000
r1 r2
6000
}; width = 8
5
length = 10
8 5000
???
62
31
29/01/2019
Classe : résumé
r3 : allocation dynamique
class Rectangle
main()
{
{
private: Rectangle *r3;
r3 = new Rectangle();
int width;
int length; r3->set(80,100); // notation fléchée
public: delete r3;
r3 = NULL;
void set(int w, int l);
}
int compute_area(); r3
6000 5000
}; NULL
5000
???
width = 80
length = 100
63
Vie d’un objet
64
32
29/01/2019
Classes : résumé
• Trois objets de même type ‘Circle’ mais différents
de par leurs champs données (data fields).
65
66
33
29/01/2019
Constructeurs
67
Séparation entre la déclaration et
l’implémentation d’une classe
68
34