Vous êtes sur la page 1sur 95

Université des Frères Mentouri – Constantine - 1

Faculté des ST - Département d'Electronique

Dr. Amina HAMEURLAINE


amina.hameurlaine@umc.edu.dz

2018/2019

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


A l'issu de ce cours, l'apprenant sera capable de:
 Connaitre les différents paradigmes de la programmation;
 Connaitre les principales différences entre le paradigme procédural et
orienté objet;
 Apprendre les concepts de base de la programmation orientée objet;
 Apprendre à implémenter des programmes orientés objet en C++.

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Pour pouvoir suivre ce cours avec succès, il faut au préalable:
 Maîtriser les notions de base de l’algorithmique;
 Maîtriser les notions de base de la programmation procédurale;
 Maîtriser les notions de base du langage C ou C++.

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Chapitre 1: Introduction générale
Chapitre 2: Elements de base du C++
Chapitre 3: Notions de base de la POO
Chapitre 4: Classe et Objet
Chapitre 5: Héritage et Polymorphisme

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE
Développement d’un logiciel

Cahier
Analyse
de charges

Conception
Client

Implémentation

Test

Livraison
Maintenance

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Développement d’un logiciel

Cahier  Etude des besoins des utilisateurs;


Analyse Reformulation du cahier des charges sous une
de charges
forme exploitable en conception.

 Définition de l'architecture logicielle;


Conception Définition du comportement de l'application.
Client

 Implémentation des fonctionnalités définies


Implémentation lors de phases de conception: Programmation.

 Vérification de conformité de l'application


Test avec le cahier des charges.

Livraison  comprenant toutes les actions correctives


Maintenance (maintenance corrective) et évolutives
(maintenance évolutive) sur le logiciel.

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Développement d’un logiciel

Cahier
Analyse
de charges
Méthodes et Langages de
Modélisation:
Conception SADT, SA-RT, MERISE, OMT,
UML, …
Client

Langages de Programmation:
Implémentation Fortran, C, Ada, SmallTalk, Java,
C++, …

Test

Livraison
Maintenance

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


 Langage de Programmation

 Un programme est une suite d'instructions permettant d'exécuter


des actions sur un ordinateur.
 Ces instructions sont écrites dans un langage dit "langage de
programmation".

=> Programmer consiste à construire un ensemble ordonné


d'instructions en utilisant un langage de programmation.

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


 Langage de programmation:

Un programme est écrit


Programme écrit en
dans un langage de
langage machine:
programmation :
Programme executable
Code source
Traduction:
Compilation/Interprétation

Tous les langages de programmation ont le même but: nous permettre de parler à
l'ordinateur plus simplement qu'en binaire.

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


 Classement des Langages de Programmation par
«niveau»:

En programmation, la notion
de « niveau » est relative.
Il n'existe pas de méthode
particulière qui permettrait de
déterminer objectivement si
un langage peut être
considéré de bas niveau ou
de haut niveau.

openclassrooms.com

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


 Le paradigme d'un langage:

 Il s’agit des différentes façons de raisonner et d’implémenter une


solution à un problème en programmation.
 Il existe au moins 20 paradigmes différents et chaque paradigme
amène une technique différente de programmation.
 les plus généraux paradigmes sont:
• La programmation impérative (procedurale)
•La programmation fonctionnelle
•La programmation logique
•La Programmation Orientée Objet (POO)

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


 Le paradigme d'un langage:
 La programmation impérative (procédurale):
Un programme impératif n’est rien de plus qu’une suite d’instructions. Il
peut donc être assimilé en quelque sorte à une recette de cuisine, il suffit
de lire les instructions et les exécuter les unes après les autres.
Exemples de langages : Assembleur, Pascal, C.

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


 Le paradigme d'un langage:
 La programmation fonctionnelle:
− Un programme est défini avec des fonctions pures.
− Le paradigme fonctionnel est basé sur l'idée d'évaluer une formule, et
d'utiliser le résultat pour autre chose.
− Tous les traitements sont faits en évaluant des expressions et en
faisant appel à des fonctions.
Exemples de langages: Lisp, Scala, Erlang, F#.

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


 Le paradigme d'un langage:
 La programmation logique:
− Le principe est de définir une liste de faits (axiomes) et de règles de
logique qui leur associent des conséquences.
− Utilisé pour les démonstrations automatiques de théorèmes.

Exemples de langages: ProLog, SQL.

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


 Le paradigme d'un langage:
 La programmation Orientée Objet (POO):
Le principe est ici de programmer des objets, qui représentent un concept,
un objet physique ou un ensemble de données et les actions qui lui sont
rattachées, plutôt que de ne voir ces ensembles uniquement d’un point de
vue procédural.
Exemples de langages: SmallTalk, Java, C++.

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


 Le paradigme d'un langage:

prolland.free.fr

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Programmation Procédurale V.s Programmation Orientée Objet

Données
Données
Traitements
Traitements
Données Traitements

Données Données

Traitements Traitements

 Un programme est composé de  Un programme est composé d’un


plusieurs procédures /fonctions qui ensemble d’objets qui contiennent:
effectuent un traitement sur des  des données ”internes”
données.  des traitements manipulant ces
 Les données et les traitements sont données.
séparés.  Les données et leurs traitements
 Il n’existe pas un lien directe sont regroupés dans une seule
(sémantique) entre les données et le entité: objet.
traitement: passage des arguments.

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Exemple: Calcule de surface d’un rectangle.

Problème: Programmation Procédurale

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Exemple: Calcule de surface d’un rectangle.

Problème: Programmation Procédurale

Traitement  Les données et leurs


traitements sont
séparés;
Le code n’est pas
lisible;
Données

Réutilisation très
difficile!

Passage des arguments

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Exemple: Calcule de surface d’un rectangle.

Problème: Programmation Procédurale

"Pourquoi le logiciel n'est-il pas comme le matériel ?


Pourquoi tout nouveau développement doit-il repartir de zéro ?
Il devrait y avoir des catalogues de modules logiciels, comme il y a des
catalogues de puces de circuits intégrés : pour construire un nouveau système,
on devrait commander des composants dans les catalogues et les combiner,
plutôt que de réinventer la roue à chaque fois....."

Bertrand Meyer – 2000


Conception et programmation par objets

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Exemple: Calcule de surface d’un rectangle.

Solution: Programmation Orientée Objet

Classe Rectangle
double largeur
double hauteur
double surface( )
rect1 {…..} rect3
largeur = 4 largeur = 5
Objets hauteur = 2
rect2 hauteur = 8

largeur = 3.2
hauteur = 4.2

rect1.surface( ); rect2.surface ( ); rect3.surface( );

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Exemple: Calcule de surface d’un rectangle.

Solution: Programmation Orientée Objet

Classe Rectangle  Les données et leurs


double largeur traitements sont
double hauteur regroupés;
double surface( )  Le programme est
rect1 {…..} rect3
plus lisible;
largeur = 4 => Modularité
largeur = 5
Objets hauteur = 2
rect2 hauteur = 8 Réutilisabilité
largeur = 3.2
hauteur = 4.2

rect1.surface( ); rect2.surface ( ); rect3.surface( );

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Approche Orientée-Objet

 Offre une manière claire de concevoir une architecture modulaire.


 Permet d'écrire des programmes facilement lisibles.
 Permet une maintenance et une évolution des logiciel plus aisée.

L’approche Orientée-objet permet de produire des


programmes plus claires et plus robustes.

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Approche Orientée-Objet

Conception Programmation

Langages de Langages de
Modélisation Programmation
Orientée-Objet Orientée-Objet

Exemple: UML Exemple: C++

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


UML: Unified Modeling Language
 Notion standard pour l’analyse et la conception des logiciels.
 Adapté à la modélisation de tous types de systèmes.
 Il s’agit d’un langage graphique de modélisation objet
permettant de spécifier, de construire, de visualiser et de
décrire les détails d’un système logiciel.
 UML définit neuf types de diagrammes divisés en deux catégories:

Diagrammes statiques: Diagrammes dynamiques:


structurels comportementaux
Diagramme de cas d’utilisation, Diagrammes d’activités,
Diagrammes de classes, Diagrammes de séquences,
Diagrammes d’objets, Diagrammes d’états-transitions
Diagrammes de composants, Diagrammes de collaborations.
Diagrammes de déploiements.
Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE
Langage C++
 Le langage C++ est une évolution du langage C avec plusieurs nouveautés.
 Il a été crée en 1983 par Bjarne Stroustrup, un informaticien originaire du
Danemark.
 Le C++ est un langage multi-paradigmes: on peut programmer de différentes
façons (procédurale, fonctionnelle, Orientée Objet).
 C’est l'un des langages de programmation les plus utilisés actuellement (très
populaire).
 Il est rapide, ce qui en fait un langage de choix pour les applications critiques
qui ont besoin de performances, les jeux vidéo par exemple.
 Il est portable: un même code source peut théoriquement être transformé
sans problème en exécutable sous Windows, Mac OS et Linux.
 Il existe de nombreuses bibliothèques pour le C++. Les bibliothèques sont
des extensions pour le langage.

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE
1 Encapsulation/Abstraction
Mieux organiser les
programme dans
le sens de la:
2 Héritage robustesse
modularité
lisibilité
maintenance

3 Polymorphisme

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


1 Encapsulation/Abstraction
Rectangle
double largeur
 L'encapsulation est le fait de pouvoir regrouper double hauteur
dans une seule et même entité des données double surface( )
(attributs) et des traitements qui agissent sur ces {…..}
données (méthodes) .
rect1 rect2
 Avec la notion d'abstraction on peut travailler avec largeur = 3.2
largeur = 4
des entités abstraites au lieux de travailler avec des hauteur = 2 hauteur = 4.2
descriptions détaillées des données.

rect3
Se focaliser sur l’essentiel, et cacher les détailles
largeur = 5
hauteur = 8

rect1.surface( ); rect2.surface ( ); rect3.surface( );

Interfaces
Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE
1 Encapsulation/Abstraction

 Pour utiliser une classe ou un nouveau type d’objet, nous n’avons


besoin d’en connaitre que l’interface d’utilisation qui prévue par le
programmeur .
=> Dissimuler les détailles d’implémentation interne (qu’il n’est pas
utile d’en connaitre).

Protection des données et du fonctionnement interne

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


1 Encapsulation/Abstraction

Programmeur Programmeur
Développeur Utilisateur

Interfaces

Méthodes visibles

Ecriture du programme: Utilisation du programme:


Définition des classes Utilisation des classes via leurs
Attributs + Méthodes objets

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


1 Encapsulation/Abstraction

Les droits d’accès:


Chaque attribut et chaque méthode d'une classe peut posséder son
propre droit d'accès. Il existe trois types de droits d'accès:
Accès public: l'attribut ou la méthode peut être appelé depuis
l'extérieur de la classe.
Accès privé: l'attribut ou la méthode ne peut pas être appelé depuis
l'extérieur de la classe.
Accès protégé: tout attribut ou méthode protégé(e) n'est accessible
que dans les descendants (les sous-classes).

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


2 Héritage

 L'héritage est un concept très important qui représente une part non
négligeable de l'intérêt de la programmation orientée objet.
 Il consiste à définir différents niveaux d'abstraction.
 L'héritage établit une relation de spécialisation/généralisation entre
les classes.
 Il permet de construire des classes (sous-classes) à partir de classes
existantes (classes mères, super classes, classes de bases).

Une sous-classe est une spécialisation d'une classe appelée sa


superclasse;
 une classe hérite des caractéristiques de sa superclasse : elle en
partage les attributs et les méthodes.

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


2 Héritage
Eviter la duplication
Généralisation
Classe A du code

Spécification
Attributs Organiser le code.

méthodes

Classe B Classe C

Exemples:
 une voiture est un véhicule (Voiture hérite de Véhicule) ;
un bus est un véhicule (Bus hérite de Véhicule) ;
un corbeau est un oiseau (Corbeau hérite d'Oiseau) ;
 un chirurgien est un docteur (Chirurgien hérite de Docteur).
Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE
3 Polymorphisme

Le polymorphisme est un mécanisme qui permet à une sous classe de


redéfinir une méthode dont elle a hérité tout en gardant la même
signature de la méthode.
 Grace a l'héritage, le même code pourra être appliqué a différentes
sous-classes .
 Grace au polymorphisme, le même code appliqué a différentes
sous-classes pourra avoir un comportement différent (propre a chaque
sou classe).
Exemple: Employé

Calcul_salaire()

secrétaire Ingénieur
Calcul_salaire()
Calcul_salaire()

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE
 Une classe est une structure regroupant les mêmes types de données et
les mêmes traitements d’une famille d'objets.
 Une classe présente une description abstraite d’un ensemble d’objets.
 Une classe est composée de plusieurs membres dont chacun soit:
un attribut : variable typée,
une méthode: ensemble d’instructions de traitement.

ClasseA

attribut1
attribut2
Attributs Attribut3
…..

méthode1()
Méthodes méthode2()
….

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Représentation C++
Représentation UML
class NomClasse {
private:
Classe A
type attribut1;
Attributs - attribut1: type
1.

type attribut2;
Droits d’accès - attribut2:type
protected:
+ public #attribut3: type
type attribut3;
- private
public: # protected +méthode1()
type Methode1(arguments) +méthode2()
{ // définition de la methode1 } Méthodes
type Methode2(arguments)
{ // définition de la methode2} Règle d’encapsulation:
}; Tous les attributs d’une classe
doivent toujours êtres privés (ou
projetés).

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Rectangle

class Rectangle { - hauteur: double


- largeur: double
private:
double hauteur; +surface()
double largeur;

public:
double surface ()
{ return hauteur * largeur; }
};

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Rectangle

class Rectangle { - hauteur: double


- largeur: double
private:
double hauteur; +surface()
double largeur;

public: Méthode = Fonction


double surface ()
{ return hauteur * largeur; }
};

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Il existe 2 types de méthodes .
 Des méthodes qui modifient l’ état de l’objet => Actions
 Des méthodes qui ne changent rien à l’objet => Prédicats

 Pour indiquer qu’une méthode est un prédicat, on utilise le mot clé


const.
Exemple:

public:
double surface () const
{ return hauteur * largeur; }

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Un objet est une instance d'une classe. Rectangle

class Rectangle { - hauteur: double


- largeur: double
private:
double hauteur; +surface()
double largeur; rect1
largeur = 4
hauteur = 2
public: rect2
double surface () const largeur = 3.2
{ return hauteur * largeur; } rect3 hauteur = 4.2

}; largeur = 5
hauteur = 8
Int main() {
Rectangle rect1;
rect1.hauteur = 2;
rect1.largeur = 4;
cout <<rect1.surface()<<endl;
}

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Problème!

class Rectangle {
private:
double hauteur;  Tous les attributs sont
double largeur; en mode privé!
On peut pas y accéder
public: depuis l’extérieur de la
double surface () const classe!!!!
{ return hauteur * largeur; }
};
Int main() {
 Comment faire pour les
Rectangle rect1;
initialiser alors??!!
rect1.hauteur = 2;
rect1.largeur = 4;
cout <<Rect1.surface()<<endl;
}

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Solution 1: Manipulateurs (setters) / Accesseurs (getters)

class Rectangle {
private:
double hauteur;
double largeur; Setter: Action qui permet:
public:  Modification des valeurs des attributs;
void setHauteur (double h) { hauteur = h; }
void setLargeur (double L) { largeur = L; }  Affectation des valeurs aux attributs.
double getHauteur () const { return hauteur ; }
=> Pas de retour .
double getLargeur () const { return largeur ; }
double surface () const  Gettre: Prédicat qui permet:
{ return hauteur * largeur; }  Consultation d’un attribut: lecture
}; seule.
Int main() {
Rectangle rect1; => Retour de la valeur d’un attribut.
rect1.setHauteur (2); rect1.setLargeur (4);
cout <<rect1.getHauteur()<<endl;
cout <<rect1.getLargeur()<<endl;
cout <<rect1.surface()<<endl;
}
Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE
Solution 2:

En c++, il y a des méthodes prédéfinies qui permettent d’initialiser


les attributs des objets.

Les Constructeurs

les constructeurs servent à construire les objet en mémoire.


Leur rôle principal est d'initialiser les attributs des objets.
 Ils sont appelés lors de la création des objets.
Un constructeur est une méthode sans aucun type de retour.

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Syntaxe C++
Il faut que le constructeur ait le même nom que la classe.
Le constructeur ne doit rien renvoyer, pas même void !

public:
nomConstructeur (arguments)
{ //Initialisation des attributs }

Ou:

public:
nomConstructeur (arguments) : initialisation1, initialisation2 //liste
//d'initialisations
{ } //le corp est vide

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Exemple:
class Rectangle { class Rectangle {
private: private:
double hauteur; double hauteur;
double largeur; double largeur;
public: public:
Rectangle (double h, double L) { ou Rectangle (double h, double L) : hauteur(h), largeur(L)
hauteur = h; { }
largeur = L; }
double surface () const double surface () const
{ return hauteur * largeur; } { return hauteur * largeur; }
}; };
Int main() { Int main() {
Rectangle rect1(2, 4); Rectangle rect1(2, 4);
cout <<Rect1.surface()<<endl; cout <<Rect1.surface()<<endl;
} }

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Exemple:
class Rectangle { class Rectangle {
private: private:
double hauteur; double hauteur;
double largeur; double largeur;
public: public:
Rectangle (double h, double L) { ou Rectangle (double h, double L) : hauteur(h), largeur(L)
hauteur = h; { }
largeur = L; }
double surface () const double surface () const
{ return hauteur * largeur; } { return hauteur * largeur; }
}; };
Int main() { Int main() {
Rectangle rect1(2, 4); Rectangle rect1(2, 4);
cout <<Rect1.surface()<<endl; cout <<Rect1.surface()<<endl;
} }

On appelle le constructeur Rectangle pour l’objet rect1 avec les paramètres 2 et 4


Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE
class Rectangle {
Attention! private:
double hauteur;
double largeur;
public:
Rectangle (double h, double L) : hauteur(h), largeur(L)
{ }
double surface () const
{ return hauteur * largeur; }
};
Int main() {
Rectangle rect1(2, 4);
Mais si on appelle le constructeur Rectangle rect2(6);
avec un seul paramètre ou bien Rectangle rect3;
sans mettre des paramètres?! Rectangle rect4(rect1); // constructeur de copie
cout <<Rect1.surface()<<endl;
cout <<Rect2.surface()<<endl;
cout <<Rect3.surface()<<endl;
}
Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE
class Rectangle {
private:
double hauteur;
Solution: double largeur;
public:
Rectangle (double h=0, double L=0) : hauteur(h),
Déclaration des constructeurs
largeur(L) { }
avec initialisation de 0. double surface () const
{ return hauteur * largeur; }
};
Int main() {
Rectangle rect1(2, 4);
Rectangle rect2(6);
Note: Rectangle rect3;
Rectangle rect4(rect1); // constructeur de copie
Un constructeur qui n’a pas de
cout <<Rect1.surface()<<endl;
paramètres s’appelle cout <<Rect2.surface()<<endl;
«constructeur par default ». cout <<Rect3.surface()<<endl;
}
Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE
 Le destructeur est une méthode appelée lorsque l'objet est supprimé de la
mémoire.
 Son rôle principal est de libérer la mémoire (via des delete) qui a été
allouée dynamiquement.
 Il porte le même nom que la classe;
 Il est appelé automatiquement `a la fin du programme.
~nomDestructeur()
{}

Ou: ~nomDestructeur(){
delete attribut1;
delete attribut2;
}

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


On peut définir des méthodes à l’extérieur de la classe.
La classe ne contient que des prototypes (déclaration seule);
Les détailles des méthodes sont à l’extérieur de la classe.
La définition de la méthode doit être reliée à la classe concernée en
utilisant l’operateur :: .
class NomClasse {
private:
type attribut1;
type attribut2;
public:
type nomMethode(arguments); // prototype de la methode1
};

Type NomClasse : : nomMethode(arguments)


{ // définition de la methode1
}
Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE
 On peut séparer la déclaration des classes et la définition des méthodes
dans des fichiers différents pour avoir un code plus modulaire.
 Pour chaque classe, on peut créer :
un header (fichier *.h) qui contiendra les attributs et les prototypes de
la classe ;
un fichier source (fichier *.cpp) qui contiendra la définition des
méthodes et leur implémentation.

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Exemple:
 Fichier (Rectangle.h) : déclaration de la classe Rectangle, ses attributs et
les prototypes de ses méthodes;

Dans les fichiers .h, il est recommandé


de ne jamais mettre la directive using
namespace std;
Pour les variables de type string, il faut
rajouter le préfixe std:: devant
chaque string du .h.
Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE
Exemple:
 Fichier (Rectangle.cpp):définitions des méthodes de la classe Rectangle.

On peut aussi rajouter ici


un using namespace std;.
On a le droit de le faire car on
est dans le .cpp.

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


 Il est possible que tous les objets d’une même classe partagent une ou
plusieurs données qui seront identiques pour tous ces objets.
=> attributs statiques
 Ils ressemblent à des variables globales dont la portée est limitée à cette
classe.
 Leur déclaration est précédée du mot-clé static.
 Leur initiation se fait en dehors de la déclaration de la classe.

class NomClasse {
private:
static type attribut1;
};

type NomClasse :: attribut1 = valeur;

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


class Rectangle {
Exemple:
private:
double hauteur; double largeur;
public:
static int nb_instances;
Rectangle (double h=0, double L=0) : hauteur(h), largeur(L)
{++ nb_instances;
cout <<" Rectangle "<<nb_instances << endl;
cout<<"la hauteur est: "<<h<<endl;
cout<<"la largeur est: "<<L<<endl;
cout<<endl; }
double surface () const { return hauteur * largeur; }
~ Rectangle () {
--nb_instances;
cout <<"Il reste " <<nb_instances <<" rectangle \n"; }
};
int Rectangle::nb_instances=0 ;
Int main() {
Rectangle rect1(2, 4);
Rectangle rect2(6);
Rectangle rect3; Orientée Objet en C++
Cours Programmation Dr. A.HAMEURLAINE
 une méthode statique est partagée par toutes les instances d’une même
classe.
 Au lieu d’être appelée avec un objet de la classe, elle est appelée avec le
nom de la classe.
 Elle ne peut pas accéder aux données membres d’un objet et elle ne peut
pas appeler une méthode non statique.
 Les méthodes statiques sont généralement utilisées pour manipuler les
données statiques.

class NomClasse {
public:
static type methode () { return variable ;}
};

type NomClasse :: attribut1 = valeur;

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


class Rectangle {
Exemple: private:
double hauteur; double largeur;
static int nb_instances;
public:
Rectangle (double h=0, double L=0) : hauteur(h), largeur(L)
{++ nb_instances;
cout <<"Rectangle "<<nb_instances << endl;
cout<<"la hauteur est: "<<h<<endl;
cout<<"la largeur est: "<<L<<endl;
cout<<endl; }
static int affiche () { return nb_instances; }
double surface () const { return hauteur * largeur; }
~ Rectangle () {
--nb_instances;
cout <<"Il reste " <<nb_instances <<" rectangle \n"; }
};
int Rectangle::nb_instances=0 ;
Int main() {
Rectangle rect1(2, 4);
Rectangle rect2(6);
Rectangle rect3;
cout<<" Nombre d’objets crees = "<<Rectangle :: affiche ()<< endl;
} Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE
 Une fonction extérieure à une classe A (fonction globale ou fonction
membre d’une autre classe) peut être déclarée amie de classe A.
=> toutes les données et méthodes membres de cette classe
(privées/publics) deviennent accessibles pour cette fonction.
 Une même fonction peut être amie de plusieurs classes.
 La déclaration d’une fonction comme amie à une classe A doit être faite à
l’intérieur de la classe A en utilisant le mot-clé friend.
 Seules les fonctions déclarées amies à l’intérieur d’une classe peuvent
accéder à cette classe: contrôle d’accès.

class ClasseA {
…..
puclic:
friend type nomFonction (arguments); //fonction amie globale
friend type ClasseB :: nomMethode (arguments); //fonction amie membre d’une classe B
};

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


 Une classe A peut être déclarée amie d’une classe B
=>tous les membres de la classe B deviennent accessibles pour la
classeA.

class ClasseA {
…..
};
class ClasseB {
….
puclic:
friend class ClasseA; //ClasseA est amie de ClasseB
};

Note:
si la classe A est amie de la classe B, ¸ca ne veut pas dire
que B est amie de la classe C.

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


L’association est une relation structurelle précisant que les objets d’une
classe sont reliés aux objets d’une autre classe.
Elle est représentée par un attribut.
Elle est définie par : un rôle et une multiplicité.

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE
 L'héritage entre classes symbolise les relations hiérarchiques entre les
concepts.
 Si une classe B hérite d'une classe A, on dit A est la classe mère et B la
classe fille.
 La classe B hérite des attributs et des méthodes de la classe A.
 Un objet de la classe B est aussi un objet de la classe A.
 on dit aussi que B dérive de A ou encore que B est dérivée de A.
 La relation d'héritage est une relation de généralisation-spécialisation :
B est une spécialisation de A et A est une généralisation de B.
Classe A
Classe mère

Classe B Classe C

Classe fille Classe fille


Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE
 Une super-classe :
 est une classe mère (ou parent);
 déclare les attributs/méthodes communs;
 peut avoir plusieurs sous-classes.
 Une sous-classe :
 est une classe fille (ou enfant);
 hérite des attributs et des de la super-classe;;
 peut avoir une ou plusieurs sous-classes.

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Syntaxe C++
class NomSousClasse : public NomClasseMere {
};

Exemple: la classe Rectangle est une sous-classe de la classe Forme .

class Forme { };
class Rectangle : public Forme { };

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


 Les sous classes ne peuvent accéder qu’aux Classe A
données membres publics et protégées - attribut1: type
(protected) de la classe mère. - attribut2:type
Les méthodes des sous classes n’ont pas #attribut3: type
accès aux membres privés de la classe
+méthode1()
mère. +méthode2()
Les membres protégés sont accessibles
uniquement par les objets de la
même classe et par tous les objets Classe B Classe C
des sous-classe.

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Syntaxe C++:

class NomClasse Mere{


protected:
type attribut1;
type attribut2;
public:
type Methode1(arguments) { }
type Methode2(arguments) { }
};
class NomSousClasse : public NomClasseMere {
…..
};

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Exemple:

class Polygone {
protected:
double hauteur;
double largeur;
public:
void set_values (double h, double L) { hauteur=h; largeur=L; }
};
class Rectangle : public Polygone {
double surface () const { return hauteur * largeur; }
};
class Triangle : public Polygone {
double surface () const { return largeur* hauteur / 2; }
};

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


 Héritage public : l'accès à la classe mère peut être effectué partout
dans le code.
 Héritage privé (private ): l'accès à la classe mère est effectué
«uniquement» dans la classe fille .
 Héritage protégé (protected ): l'accès à la classe mère est effectué
dans la classe fille ainsi que toute ses classes dérivées.

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Exemple:

class ClasseA {……};


class ClasseB : public ClasseA {…..};
class ClasseC : protected ClasseA {…..};
class ClasseD : private ClasseA {…..};

int main () {
ClasseB b; ClasseC c; ClasseD d; Classe A * ptr;
ptr = &B; // OK
ptr = &C; // Erreur (ca ne marchera que dans C et toutes ses dérivées)
ptr = &D; // Erreur (ca ne marchera que dans D
}

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


 A la construction d'une classe fille, le constructeur de la classe mère est
appelé avant tout autre chose.
le constructeur de la classe dérivée appelle le constructeur par défaut
(constructeur sans paramètres) de la classe de base.
 Dans le cas d’un constructeur avec paramètres, le constructeur de
base est exécuté en premier.
 Lors de la destruction d'un objet d'une classe dérivée, le destructeur de la
classe mère est appelé automatiquement après le destructeur de la classe
fille.
=> Les appels aux destructeurs se font dans l'ordre inverse des appels
aux constructeurs.

NomConstructeur_sousClasse (parameters) : NomConstructeur_ClasseMere


(parameters) {...}

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Exemple:

class ClasseA {
…..
Public:
ClasseA () { cout << “constructeur sans paramètres - constructeur par défaut" <<endl; }
ClasseA (int a) { cout << " constructeur avec un paramètre " <<endl; }
~ ClasseA () {cout << " Destructeur " <<endl; }
};
class ClasseB : public ClasseA {
…..
Public:
ClasseB (int a) : ClasseA (a) { cout << " constructeur avec un paramètre " <<endl; }
~ ClasseB () {cout << " Destructeur " <<endl; }
};

int main () {
ClasseB b(1);
}
Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE
 Une classe peut hériter des attributs et des
méthodes de différentes classes de base.
Syntaxe: Classe A Classe B

class ClasseC : public ClasseA, public ClasseB {


…..
};
Classe C

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


 Le polymorphisme est un mécanisme qui permet à une sous classe de
redéfinir une méthode dont elle a hérité tout en gardant la même signature de la
méthode.

Grace à l'héritage, le même code pourra être appliqué aux différentes sous-
classes .

Grace au polymorphisme, le même code appliqué aux différentes sous-


classes pourra avoir un comportement différent.

 Le polymorphisme représente la capacité du système à choisir


dynamiquement la méthode qui correspond au type de l’objet en cours de
manipulation.

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Exemple 1: Héritage simple

Chaque classe affiche un


message différent.

Ceci est un vehicule.


Ceci est une moto.
Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE
 Problème: Résolution statique des liens

Pour le compilateur, à l'intérieur de la


fonction, on manipule un Vehicule.
appeler la « version Vehicule» de
la méthode afficher() et pas la «
version Moto» .
 C'est le type de la variable qui
détermine quelle fonction membre
appeler et non sa vraie nature.
résolution statique des liens

 comportement non polymorphe

Ceci est un vehicule.


Ceci est un vehicule.
Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE
 Solution: Résolution dynamique des liens.

Lors de l'exécution, le programme doit utilises la bonne version des méthodes


=> il doit savoir si l'objet est de type mère ou de type fille.
 => Il faut utiliser des méthodes virtuelles + des références / pointeurs.

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


 Méthode virtuelle et référence:
L’utilisation de méthodes virtuelles avec les références permet d’exprimer des
différences de comportement entre des classes de la même famille.
=> Ces différences sont ce qui engendre un comportement polymorphe.

class Vehicule{
....
public:
virtual void afficher( );
….
};

void presenter(Vehicule &v )
// ou :
// void presenter(Vehicule const&v )
{ v.afficher ( ); }

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


En utilisant des fonctions
virtuelles ainsi qu'une référence sur
l'objet, la fonction presenter() peut
correctement choisir la méthode à
appeler.
résolution dynamique des liens
Un même morceau de code a eu
deux comportements différents
suivant le type passé en argument.
 comportement polymorphe

Ceci est un vehicule.


Ceci est une moto.
Méthode virtuelle et pointeurs

Ceci est un vehicule.


Ceci est une moto.
 Méthode virtuelle et pointeur

Un même morceau de code a eu


deux comportements différents
suivant le type passé en argument.
 comportement polymorphe

openclassrooms.com

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Les fonctions virtuelles pures:
 Problème:

 Les voitures ont 4 roues et les motos


2 mais, pour un véhicule en général,
on ne peut rien dire !
 si on ne déclare pas la fonction dans
la classe mère, alors on ne pourra pas
l'utiliser depuis notre collection
hétérogène!

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Les fonctions virtuelles pures:
Solution: Fonction virtuelle pure.

 Si l'on ne sait pas quoi mettre dans le corps d'une méthode de la classe
mère, on peut la déclarer virtuelle pure.
 Une fonction membre est dite virtuelle pure lorsqu’elle est déclarée de la
façon suivante : virtual type nomMethode(paramètres) = 0;
une méthode virtuelle peut être redéfinie dans une classe fille .
une méthode virtuelle pure doit être redéfinie dans une classe fille.

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Les fonctions virtuelles pures:
Exemple:

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Les Constructeurs:

Un constructeur ne peut pas être virtuel: il sait quel type d’objet il va
construire.
=> pas besoin de résolution dynamique ses liens.
On ne peut pas appeler de méthode virtuelle dans un constructeur.

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


2. Les Destructeurs:
Un destructeur doit toujours être virtuel si on utilise le polymorphisme.
Exemple:

Quel destructeur va
être appelé? !

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


2. Les Destructeurs:
Un destructeur doit toujours être virtuel si on utilise le polymorphisme.
Exemple:

C'est le destructeur de Vehicule qui va être appelé et pas celui


de Voiture!

=> Il faut appeler le bon destructeur!!!


Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE
Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE
 Pour avoir une liste de différents types d’objets, il faut utiliser un tableau
dynamique de pointeurs « vector ».
Exemple:

Note:
Il ne faut pas
oublier d’inclure
la bibliothèque
<vector>

Ceci est une voiture avec 5 portes et coutant 15000 euros.


Ceci est une moto allant a 212.5 km/h et coutant 2000 euros.
 Une classe qui possède au moins une méthode virtuelle pure est une classe
abstraite.
 Une classe abstraite ne peut pas être instanciée : on ne peut créer d’objet à
partir d’une classe abstraite.

Exemple:

 Classe Vehicule: si on pouvait créer un objet Vehicule, alors on pourrais


essayer d'appeler la fonction nbrRoues() qui n'a pas de corps et ceci n'est
pas possible.

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Exemple:

l'appel à la méthode
nbrRoues() est
polymorphique: pointeur +
méthode virtuelle.
=> C'est la « version Voiture»
qui est appelée, même si la
«versionVehicule» n'existe
pas.
Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE
 « Apprendre le C++ », M. Hamemerchmidt.
 « Apprendre le C++ », C. Delonnoy.
 « Programmation en Langage C++ : Cours et Travaux Pratiques », B.
Boukhezzar.
 http://www.cplusplus.com/doc/tutorial/
 https://openclassrooms.com/courses/programmez-avec-le-langage-
c/qu-est-ce-que-le-c-2
 https://fr.coursera.org/learn/cpp-poo
 http://carl.seleborg.free.fr/cpp/cours/index_cours.html

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE