POO CPP
POO CPP
POO CPP
Orientée
Objet
Abderrahmane Ouchatti
Prof Agrégé de Génie Electrique
2020/2021
Plan
Introduction & généralités
Spécificités du Langage C++
Notions de Classe et Objet.
Propriétés des fonctions membres.
Construction, destruction et initialisation des objets
Les fonctions amies
Surdéfinition des opérateurs
Technique de l'héritage
L’héritage multiple
Polymorphisme
Gestion des flux
Les templates
Gestion des exceptions 2
Langages Objets
C++
Java
C#,
Python,
PHP,
Javascript
…
les objets sont aussi utilisés pour :
▶ Bases de données objets (Oracle)
▶ Méthodes de modèlisation objets (UML)
▶ HTML+CSS, (accompagné de Javascript, PHP…)
3
Introduction
Concepts qui donnent la puissance à la P.O.O.
4
Introduction & Généralités
POO – Avantages & Intérêts :
C++,
Java, Gambas 3 SmallTalk (totalement objet)
Ada Java Delphi (=Pascal orienté objet)
C# Kylix PHP (Depuis la version 4)
D Objective-C Objective Caml (ocaml)
Fortran 2003 Perl Ruby
Python Visual Basic
6
Introduction & Généralités
Langages de programmation orientée objet
C++. 1983. Par Bjarne Stroustrup. S'appelait C with Classes jusqu'en 1983. Le
standard est C++ 98 auquel a succédé C++ 11 en 2011.
C#. 2000. Par Microsoft comme alternative à Java et dérivé aussi de C++. C'est
un langage impératif et OO complet.
Java. 1995. James Gosling and Sun. Fonctionnant sur machine virtuelle et donc
portable, il est dérivé de C avec objets. Chaque classe est stockée dans un fichier.
PHP, Personal Home Page Hypertext Processor. 1995 by Rasmus Lerdof. PHP 5
en 2004. PHP 6 en 2007. Scripting coté serveur et générateur de pages.
https://www.scriptol.fr/programmation/liste-langages-programmation.php
7
Introduction & Généralités
Langages interprétés – langages compilés
Deux grands types de langages :
les langages interprétés : Java (+ JavaScript), Python, PHP, …;
les langages compilés : C, Pascal, C++, C#, ...
Langages interprétés
10
Introduction & Généralités
Langages interprétés – langages compilés
Principales différences :
Avec un langage interprété, le même code source pourra
fonctionner directement sur tout ordinateur.
11
Introduction & Généralités
Langages interprétés – langages compilés
Quelques exemples de langages couramment utilisés
Langage Domaine d'application principal Compilé/interprété
ADA Le temps réél Langage compilé
BASIC Programmation basique à but éducatif Langage interprété
C Programmation système Langage compilé
C++ Programmation système objet Langage compilé
Cobol Gestion Langage compilé
Fortran Calcul Langage compilé
Java Programmation orientée internet Langage intermédiaire
MATLAB Calcul mathématique Langage interprété
Mathematica Calcul mathématique Langage interprété
LISP Intelligence artificielle Langage intermédiaire
Pascal Enseignement Langage compilé
PHP Développement de sites web dynamiques Langage interprété
Prolog Intelligence artificielle Langage interprété
Perl Traitement de chaînes de caractères Langage interprété
12
POO – Langage C++
13
Langage C++
Compilateurs C++
GCC Éditeur : GNU
GNU Compiler Collection, abrégé en GCC, est un ensemble de compilateurs créés par le
projet GNU. GCC est un logiciel libre capable de compiler divers langages de
programmation, dont C, C++, Objective-C, Java, Ada et Fortran. GCC est utilisé pour le
développement de la plupart des logiciels libres.
MinGW ou Mingw32 (Minimalist GNU for Windows) est une adaptation des logiciels de
développement et de compilation du GNU (GCC - GNU Compiler Collection), à la plate-
forme Win32. Contrairement à Cygwin, les programmes générés avec MinGW n'ont pas
besoin de couche intermédiaire de compatibilité (sous forme d'une bibliothèque
dynamique, DLL). L'appellation Mingw32 a été abandonnée depuis que MinGW
supporte les environnements d'exécution 64 bits en plus du 32 bits.
14
Langage C++
Environnement de développement intégré
Code::Blocks
• Logiciel libre de développement en C++.
• Licence : Gratuit OS : Windows XP Windows Vista Windows 7 Windows 8
Windows 10 Langue : EN Version : 17.12
De-C++
• Un environnement de développement gratuit pour le langage C++.
• Licence : Gratuit OS : Windows XP Windows Vista Windows 7 Windows
8 Langue :EN Version : 5.9.2
15
Spécificités du Langage C++
16
Spécificités du Langage C++
1. Commentaires
23
Spécificités du Langage C++
6. Surdéfinition de fonction (overloading)
• On parle de surdéfinition ou de surcharge lorsqu’un même symbole
possède plusieurs significations différentes, le choix de l’une des
significations se faisant en fonction du contexte. Pour pouvoir employer
plusieurs fonctions du même nom, il faut un critère permettant de choisir la
bonne fonction. En C++, ce choix est basé sur le type des arguments.
Exemple
void f(int x)
{ cout<<"fonction numéro 1 : "<<x<<"\n"; }
void f(double x)
{ cout<<"fonction numéro 2 : "<<x<<"\n"; }
void main()
{
int a=2; double b=5.7;
f(a); f(b); f('A');
}
24
Spécificités du Langage C++
6. Surdéfinition de fonction (overloading)
Exemple 2 f(a, x); appellera la fonction f1.
void f(int, double); // f1 f(c, x); appellera la fonction f1 après
void f(double, int); // f2 conversion de c en int.
int a, b; f(a, b); conduira à une erreur de
double x;
compilation (convertir a en double ou b en
char c ;
double).
27
Classes et Objets
Définition Générale:
« ce sur quoi porte notre connaissance »
But:
modélisation des propriétés statiques et dynamiques de l’environnement dans
lequel sont définis les besoins (domaine du problème),
formalisation de la perception du monde et des phénomènes qui s’y déroulent,
Avantages:
capacité à :
Regrouper ce qui a été séparé,
Construire le complexe à partir de l’élémentaire,
Intégrer statiquement et dynamiquement les constituants d’un système.
29
Classes et Objets
Notation UML - Diagramme de classes
classe
attribut
Identifiant
Opération
Relation (Association)
généralisation / spécialisation
30
Classes et Objets
Notion de classe
Une classe est une description abstraite (condensée) d’un ensemble
d’objets qui définit la structure (des données), leurs comportements et
leurs relations.
Nom de Classe
Attributs
Opérations () Moyen de transport
Type
Formalisme :
Poids
Couleur
Démarrer ()
Accélérer ()
Freiner ()
31
Classes et Objets
Notion d’Objet
Exemple
une personne, une voiture, une maison, ...
Méthodes Démarrer ()
Arrêter()
actions que l'objet est à même de réaliser Rouler()
32
Classes et Objets
Notion de Classe – Objets
Voiture FIAT-UNO-17
Numéro de série : Int 233434 : Numéro de série
Poids : double 1500 kg : Poids
Immatriculation : String 8864 YF 17 : Immatriculation
Kilométrage : double 33 000 : kilométrage
Démarrer ()
Arrêter()
Rouler()
Renault-Clio-17 Peugeot-206-75
5323454 : Numéro de série 3434 : Numéro de série
1500 kg : Poids 1700 kg : Poids
64 YFT 17 : Immatriculation 8634 YGG 75 : Immatriculation
23 000 : kilométrage 15 000 : kilométrage
33
Classes et Objets
Données membres
Fonctions membres
DeuxRoues CompteBancaire
Nom de la classe
m_tailleRoues m_numéro
Vision m_nbVitesses Données membres Vision
m_solde
interne m_couleur ou attributs interne
m_propriétaire
m_poids Créditer()
Accélérer() Débiter()
Fonctions membres
Vision Freiner() Fermer() Vision
ou méthodes
externe ChangerVitesse() externe
Numéro()
GetCouleur() Solde()
GetPoids() Propriétaire()
35
Classes et Objets
38
Classes et Objets
class C
{
public :
………………………. ;
………………………… ;
private :
………………………… ;
………………………… ;
};
class point
{
int x, y;
public :
………………… ;
};
Affectation d’objets point p1, p2;
39
Classes et Objets
Notion de constructeur et de destructeur
• Un constructeur est une fonction qui est appelée
automatiquement après la création d’un objet (quelque soit la
classe : statique, automatique ou dynamique).
• De la même façon, un objet possède un destructeur, fonction
membre qui est appelée automatiquement au moment de la
destruction de l’objet correspondant.
• Par convention, le constructeur se reconnaît à ce qu’il porte le
même nom que la classe. Quant au destructeur, il porte le même
nom que la classe précédé du symbole ~.
Règles
• Un constructeur peut ou non comporter quelques arguments.
• par définition, un constructeur ne renvoie pas de valeur et la présence de void (dans
ce cas précis) est une erreur.
• Un destructeur, par définition, ne peut pas disposer d’arguments et ne renvoie pas
de valeur. 40
Classes et Objets
class demo
main()
{
{
int num ; void f(int);
public : demo obj(7);
demo(int); for (int i=0; i<4; i++)
~demo(); f(i);
}; }
//------------------ //-------------------------------
demo::demo(int n) void f(int m)
{ { demo obj(m) ; }
num=n;
cout<<″Appel constr numéro : ″<<num<<endl;
}
//---------------------------------------------
demo::~demo()
{
cout<<″Appel destr numéro : ″<<num<<endl;
}
//-------------------------------------- 41
Classes et Objets
Autoréférence : le mot clé ‘this’
• Le mot clé ‘this’ utilisé uniquement au sein d’une fonction
membre désigne un pointeur sur l’objet l’ayant appelé.
class point
{
int x, y;
public :
point(int a=0,int b=0){ x=a; y=b; }
void affiche(){ cout<<"Point : "<<x<<" - "<<y<<"de
l’objet dont l’adresse est : "<<this<<endl; }
};
//------------------------------------------------------------
main()
{
point p1, p2(5,3), p3(6,70);
p1.affiche(); p2.affiche(); p3.affiche();
}
42
Classes et Objets
Membres statiques
• Lorsqu’on crée différents objets d’une même classe, chaque objet
possède ces propres données membres.
• Pour pouvoir partager des données entre objets de la même
classe, on les déclare statiques.
Les membres statiques existent en un seul exemplaire quelque soit le nombre
d’objets de la classe correspondante, et même si aucun objet de la même
classe n’a été créé.
Les membres statiques sont toujours initialisés par 0.
class point
{
static int compteurPoint;
int x;
int y;
………………;
………………;
43
};
Classes et Objets
Exercice
Ecrire un programme permettant de créer des objets ayant chacun :
• un tableau de 5 éléments de type entier en tant que donnée ;
• une fonction pour remplir le tableau, une fonction pour trier le
tableau et une fonction pour afficher le contenu du tableau en
tant que méthodes.
Exercice 2
Reprendre le même programme en remplaçant le tableau de 5
éléments par un tableau dynamique de ‘ne’ éléments et instancier
des objets ayant des tableaux dynamiques de différentes tailles.
44
Fonctions amies
En principe, l’encapsulation interdit à une fonction membre d’une classe
ou toute fonction d’accéder à des données privées d’une autre classe.
Mais grâce à la notion d’amitié entre fonction et classe, il est possible, lors
de la définition de cette classe d’y déclarer une ou plusieurs fonctions
(extérieurs de la classe) amies de cette classe.
Une telle déclaration d’amitié les autorise alors à accéder aux données
privées, au même titre que n’importe quelle fonction membre.
Il existe plusieurs situations d’amitiés :
1. Fonction indépendante, amie d’une classe.
2. Fonction membre d’une classe, amie d’une autre classe.
3. Fonction amie de plusieurs classes.
4. Toutes les fonctions membres d’une classe, amies d’une autre classe.
47
Fonctions amies
Pour déclarer une fonction amie d’une classe, il suffit de la déclarer dans
cette classe en la précédent par le mot clé ‘friend’.
1. Exemple de fonction indépendante amie d’une classe
class point
{ int x,y;
public :
point(int a=0,int b=0) {x=a; y=b;}
friend int coincide(point,point);
};//------------------------------------------
int coincide(point p1,point p2)
{ if(p1.x==p2.x && p1.y==p2.y) return 1; else return 0;
}//--------------------------
main()
{
point o1(15,2), o2(15,2), o3(13,25);
if(coincide(o1,o2)) cout<<"les objets coïncident\n";
else cout<<"les objets sont différents\n";
if(coincide(o1,o3)) cout<<"les objets coïncident\n";
else cout<<"les objets sont différents\n"; 48
}
Fonctions amies
2. Fonction membre d’une classe, amie d’une autre classe
class B;
class A
{
…………………
public :
friend int B::f(int,A);
};
//------------------------------------------------
class B
{
…………………
public:
int f(int,A);
};
//-----------------------------------------------------
int B::f(int,A)
{
…………………
………………
49
}
Fonctions amies
3. Fonction amie de plusieurs classes
Toute fonction membre ou indépendante, peut être amie de plusieurs classes.
class A
{
………………
public :
friend void f(A,B);
};//--------------------------------
class B
{
………………
public :
friend void f(A,B);
};//----------------------------
void f(A,B)
{
………
}
50
Fonctions amies
4. Toutes les fonctions d’une classe sont amies d’une autre classe
Au lieu de faire autant de déclarations de fonctions amies qu’il y a
de fonctions membres, on peut résumer toutes ces déclarations en
une seule.
Exemple
‘friend class B;’ déclarée dans la classe ‘A’ signifie que
toutes les fonctions membres de la classe ‘B’ sont amies de la
classe ‘A’.
Remarque
Pour compiler la déclaration de la classe ‘A’, il suffit de la faire
précéder de : ‘class B; ‘ Ce type de fonction évite d’avoir à
déclarer, les entêtes des fonctions concernées par l’amitié.
51
Fonctions amies
Exercice
Ecrire un programme permettant de réaliser le produit d’une matrice par un
vecteur à l’aide d’une fonction indépendante appelée ‘produit’ amie des
deux classes ‘matrice’ et ‘vecteur’.
La classe ‘vecteur’ possède :
- comme données : un vecteur de 3 éléments entiers.
- comme fonctions membres :
• Un constructeur à 3 valeurs entiers.
• Une fonction ‘affiche’ pour afficher le contenu du tableau (vecteur).
La classe ‘matrice’ possède :
- comme donnée : une matrice de 9 éléments (3x3).
- comme fonction membre : un constructeur ayant une matrice (3x3)
comme paramètre.
La fonction ‘produit’ retourne un objet de type ‘vecteur’ résultat du
produit d’une matrice par un vecteur. 52
Fonctions amies
Exercice
Objectifs:
•Créer des fonctions amies (friend)
•Gérer l'amitié entre une fonction membre et une classe
Énoncé:
L'objectif de cet exercice est de calculer le produit d'une martice par un vecteur en
utilisant les fonctions amies.
1.Créer les deux classes suivantes :
1. l’une nommée vecteur, permettant de représenter des vecteurs à 3
composantes ; elle comportera un constructeur et une fonction
membre affiche.
2. L’autre nommée matrice, permettant de représenter des matrices carrées de
dimension 3x3 ; elle comportera un constructeur avec un argument (tableau
de 3x3 valeurs) qui initialisera la matrice avec les valeurs et une fonction
membre affiche.
2.Réaliser une fonction indépendante permettant de fournir le vecteur
correspondant au produit d’une matrice par un vecteur.
3.Réaliser une fonction membre à la classe vecteur permettant de fournir le vecteur
correspondant au produit d’une matrice par un vecteur.
4.Ecrire un programme de test.
53
Fonctions amies
Exercice
On dispose d’un fichier nommé point.h contenant la déclaration suivante de
la classe point :
class point
{
float x, y ;
public :
void initialise (float abs=0.0, float ord=0.0) { x = abs ; y = ord ;}
void affiche () { cout << "Point de coordonnées : " <<x <<" "<< y<<"\n" ;}
float abs() { return x ;}
float ord() { return y ;}
};
Exemple:
Point operator + (point,point);
57
Surdéfinition des opérateurs
60
Surdéfinition des opérateurs
Possibilités et limites de surdéfinition des opérateurs en C++
Pluralité Opérateur Associativité
Binaire ( )͌ [ ] ͌ →͌ →
Unaire + - ++ -- ! & new͌ delete͌
Binaire */% →
Binaire +- →
Binaire << >> →
Binaire < <= > >= →
Binaire == != →
Binaire & (niveau bit) →
Binaire ^ (ou exclusif) →
Binaire || →
Binaire && →
Binaire | (niveau bit) →
Binaire =͌ += -= *= /= %= &= ^= |= <<= >>=
Binaire , →
͌ : opérateur devant être surdéfini en tant que fonction membre.
61
Surdéfinition des opérateurs
La Relation d’association
Une association représente une relation sémantique durable entre
deux classes. Les associations peuvent donc être nommées pour donner
un sens précis à la relation.
64
Relations entre Classes
La relation d’agrégation
Une agrégation est un cas particulier d’association non symétrique
exprimant une relation de contenance. Les agrégations n’ont pas besoin
d’être nommées : implicitement elles signifient «contient» ou «est
composé de».
65
Relations entre Classes
La relation de composition
Une composition est une agrégation plus forte signifiant « est composée
d’un » et impliquant :
– une partie ne peut appartenir qu’à un seul composite (agrégation non partagée)
– la destruction du composite entraîne la destruction de toutes ses parties (il
est responsable du cycle de vie de ses parties).
66
Relations entre Classes
La relation d’héritage
L’héritage est un concept
fondamental de la programmation
orientée objet. Elle se nomme ainsi car
le principe est en quelque sorte le même
que celui d’un arbre généalogique. Ce
principe est fondé sur des classes
«filles» qui héritent des caractéristiques
des classses «mères».
L’héritage permet d’ajouter des
propriétés à une classe existante pour
en obtenir une nouvelle plus précise. Il
permet donc la spécialisation ou la
dérivation de types.
67
Relations entre Classes
La relation d’héritage
L’héritage est une relation entre classes qui a les propriétés suivantes :
– si B hérite de A et si C hérite de B alors C hérite de A
– une classe ne peut hériter d’elle-même
– si A hérite de B, B n’hérite pas de A
– il n’est pas possible que B hérite de A, C hérite de B et que A hérite de C
– le C++ permet à une classe C d’hériter des propriétés des classes A et B
(héritage multiple). 68
Relations entre Classes
La relation d’héritage –Droits d'accès sur les membres hérités
70
Relations entre Classes
La relation d’héritage – Exemple
71
Relations entre Classes
La relation d’héritage – Conclusion :
72
Technique de l'héritage
Notion d’héritage
• L'héritage est un principe propre à la POO qui permet de créer une nouvelle
classe à partir d'une classe existante. La classe nouvellement créée, dite classe
dérivée, contient les attributs et les méthodes de la classe dont elle dérive,
auxquelles s’ajoutent de nouveaux attributs et de nouvelles méthodes propres
à la classe dérivée.
classes
Sans moteur A moteur dérivées ou
classes filles
Notion d’héritage
• La P.O.O. permet de définir de nouvelles classes (classes filles) dérivées de
classes de base (classes mères), avec de nouvelles potentialités. Ceci permettra
à l’utilisateur, à partir d’une bibliothèque de classes donnée, de développer
ses propres classes munies de fonctionnalités propres à l’application.
On dit qu’une classe fille DERIVE d’une ou de plusieurs classes mères.
void vecteur3::affiche3()
{affiche();cout<<"z = "<<z<<"\n";} // fonction membre de la classe vecteur
void main()
{
vecteur3 v, w;
v.initialise3(5, 4, 3);v.affiche3();// fonctions de la fille
w.initialise(8,2);w.hauteur(7);w.affiche();// fonctions de la mère
cout<<"*******************************\n";
w.affiche3();w.homothetie3(6);w.affiche3();// fonctions de la fille
getch() ;
}
76
Technique de l'héritage Exemple
class vecteur // classe mère
{
float x,y;
public: void initialise(float,float);
void homothetie(float);
void affiche();
};
void vecteur::initialise(float abs =0.,float ord = 0.)
{x=abs;y=ord;}
void vecteur::homothetie(float val)
{x = x*val; y = y*val;}
void vecteur::affiche()
{cout<<"x = "<<x<<" y = "<<y<<"\n";}
void main()
{
vecteur3 v, w;
v.initialise(5, 4, 3);v.affiche();
w.initialise(8,2); w.hauteur(7);
w.affiche();
cout<<"*******************************\n";
w.affiche();
w.homothetie(6);w.affiche();
getch() ;
}
78
Technique de l'héritage Exercices
A partir de l’exemple précédent, créer un projet. La classe mère sera considérée
comme une bibliothèque. Définir un fichier mere.h contenant les lignes suivantes :
Exercice :
Dans le programme principal précédent, mettre en œuvre des pointeurs de vecteur.
Remarque :
L’amitié n’est pas transmissible: une fonction amie de la classe mère ne sera amie
que de la classe fille que si elle a
été déclarée amie dans la classe fille.
79
Polymorphisme
Notion de polymorphisme
• Une classe dérivée peut fournir une nouvelle définition d’une méthode d'une
classe parent car elle peut avoir besoin de réagir différemment à l'appel de cette
méthode. Cette redéfinition substituera une méthode à une autre : c’est la
spécialisation.
• La notion de polymorphisme signifie que, la même opération pouvant se
comporter différemment sur différentes classes de la hiérarchie, il est
possible d'appeler la méthode d'un objet sans se soucier de son type intrinsèque.
Ceci permet de faire abstraction des détails des classes spécialisées d'une famille
d'objet, en les masquant par une interface commune (qui est la classe de base).
Velo
DeuxRoues
m_typePedale
m_tailleRoues
GetTypePedale()
m_couleur
virtual Accélérer()
m_poids
virtual Freiner()
m_nbVitesses virtual ChangerVitesse()
Moto
virtual Accélérer()
m_moteur
virtual Freiner() La fonction Accélérer() n’est pas la même
virtual ChangerVitesse() m_boiteVitesse
FairePlein() pour un Velo et une Moto. La redéfinition
GetCouleur()
AllumerClignotant() de cette fonction dans chacune des sous-
GetPoids()
virtual Accélérer() classes entraînera un comportement
virtual Freiner() différent suivant que le DeuxRoues est un
virtual ChangerVitesse() Velo ou une Moto. 80