Vous êtes sur la page 1sur 178

Programmation Orientée objet

en C++

Par Dr. CHAIBI Hasna


Plan

Dr. H.CHAIBI

Introduction à La POO
• Les concepts Fondamentaux de la POO
• Introduction au Langage C++ :
• La POO en C++
• Classe,
• objets,
• Notion de constructeur/Destructeur,
• Encapsulation en C++
• Surcharge d’opérateurs
• Héritage en C++
EHTP 2019/2020

• Polymorphisme en C++
• Entrée/Sortie en C++
• Programmation générique en C++
• Gestion des Exceptions en C++
Introduction
Dr. H.CHAIBI

• Au début, on codait une liste d’instructions que l’ordinateur exécutait


de façon linéaire, comme une recette de cuisine : c’est
la programmation procédurale. Elle est utilisée, par exemple, dans les
langages Fortran, C, Pascal ou Perl.

• Puis on est passé à la programmation orientée objet où l’on crée et


utilise des objets qui communiquent entre eux. Comme dans les
langages Java, Python, C#, PHP, C++, Ruby, Swift ou l’Objective-C.
EHTP 2019/2020
Introduction
Dr. H.CHAIBI

• Programmation procédurale : P.P. (Pascal, C, Fortran, etc.)


Contient simplement une série d'étapes à réaliser. N'importe
quelle procédure (fonction) peut être appelée à n'importe quelle étape
de l'exécution du programme.

• Programmation orientée objet : P.O.O. (C++, Java, Delphi)


Concevoir une application comme un système d’objets interagissant
entre eux
EHTP 2019/2020
Programmation procédurale (rappel de C)
Dr. H.CHAIBI

• Le programme est composé des fonctions

• Les données (variables) sont créées à l’intérieure


des fonction ou bien passées comme paramètres

• Les données et les traitement (fonctions ou


EHTP 2019/2020

modules) sont séparées


Programmation procédurale (rappel de C)
• Pour réaliser un logiciel avec le langage C, on
Dr. H.CHAIBI

commence par identifier les fonctions


principales et les structures de données
manipulées par ces fonctions. Ces fonctions
principales pourront ensuite être «
découpées » en fonctions auxiliaires afin de
simplifier leur conception.

• Les modifications d’une fonction entraînent


d’autres modifications dans autre fonctions.

• La portée d’une modification est trop grand


et difficile à gérer.
EHTP 2019/2020

• Redondance dans le code (la même chose


est codé plusieurs fois)

• Propagation des erreurs– déboggage difficile


Programmation Orientée Objet (POO)

• La POO est une nouvelle façon d’organiser le code source, elle permet de le
Dr. H.CHAIBI

simplifier et de l’éclaircir; afin que d’autres personnes qui n’ont pas assistés
à sa conception, puissant l’utiliser;

• 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


EHTP 2019/2020

pendant la conception (comme en UML)


Programmation Orientée Objet (POO)
Dr. H.CHAIBI

La programmation orientée objet (POO) :

• Permet de créer des entités (objets) que l'on peut manipuler .

• Impose des structures solides et claires.

• Les objets peuvent interagir entre eux, cela facilite grandement la


EHTP 2019/2020

compréhension du code et sa maintenance.


Programmation Orientée Objet (POO): Objet

• Dans la programmation orientée objet, on regroupe au sein d’une même entité


Dr. H.CHAIBI

les données et les moyens de traitement de ces données .

• Une telle entité s’appellera un objet

Objet: entité identifiable du monde réel pouvant avoir ou pas une existence
physique. Exemples : chien, table, personne, compte Bancaire…

• Un objet possède trois composantes :


+ identité (adresse mémoire),
EHTP 2019/2020

+ état (attributs), Personne1 Personne2 Chien1 Chien2


Ahmad Alex 2 ans 8 mois
+ comportement (Méthodes) 7 ans 26 ans champolis pitbull
Parler() Parler() Courir() Courir()
Jouer() Jouer() Aboyer() Aboyer()
Programmation Orientée Objet (POO): Classe
Dr. H.CHAIBI

• Des objets ayant des propriétés communes (attributs et méthodes)


sont alors regroupés dans une structure abstraite appelée classe.
• Les valeurs sont différentes pour chaque objet
EHTP 2019/2020

Class Chien { ….. }

Class Personne{ …. }
Programmation Orientée Objet (POO): Instanciation
Dr. H.CHAIBI

Instanciation
• L’instanciation est l’opération qui consiste à créer un objet à partir d’une
classe

Objet= instance d’une classe


EHTP 2019/2020
Les concepts de la POO
Dr. H.CHAIBI

La programmation orientée objet offre quatre concepts

• Encapsulation

• Abstraction

• Héritage
EHTP 2019/2020

• Polymorphisme
Les concepts de la POO

Notion d’encapsulation
Dr. H.CHAIBI

Principe d’encapsulation

Regrouper des attributs et les méthodes au sein d’une


même classe. Classe
Rectangle
Exemple : la classe Rectangle encapsule les attributs hauteur, et
largeur et la méthode surface(). -Hauteur données
-Largeur (Attributs)

• Pour améliorer la lisibilité des programmes, les attributs Traitement


encapsulés sont souvent privés (inaccessibles aux autres +Surface() (Méthodes)
classes)
EHTP 2019/2020

• Les données et méthodes accessibles sont dites


publiques
Les concepts de la POO

Notion d’encapsulation
Dr. H.CHAIBI

Principe d’encapsulation

Principe interdisant l’accès direct aux attributs. On ne dialoguera avec


l’objet qu’à travers une interface définissant les services accessibles aux
l’utilisateurs de l’objet. Ce sera le rôle des méthodes.
EHTP 2019/2020
Les concepts de la POO

Notion d’encapsulation
Dr. H.CHAIBI

Visibilité des attributs et méthodes :

• Un attribut ou une méthode sont dits privés si leur utilisation est interdite
en dehors de la classe.

• Un attribut ou une méthode sont dits publics si leur utilisation est autorisée
en dehors de la classe.
• Ce choix s’effectue lors de la déclaration de la classe.
EHTP 2019/2020

• La partie publique est appelée interface car tout le monde peut y accéder,
Les concepts de la POO

Notion d’encapsulation
Dr. H.CHAIBI

Le principe d’encapsulation est donc de déclarer :

Les attributs de façon privée.


Les méthodes de façon publique.

Cependant, dans certains cas particuliers, on contreviendra à ce


EHTP 2019/2020

principe en imposant une visibilité différente de celle par défaut.


Les concepts de la POO

Notion d’encapsulation
Dr. H.CHAIBI

Accès aux attributs

• Une question naturelle se pose alors : comment accéder aux attributs si ceux-ci sont
déclarés de façon privée ?
• La réponse est : par l’intermédiaire de méthodes bien particulières, les « getter » et les
«setter ».

Getter
• Il s’agit de méthodes publiques dont le rôle est de « retourner » la valeur d’un attribut.

Setter
EHTP 2019/2020

• Il s’agit de méthodes publiques permettant de modifier le contenu d'une donnée


membre protégée.
Les concepts de la POO

Notion d’encapsulation
Dr. H.CHAIBI

Exemple : on ne peut accéder à l’attribut “solde” que via la méthode


“afficher solde”.
EHTP 2019/2020
Les concepts de la POO

Notions d’abstraction
• Le processus d’abstraction consiste à identifier pour un ensemble
Dr. H.CHAIBI

d’éléments:
+ des caractéristiques communes
à tous les éléments
Abstraction

+ des mécanismes communes


à tous les éléments
EHTP 2019/2020

• Consiste à ne retenir que les propriétés


(attributs et méthodes) pertinentes d’un objet pour un problème précis.
Les concepts de la POO

Notion d’abstraction
Dr. H.CHAIBI

Abstraction
EHTP 2019/2020
Les concepts de la POO

Héritage
Dr. H.CHAIBI

Principe : Regrouper les classes partageant des attributs et des opérations et les
organiser en arborescence
EHTP 2019/2020
Les concepts de la POO

Héritage
Dr. H.CHAIBI

• Les éléments spécialisés héritent de la structure et du comportement


des éléments plus généraux
EHTP 2019/2020
Les concepts de la POO

Héritage
Dr. H.CHAIBI

Les deux visions de l’héritage :

• Spécialisation : on étend les propriétés d’une classe à des sous-


classes plus spécifiques. Cela permet donc la réutilisation de modèles
déjà existants.

• Généralisation : on factorise les propriétés communes d’un ensemble


de classes dans une super-classe plus abstraite. Cela permet de
EHTP 2019/2020

gagner en généricité.
Les concepts de la POO

Héritage
Dr. H.CHAIBI

• Héritage : est l'association entre deux classes permettant d'exprimer que l'une
est plus générale que l'autre et implique une transmission automatique des
propriétés (attributs et méthodes) d'une super-classe à une sous-classe .
EHTP 2019/2020
Les concepts de la POO

Héritage
Dr. H.CHAIBI

Deux intérêts majeurs :

1. On construit une hiérarchie de classes. On évite ainsi des


répétitions dans le code, en encourageant la réutilisation de
classes déjà existantes.

2. Cela permet de simplifier la conception de la modélisation.


EHTP 2019/2020
Les concepts de la POO

Héritage Multiple
Dr. H.CHAIBI

• l’héritage multiple: une classe peut hériter les comportements et les


fonctionnalités de plus d'une super-classe.
EHTP 2019/2020
Les concepts de la POO

Héritage Multiple
Dr. H.CHAIBI

• Le principal problème rencontré est la présence de différentes


implémentations par les super-classes d'une certaine classe pour une
même déclaration.
• L'héritage multiple génère parfois des erreurs de compilation.
EHTP 2019/2020
Les concepts de la POO

Polymorphisme
Dr. H.CHAIBI

C’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.
EHTP 2019/2020
Les concepts de la POO

Polymorphisme
• Exemple 1
Dr. H.CHAIBI

• L’appel de la méthode « jouer » sur tous les objets héritant de la


EHTP 2019/2020

classe « musicien » produira un résultat différent selon la sous classe.


Les concepts de la POO

Polymorphisme
Dr. H.CHAIBI

• Exemple 2
EHTP 2019/2020
Dr. H.CHAIBI

La programmation orientée objet en C++


EHTP 2019/2020
Introduction à C++
Dr. H.CHAIBI

• Fait partie des langages de programmation les plus utilisés


• Portable : même code source peut être transformé sans problème en
exécutable sous Windows, Mac OS et Linux.
• Fait partie des langages de programmation orientée objet.
• C'est une évolution du langage C.
• Un langage bas niveau : plus proche du fonctionnement de la
machine (binaire) : vous donne plus de contrôle sur ce que vous faites
EHTP 2019/2020
Introduction à C++
• Le langage C++ est un surensemble de C et repose sur les mêmes
Dr. H.CHAIBI

mécanismes d’écriture et de génération :

• Déclarations préalables et obligatoires.

• Prototypages des fonctions obligatoires.

• Exploitation de toutes les fonctionnalités du préprocesseur C pour les


inclusions de fichiers, code conditionnel, macro définitions, etc.
EHTP 2019/2020

• La syntaxe du C++ est 95 % de C et 5 % d’ajouts.


Les outils nécessaires au programmeur
Dr. H.CHAIBI

Environnement de Développement Intégré (IDE)

Un éditeur de texte Un compilateur Débogueur


EHTP 2019/2020

un éditeur de texte intelligent pour transformer pour vous aider à


qui colore tout seul le code, ce votre code source traquer les erreurs
qui vous permet de vous y en binaire. dans votre programme
repérer bien plus facilement
C et C++
Dr. H.CHAIBI

Programme .C
EHTP 2019/2020

Programme .C++
Déclaration, définition et utilisation d’une classe
Dr. H.CHAIBI

En C++, la programmation d’une classe se fait en trois phases :


1. Déclaration
C’est la partie interface de la classe. Elle se fait dans un fichier dont le nom se
termine par .h
2. Définition
C’est la partie implémentation de la classe. Elle se fait dans un fichier dont le nom
se termine par .cpp Ce fichier contient les définitions des fonctions-membres de la
classe, c-à-d le code complet de chaque fonction.
3. Utilisation
EHTP 2019/2020

Elle se fait dans un fichier dont le nom se termine par .cpp contenant le traitement
principal (fonction main),
Structure d’un programme en C++
Dr. H.CHAIBI
EHTP 2019/2020
Phase de déclaration
Dr. H.CHAIBI

• Déclaration d’une classe


EHTP 2019/2020
Phase de définition
Dr. H.CHAIBI

• Définition d’une classe


Définitions des fonctions-membres
de la classe
La définition d’une fonction-membre
on doit ajouter <nom de la classe> ::
devant le nom de la fonction
EHTP 2019/2020

Syntaxe :
Type de retour nom de la classe :: nom de la fonction( Paramètre)
Phase de manipulation
Dr. H.CHAIBI

• L’utilisation des classes


Se fait dans un fichier dont le nom se termine par
.cpp, Ce dernier fichier contient la fonction main, et
c’est par cette fonction que commence l’exécution
du programme.
Syntaxe :
MaClasse monObjet;
EHTP 2019/2020

monObjet.MonAttribut = valeur ;

monObjet.MaMéthode() ;
Style d’écriture
• La première lettre du nom de la classe en majuscule
Dr. H.CHAIBI

class Nombre
• Les noms des méthodes en minuscules (tout au moins la première
partie si le nom est composé),
char* lireNom( )
• Le caractère _ comme premier caractère du nom d'une donnée
membre
void ecrireValeur(int _valeur, int _position)
EHTP 2019/2020

• La liste des membres publics en premier,


Exercice1: Classe Compte
Dr. H.CHAIBI

I. Écrire un programme en C++ utilisant une classe Compte définie par


les attributs suivants :
Num_compte (de type int)
Solde (de type float)
Définir les fonctions membres suivantes:
déposer(float montant) qui permet de déposer un montant s’ajoutant
au solde du compte (la fonction ne renvoie rien).
Retirer( float montant) qui permet de retirer un montant, (retourne 1
si le montant est retiré et 0 sinon)
EHTP 2019/2020

AfficherSolde(): une fonction qui permet d’afficher le solde du compte


Instanciation d’objets
Dr. H.CHAIBI

• En C++, il existe deux façons de créer des objets, c'est-à-dire d'instancier


une classe :

de façon statique

de façon dynamique


EHTP 2019/2020
Instanciation d’objets
Dr. H.CHAIBI

La création statique d'objets


Consiste à créer un objet en lui affectant un nom, de la même façon
qu'avec une variable :

La syntaxe: Nom_Classe Nom_Objet;

Exemple:
EHTP 2019/2020
Instanciation d’objets
Dr. H.CHAIBI

La création dynamique d'objet


Est une création d'objet par le programme lui-même en fonction de ses « besoins »
en objets.
La création d'objet dynamique se fait donc par la procédure suivante :

Définition d'un pointeur vers une classe donnée


Création de l'objet « dynamique » grâce au mot clé new, renvoyant l'adresse
de l'objet nouvellement créé
Affecter cette adresse au pointeur
EHTP 2019/2020

• Exemple:
Instanciation d’objets
Dr. H.CHAIBI

La suppression de l’objet dynamique


Tout objet créé dynamiquement, devra impérativement être détruit à
la fin de son utilisation grâce au mot clé delete.

La suppression de l’objet statique


Les objets créés de façon statique n'ont pas besoin d'être détruits, ils
sont automatiquement supprimés lorsque le programme ne fonctionne
plus dans la portée dans laquelle ils ont été définis.
EHTP 2019/2020
Instanciation d’objets
Dr. H.CHAIBI

 Durée de vie de l’objet


• Cas d’une déclaration statique • Cas d’une déclaration dynamique
 L’objet a une durée de vie associée  Durée de vie illimitée, il faut donc
à la structure dans laquelle il est penser à le détruire ! Dans le cas
déclaré (identique à une variable contraire, des fuites mémoire vont
classique) apparaître.
EHTP 2019/2020
Instanciation d’objets
Dr. H.CHAIBI

 Durée de vie de l’objet

• L’objet est déclaré de manière statique, il


vit entre la parenthèse ouvrante et la
prochaine fermante. Ensuite il est
automatiquement détruit
EHTP 2019/2020
Instanciation d’objets
Dr. H.CHAIBI

 Durée de vie de l’objet

• L’objet est déclaré de manière dynamique,


il vit jusqu’à ce qu’on le détruise

Ici nous avons une fuite mémoire car l’objet


n’est jamais détruit!!!
EHTP 2019/2020
Instanciation d’objets
Dr. H.CHAIBI

 Durée de vie de l’objet

• On détruit l’objet par l’action delete


EHTP 2019/2020
Instanciation d’objets
Dr. H.CHAIBI

 Accès aux données membres d'un objet

• Déclaration statique • Déclaration dynamique


 Accès aux méthodes et aux Accès aux méthodes et aux attributs
attributs à l’aide du séparateur « . » à l’aide du séparateur «→ »
EHTP 2019/2020
Exercice1: Classe Compte (instanciation)
Dr. H.CHAIBI

II. Instancier statiquement un objet « Cpt1» de la classe Compte.


1. Ajouter le montant 3000DH au solde de votre objet Cpt1 de la classe Compte
2. Retirer le montant 500DH du solde de votre objet Cpt1
3. Afficher le nouveau solde de l’objet Cpt1

III. Instancier dynamiquement un objet « Cpt2» de la classe Compte.


1. Ajouter le montant 700DH au solde de votre objet Cpt2 de la classe Compte
EHTP 2019/2020

2. Retirer le montant 200DH du solde de votre objet Cpt2


3. Afficher le nouveau solde de l’objet Cpt2
Constructeur
• Nous avons vu comment déclarer une classe et instancier ses objets
Dr. H.CHAIBI

• Mais comment peut-on initialiser les attributs (i.e. leur attribuer des
valeurs) ?
Première solution : affecter individuellement une valeur à chaque attribut
• Ceci est une mauvaise solution dans le cas général : si le nombre d’attributs
est élevé, ou si le nombre d’objets créés est grand (rectangles r[0], r[1], ...,
r[99]) elle est fastidieuse et source d’erreurs (oublis)
Deuxième solution : définir une méthode dédiée à l’initialisation des
attributs
EHTP 2019/2020

• En fait, C++ fait déjà le travail pour vous en fournissant des méthodes
particulières appelées constructeurs
Constructeur
Dr. H.CHAIBI

• Un constructeur est une méthode qui sera appelée automatiquement


après la création d’un objet, ne retourne pas de résultat et permet
d’instancier un objet et initialiser ses attributs

• Un constructeur est une fonction-membre déclarée du même nom


que la classe, et sans type de retour :
EHTP 2019/2020

NomClasse (paramètres);
Constructeur
Dr. H.CHAIBI

• Les constructeurs sont donc des méthodes (presque) comme les


autres

• que l’on peut surcharger ; Dans une classe, il peut y avoir plusieurs
constructeurs à condition qu’ils diffèrent par le nombre des
paramètres.
EHTP 2019/2020
Constructeur
Dr. H.CHAIBI

L’utilité principale du constructeur est d’effectuer des initialisations pour


chaque objet nouvellement créé.

1. Constructeur par défaut


2. Constructeur d’initialisation
3. Constructeur de copie
EHTP 2019/2020

4. Constructeur par défaut par défaut


Constructeur par défaut
Dr. H.CHAIBI

Constructeur par défaut est un constructeur sans paramètre.


La syntaxe de sa déclaration : NomClasse();

Déclaration Définition Utilisation


EHTP 2019/2020
Constructeur d’initialisation
Dr. H.CHAIBI

• Un constructeur avec paramètre.


• La déclaration avec initialisation d’un objet se fait comme pour une
variable ordinaire.
La syntaxe de sa déclaration: NomClasse (valarg1, ..., valargN);

Déclaration Définition Utilisation


EHTP 2019/2020
Constructeur de copie
Dr. H.CHAIBI

• Le rôle du constructeur de copie est de copier la valeur de tous les


attributs du premier objet dans le second.

• Toute classe dispose d'un constructeur de copie par défaut généré


automatiquement par le compilateur.
EHTP 2019/2020
Constructeur de copie
Dr. H.CHAIBI

Déclaration NomClasse (NomClasse const& ObjetACopier);

NomClasse (NomClasse const& ObjetACopier){


Attribut1=ObjetACopier.Attribut1;
Définition Attribut2=ObjetACopier.Attribut2;
……
}
EHTP 2019/2020

Utilisation
NomClasse Objet1(Objet2);
ou NomClasse Objet1=Objet2;
Constructeur de copie
Dr. H.CHAIBI

1. Déclaration 3. Utilisation

2. Définition
EHTP 2019/2020
Constructeur de copie
Dr. H.CHAIBI

• Lorsque certaines données des objets auront été allouées dynamiquement. Une copie brutale
des champs d'un objet dans un autre ne ferait que recopier les pointeurs, pas les données
pointées. Ainsi, la modification de ces données pour un objet entraînerait la modification des
données de l'autre objet, ce qui ne serait sans doute pas l'effet désiré.

Per2 Exemple
Per1
liste = Per1.liste; // erreur! on ne copie que
KALID
l'adresse de l'objet de type double et non la liste
AHMAD en entier.
27  Pour résoudre le problème, il faut copier
*liste 1f23 *liste l'objet de type double en faisant une
EHTP 2019/2020

allocation dynamique:
0x23 0x24 0x25 …. liste = new Double(*Per.liste);
3.45 56.6 21.6 0.43 666
Constructeur par défaut par défaut
Dr. H.CHAIBI

• Si aucun constructeur n’est spécifié, le compilateur génère


automatiquement une version minimale du constructeur par défaut:
Laisse les attributs de type de base non initialisés.
• Dés qu’au moins un constructeur a été spécifié, ce constructeur par
défaut par défaut n’est plus fourni.
EHTP 2019/2020
Destructeur
Dr. H.CHAIBI

Problématique
• Pour créer des objets nous allouons de manière plus ou moins
transparente de la mémoire,
• Il est nécessaire de libérer cette mémoire pour l’objet courant.
• Sinon lorsque le programme tourne pendant des heures / jours il peut
arriver à saturer le système.
Solution
• Il est nécessaire de mettre en œuvre une méthode permettant de faire le
ménage lorsque l’on n’a plus besoin d’un objet.
EHTP 2019/2020

• Dans certains objets, le destructeur par défaut (généré par le compilateur)


peu suffire, mais il est toujours préférable de créer le sien,
Destructeur
Dr. H.CHAIBI

• De la même façon que pour les constructeurs,


le destructeur est une fonction membre
spécifique de la classe qui est appelée
implicitement à la destruction de l'objet.
• Le destructeur est une fonction;
 Son nom est identique au nom de la classe
précédé du caractère (tilda)
 Il ne retourne pas de valeur,
Il n'accepte aucun paramètre (pas de
surcharge possible),
EHTP 2019/2020

• Si la classe ne contient pas de destructeur par


défaut, alors le compilateur en génère un.
Destructeur
Dr. H.CHAIBI

• Un destructeur est appelé automatiquement à chaque fin du bloc où


l'objet a était déclaré.

• Il permet de libérer la mémoire allouée dans le constructeur.

• Si vous avez utilisé un new dans le constructeur, vous pouvez mettre


le delete dans le destructeur.
EHTP 2019/2020
EHTP 2019/2020 Dr. H.CHAIBI

Exemple:
Destructeur
Exercice1: Classe Compte (Constructeur)
Dr. H.CHAIBI

• Ecrivez le constructeur manquant de la classe Compte. Ce


constructeur ne prend aucun paramètre

• Ecrivez un second constructeur à la classe, ce dernier prend comme


paramètre le solde du compte.

• Ecrivez le destructeur manquant de la classe Compte.


EHTP 2019/2020
Exercice1: Classe Compte (Constructeur de
copier)
Dr. H.CHAIBI

1. Ajoutez un attribut à la classe Compte, cet attribut est de une liste


dynamique qui contient les montants retirés
il faut donc modifier:
• La fonction retirer en ajoutant la liste chaque montant retiré.
• Le constructeur par défaut en ajoutant une initialisation de la liste.
2. Ecrivez le constructeur de copier manquant qui permet de copier les
attributs d’un compte à un autre.
EHTP 2019/2020

3. Dans la fonction main instanciez un autre objet cpt3 et copiez le


compte cpt1 dans cpt3. Affichez les éléments de cpt3.
EHTP 2019/2020 Dr. H.CHAIBI

Le mot clef « static »


Les membres statique de la classe
• Les objets possèdent leurs attributs ainsi que leurs méthodes de manière
Dr. H.CHAIBI

“propre”,
• Ce comportement peut devenir très coûteux en mémoire dans certains cas
particulier.
• Pour contourner ces problèmes, le mot clef « static » a été introduit dans la
langage C++.
• Une méthode ou une variable déclarée static, cela signifie qu’elles sont
instanciées une unique fois en mémoire.
• Une telle variable « static » reste locale à la fonction ou à la classe dans
EHTP 2019/2020

laquelle elle est déclarée, mais sa valeur est conservée d'un appel au
suivant.
Les membres statique de la classe
Dr. H.CHAIBI

• Un membre statique appartient à la classe mais pas aux objets


instanciés à partir de la classe.
class MaClasse // il faut définir la variable static
{ // Dans le fichier .cpp
public:
MaClasse(); int MaClasse :: monAttribut=0;
static void maMethode();

private:
EHTP 2019/2020

static int monAttribut;


};
Exemple
Dr. H.CHAIBI

La valeur de count est conservée


d'une instanciation d’un objet à
une autre
EHTP 2019/2020
Les membres statique de la classe
Dr. H.CHAIBI

• Une fonction membre déclarée static a la particularité de pouvoir être


appelée sans devoir instancier la classe.
EHTP 2019/2020
Exercice1: Classe Compte (le mot clef static)
Dr. H.CHAIBI

• Modifiez la classe Compte afin de permettre un dénombrement des


objets.
EHTP 2019/2020
Exercice1: Classe Compte (le mot clef static)
Dr. H.CHAIBI
EHTP 2019/2020
EHTP 2019/2020 Dr. H.CHAIBI

Encapsulation des données


Encapsulation en C++
Dr. H.CHAIBI

• Encapsulation : principe interdisant l’accès direct aux attributs. On ne dialoguera


avec l’objet qu’à travers une interface définissant les services accessibles aux
l’utilisateurs de l’objet. Ce sera le rôle des méthodes.

• Le principe d’encapsulation est donc de déclarer :


• Les attributs de façon privée.
• Les méthodes de façon publique.
EHTP 2019/2020
Encapsulation en C++
Dr. H.CHAIBI

• Pour éviter que l’ensemble des attributs et des méthodes ne soit visible et
modifiable depuis l’extérieur,

• 3 niveaux de protection des attributs sont disponibles dans le langage C++ :

1. Visibilité publique (public),


2. Visibilité protégée (protected),
3. Visibilité privée (private),
EHTP 2019/2020
Encapsulation en C++
Dr. H.CHAIBI

Accès privé
• les membres privés ne sont accessibles
que par les méthodes appartenant à la
classe,
• Droits d’accès minimums que l’on peut
accorder à un attribut ou à une méthode,
permet de cacher les détails
d’implémentation vis-à-vis de l’extérieur,
EHTP 2019/2020

A utiliser pour 99% des attributs !


Encapsulation en C++
Dr. H.CHAIBI

Accès protégé
• Les membres protégés sont équivalents
aux membres privés,

• Ils sont accessibles par les méthodes


des classes dérivées (partie d’héritage).
EHTP 2019/2020
Encapsulation en C++
Dr. H.CHAIBI

Accès publique
• Les membres publics sont accessibles
par tous,
• La partie publique est appelée interface
car tout le monde peut y accéder,
• De plus ce sont les méthodes (attributs)
que toutes classes dérivées possèdent
obligatoirement,
• Permet d’utiliser la classe (méthodes et
EHTP 2019/2020

attributs) dans un programme.


Encapsulation en C++ : private vs public
Dr. H.CHAIBI

Déclaration Utilisation
Définition
EHTP 2019/2020
Encapsulation en C++ : private vs public
• Les données membres portant l'étiquette ’private’ ne peuvent pas
Dr. H.CHAIBI

être manipulées directement par les fonctions membres des autres


classes.

• Pour pouvoir manipuler ces données membres, le créateur de la


classe doit prévoir des fonctions membres spéciales portant
l'étiquette public, permettant de manipuler ces données.

• Les fonctions membres permettant d'accéder aux données membres


EHTP 2019/2020

sont appelées accesseurs, (ou getter) et mutateurs, (ou setter)


Encapsulation en C++ : private vs public
Dr. H.CHAIBI

• L’accès aux attributs déclarés de façon privée


1. Getter
• Il s’agit de méthodes publiques dont le rôle est de « retourner » la valeur d’un
attribut.
Doit avoir comme type de retour le type de la variable à renvoyer
Ne doit pas nécessairement posséder d'arguments
EHTP 2019/2020
Encapsulation en C++ : private vs public
Dr. H.CHAIBI

2. Setter
• Une fonction membre permettant de modifier le contenu d'une donnée membre
protégée.

 Doit avoir comme paramètre la valeur à assigner à la donnée membre.


 ne doit pas nécessairement renvoyer de valeur (type void)
EHTP 2019/2020
Exercice1: Classe Compte (accesseurs, mutateur)
Dr. H.CHAIBI

• Compléter la classe “compte” avec des accesseurs et des mutateurs


pour chacun de ses attributs.
EHTP 2019/2020
Dr. H.CHAIBI

Variable ou méthode constante


EHTP 2019/2020
Les membres constances - const
• Déclarer une méthode const indique juste à l'appelant de la fonction
Dr. H.CHAIBI

que l'implémentation de la fonction s'engage à ne jamais,


directement ou indirectement, changer les champs de l'objet passé
en paramètre.
Quel est l'intérêt ?
• Ca renforce la qualité du code produit,

• Ca rajoute une information à usage interne ( je ne veux pas que cette


méthode modifie mon objet) et à usage externe (cet méthode ne
EHTP 2019/2020

modifiera pas l'objet),


Les membres constances - const
Dr. H.CHAIBI

• On déclare une fonction membre constante en faisant suivre sa déclaration du


mot-clé const.

Void fonction() cont;

• La différence entre les deux fonctions afficher() est que la version non-constante
ne peut être appelée pour des objets constants de type Point.
EHTP 2019/2020

• La version constante de afficher() garantit aussi qu’aucune donnée membre de


Point ne sera modifiée. Autrement dit vous ne pouvez modifier l’objet de type
Point à l’intérieur de la fonction.
Dr. H.CHAIBI

Passage de paramètres par valeur et par référence


EHTP 2019/2020
Passage de paramètres par valeur et par référence
Dr. H.CHAIBI

• Il existe deux opérateurs permettant de récupérer l'adresse d'un objet et


d'accéder à l'objet pointé. Ces opérateurs sont respectivement & et *

• En plus des pointeurs, le C++ permet de créer des références.


• Les références sont des synonymes d'identificateurs. Elles permettent de
manipuler une variable sous un autre nom que celui sous laquelle cette
dernière a été déclarée.
EHTP 2019/2020

• Les références n'existent qu'en C++. Le C ne permet pas de créer des


références.
Passage de paramètres par valeur

• Il y a deux méthodes pour passer des variables en paramètre dans une fonction :
Dr. H.CHAIBI

1. Passage par valeur


La valeur de l'expression passée en paramètre (i et j) est copiée dans une variable locale.
C'est cette variable qui est utilisée pour faire les calculs dans la fonction appelée.
Résultat de l’exécution
EHTP 2019/2020

Si l'expression passée en paramètre est une variable, son contenu est copié dans la variable
locale. La modification de la variable locale dans la fonction appelée ne modifie pas la
variable passée en paramètre, parce que ces modifications ne s'appliquent qu'à une copie
de cette dernière.
Passage de paramètres par référence
Dr. H.CHAIBI

2. Passage par référence


• Cette technique consiste à passer non plus la valeur des variables comme paramètre, mais à
passer les variables elles-mêmes. Il n'y a donc plus de copie, plus de variable locale. Toute
modification du paramètre dans la fonction appelée entraîne la modification de la variable passée
en paramètre.

• On utilise le symbole & pour la déclaration de référence

• Il est recommandé, pour des raisons de performances, de passer par référence tous les
paramètres dont la copie peut prendre beaucoup de temps. Bien entendu, il faut utiliser des
EHTP 2019/2020

références constantes au maximum afin d'éviter les modifications accidentelles des variables de
la fonction appelante dans la fonction appelée.
Passage de paramètres par référence
Dr. H.CHAIBI

Exemple

Résultat de l’exécution
EHTP 2019/2020

La modification du paramètre dans la fonction appelée (a et b) entraîne la modification de la variable passée en


paramètre (i et j) .
Passage de paramètres par référence

• Lors d'un passage par référence, la variable (ou l'objet) n'est pas copiée.
Dr. H.CHAIBI

Notre classe Personne contient trois attributs, utiliser une référence


permet donc d'éviter la copie inutile de ces trois attributs.

• Le gain est assez négligeable mais, si vous prenez un objet de type String
qui peut contenir un texte très long, la copie prendra alors un temps
important. C'est pour cela que, lorsque l'on manipule des objets, on
préfère utiliser des références. Et c'est pour cela que l'on utilise une
référence constante.
EHTP 2019/2020

• Quand on effectue le test mathématique a==b. a et b ne doivent pas être


modifiés. Le mot-clé const est donc essentiel ici.
Dr. H.CHAIBI

Surcharge des fonctions et d’opérateurs


EHTP 2019/2020
Surcharge des fonctions et d’opérateurs
Dr. H.CHAIBI

• La surcharge d’opérateurs ou de méthodes est la capacité à pouvoir


redéfinir une méthode déjà existante dans un objet,

• Utilisation du même identifiant et des même paramètres que la


fonction à « surcharger »,
EHTP 2019/2020
Dr. H.CHAIBI

1. Surcharge des fonctions


EHTP 2019/2020
La surcharge des fonctions
Dr. H.CHAIBI

• C'est une technique qui nous permet de créer plusieurs fonctions


ayant le même nom.

Chaque fonction est constituée de 3 éléments:


→Un type de retour
→Un nom int max ( int, int);
→Une liste de paramètres
EHTP 2019/2020
La surcharge des fonctions
Dr. H.CHAIBI

Comment le compilateur fait-il pour vérifier si une fonction est bien différente d'une autre?

• En C, le compilateur se basait sur le nom uniquement.


• En C++, le compilateur se base sur le nom et les paramètres
→On peut avoir deux fonctions avec le même nom, à condition que celles-ci reçoivent des
paramètres différents.

Le nom et les paramètres de la fonction constituent ce qu'on appelle la signature de la


fonction.
Le type de retour n'est donc pas pris en compte pour identifier la fonction.
EHTP 2019/2020

La signature d'une fonction: C'est un peu sa carte d'identité, ce qui permet au compilateur
de différencier les fonctions entre elles.
La surcharge des fonctions
Dr. H.CHAIBI

La surcharge d'une fonction


• La surcharge consiste à créer des fonctions qui ont le même nom, mais qui
ont des paramètres différents (donc une signature différente).

Voici ce qui peut varier :

→Le nombre de paramètres


EHTP 2019/2020

→Le type de chacun de ces paramètres


La surcharge des fonctions
Dr. H.CHAIBI

Exemple: fonction max qui calcule deux nombres


• En C, il faut nommer les deux fonctions différemment (par exemple
maxEntiers et maxDecimaux).
• En C++, on peut leur donner le même nom et ça va grandement simplifier
leur utilisation

int max(int nb1, int nb2);

double max(double nb1, double nb2);


EHTP 2019/2020

• Ces fonctions ont des signatures différentes et portent le même nom. Ce sont des
fonctions surchargées
EHTP 2019/2020 Dr. H.CHAIBI

2. Surcharge d’opérateurs
Surcharge d’opérateurs
• En langage C, l'opérateur division « / » est défini comme suit:
Dr. H.CHAIBI

 3/2 Division de deux valeurs entières


 3.0/2.0 Division de deux valeurs réelles
 L’opérateur « / » a été redéfini afin de réaliser deux types de division: une
entière et une réelle.
 En langage C++, il est possible de redéfinir cet opérateur pour les classes.
Pourquoi?
 Afin d'assurer une meilleure intégration des classes au programme.
 Afin de permettre de fournir aux utilisateurs des interfaces plus simples à
EHTP 2019/2020

manipuler. (comparer deux objets ayants plusieurs attributs)


Surcharge d’opérateurs
• C++ permet de surdéfinir les opérateurs tels que +, =, +=, ++, <<, new…
Dr. H.CHAIBI

(voir tableau)

• C'est une technique qui permet de réaliser des opérations mathématiques


intelligentes entre vos objets.

• Fondamentalement, l’appel à un opérateur est identique à l’appel d’une


fonction: possibilité de surdéfinir.
EHTP 2019/2020

• Le but est de définir ces “fonctions” pour des classes dépourvues de ces
opérateurs
Les opérateurs surchargeables
Dr. H.CHAIBI
EHTP 2019/2020
Qui ne peut pas être redéfini?
Dr. H.CHAIBI

Qui ne peut pas être redéfini?


• Ne peuvent être surchargés les opérateurs suivants (une liste non
exhaustive):
. opérateur de sélection d’un membre via objet .
.* opérateur pointeur vers un membre via objet
:: opérateur de résolution de portée ?
: opérateur conditionnel ternaire
EHTP 2019/2020

sizeof opérateur déterminant la taille en octets


Surcharge d’opérateurs
Dr. H.CHAIBI

• Les opérateurs ont tous le même préfixe : « operator ».


• Ainsi donc, surcharger l’opérateur « / » consiste à définir la méthode «
operator/ ».
• Cette méthode désigne la fonction à 2 opérandes associée à l'opérateur « / ».
• Un des opérandes doit être de type classe. Il est donc impossible de redéfinir
l’opérateur « / » dans une opération « 3/2 » vu que les nombres sont des
entiers (type primitif).
EHTP 2019/2020

• Les opérateurs peuvent être définis comme membres ou non membres d'une
classe.
Exemple de surcharge de l’opérateur +
Dr. H.CHAIBI
EHTP 2019/2020
Exercice: Surcharge d’opérateurs
Dr. H.CHAIBI

• Surcharger l’opérateur == pour comparer deux points.


EHTP 2019/2020
EHTP 2019/2020 Dr. H.CHAIBI

L’héritage
Héritage
Dr. H.CHAIBI

• L'héritage, également appelé dérivation, permet de définir une


nouvelle classe en se basant sur une classe déjà existante
• nommée aussi la « classe de base »,
• La classe de base à partir de laquelle on hérite est aussi appelée «
classe mère » dans la littérature,
• Réutilisation totale ou partielle des classes déjà développées,
• Gain de temps et d’énergie pour le développement et la maintenance
des codes sources (les méthodes identiques ne sont codées qu’une
EHTP 2019/2020

seule fois dans la classe mère).


Héritage
Dr. H.CHAIBI

Comment savoir s'il y a un héritage à faire ou pas?


• Il y a héritage quand on peut dire : « A est un B ».
Exemple:
1. Un Magicien est une Personne, un Etudiant est une Personne, un
Enseignant est une Personne
→Donc Magicien, Etudiant et Enseignant héritent de la classe Personne

2. Une Voiture est un Véhicule, une Bicyclette est un Véhicule…


EHTP 2019/2020

→Donc Voiture et Bicyclette héritent de la classe Véhicule


Héritage
• L'héritage permet de spécialiser une classe.
Dr. H.CHAIBI

• Lorsqu'une classe hérite d'une autre classe, elle récupère toutes ses propriétés et
ses méthodes.
•Les constructeurs sont appelés dans un ordre bien précis : classe mère, puis classe
fille.
•En plus de public et private, il existe une portée protected. Elle est équivalente à
private mais elle est un peu plus ouverte : les classes filles peuvent elles aussi
accéder aux éléments.
EHTP 2019/2020

•Si une méthode a le même nom dans la classe fille et la classe mère, c'est la
méthode la plus spécialisée, celle de la classe fille, qui est appelée.
Héritage
Dr. H.CHAIBI

La syntaxe:
Class NomSousClasse : public NomSuperClasse { … }

Classe mère: Personne Classe fille: Etudiant


EHTP 2019/2020
EHTP 2019/2020 Dr. H.CHAIBI

Héritage - Exemple
Héritage et constructeurs
Dr. H.CHAIBI

• lorsqu'on crée un objet de type Personne le constructeur est appelé avant toute
chose.
• Mais que se passe-t-il lorsqu'on crée par exemple un Etudiant qui hérite de
Personne. L’Etudiant a le droit d'avoir un constructeur lui aussi ! Est-ce que cela
ne risque pas d'interférer avec le constructeur de Personne.
• Il faut appeler le constructeur de Personne si on veut que le nom, le prénom et
l'âge soient initialisés !
→Le compilateur appelle d'abord le constructeur de la classe mère Personne, puis
le constructeur de la classe fille Etudiant.
EHTP 2019/2020
Héritage
Dr. H.CHAIBI

La portée protected
• La portée protected est un autre type de droit d'accès que
on classe entre public et private. Il n'a de sens que pour les
classes qui se font hériter (les classes mères) mais on peut
l'utiliser sur toutes les classes, même quand il n'y a pas
d'héritage.

• les éléments qui suivent protected ne sont pas accessibles


EHTP 2019/2020

depuis l'extérieur de la classe, sauf si c'est une classe fille.


Héritage
Dr. H.CHAIBI

• Le masquage
Quand on écrit une fonction qui a le même nom que celle héritée de la
classe mère, on parle de masquage. La fonction héritée de Personne
est masquée, cachée.
EHTP 2019/2020
Héritage
Dr. H.CHAIBI

Personne
Afficher() Personne P1;
Utilisation de la version de la Etudiant E1;
méthode de la classe Personne

P1.Afficher();

Utilisation de la version de la E1.Afficher();


Etudiant méthode de la classe Etudiant
EHTP 2019/2020

Afficher()
Héritage
Dr. H.CHAIBI

• Le démasquage: utiliser une fonction qui était masquée.


On a utilisé ici l'opérateur : : appelé opérateur de résolution de portée.
Il sert à déterminer quelle fonction (ou variable) utiliser quand il y a
ambiguïté ou si il y a plusieurs possibilités.
EHTP 2019/2020
Transitivité de l’héritage
Dr. H.CHAIBI

Par transitivité, les instances d’une sous-classe possèdent:

Les attributs et méthodes (hors constructeurs/ destructeur) de l’ensemble des


classes parent ( super-classe, super-super-classe)

Crée un réseau de dépendances entre classes, ce réseau est organisé en une


structure arborescente où chacun des nœuds hérite des propriétés de
l’ensemble des nœuds du chemin remontant jusqu’à la racine.
EHTP 2019/2020
Transitivité de l’héritage
Dr. H.CHAIBI

• Exemple: Personne

Designation (): void

Etudiant Enseignant

Designation (): void Designation (): void


EHTP 2019/2020

Doctorant

Designation (): void


Transitivité de l’héritage
Dr. H.CHAIBI

Dans une hiérarchie de classes, la sous-classe hérite de la super-classe:


Tous les attributs /méthodes.
Le type: on peut affecter un objet de type sous-classe à une variable
de type super-classe

Personne P;
Etudiant E;
Doctorant D;
//…..
EHTP 2019/2020

P=E;
P=D;
Exercice: Héritage
Dr. H.CHAIBI

• Ecrivez un petit programme qui utilise la nouvelle sous-classe


CompteEpargne de super-classe Compte qui est caractérisé par :
Plafond et taux de type float .
• Instancier un objet CE de type CompteEpargne et réaliser l’héritage
en appelant les fonctions de la classe mère: deposer(), retirer(),
afficherSolde() et afficherListe() .
• Pour CompteEpargne , Redéfinir la méthode afficher pour que le taux
et plafond s’affichent, utiliser masquage et démasquage.
EHTP 2019/2020
EHTP 2019/2020 Dr. H.CHAIBI

Le polymorphisme
Polymorphisme
Dr. H.CHAIBI

Personne
nom:string
prenom: string
age:int
Designation(): void
EHTP 2019/2020

Etudiant Enseignant
CNE: int Num_CNSS: int
Designation(): void Designation(): void
Polymorphisme
Dr. H.CHAIBI

• Grâce à l’héritage, le même code pourra être appliqué à


un Etudiant, un Enseignant qui sont des personnes.
• Grâce au polymorphisme, le même code appliqué à
différentes personnes pourra avoir un comportement
différent, propre à chacun.
• Chaque classe affiche donc un message différent
• Nous avons utilisé ici le masquage pour redéfinir la
fonction Designation() de personne dans les deux classe
EHTP 2019/2020

fille (Etudiant et Enseignant)


Polymorphisme
Dr. H.CHAIBI

1. La résolution statique des liens:


En C++, C’est le type de la variable qui détermine la méthode à exécuter.
EHTP 2019/2020

La fonction se_presenter() reçoit une Personne c'est donc toujours la


« version » Personne des méthodes qui sera utilisée.
Polymorphisme
Dr. H.CHAIBI

2. La résolution dynamique des liens


Le choix de la méthode à exécuter se fait à l’exécution, en fonction de la nature réelle des
instances.
→La fonction se_presenter() appelle la bonne version de la méthode. C'est-à-dire qu'il faut
que la fonction connaisse la vraie nature de Personne. C'est ce qu'on appelle
la résolution dynamique des liens. Lors de l'exécution, le programme utilise la bonne
version des méthodes car il sait si l'objet est de type mère ou de type fille.

• Pour faire cela, il faut réunir deux ingrédients :

utiliser un pointeur ou une référence ;


EHTP 2019/2020

Et
utiliser des méthodes virtuelles.
Déclaration des méthodes virtuelles
Dr. H.CHAIBI

• En C++, on indique au compilateur qu’une méthode peut faire l’objet d’une


résolution dynamique des liens en la déclarant comme virtuelle (mot clé
virtual)
• Cette déclaration doit se faire dans la plus générale qui admet cette
méthode ( c’est-à-dire lors du prototypage d’origine).
• Les redéfinitions éventuelles dans les sous-classes seront aussi considéré
comme virtuelle par transitivité
• Il ne faut pas mettre virtual dans le fichier.cpp mais uniquement dans le .h.
EHTP 2019/2020

Syntaxe:
Virtual Type nom_fonction (paramètres) const ;
EHTP 2019/2020 Dr. H.CHAIBI

• Exemple
Polymorphisme
Polymorphisme
Dr. H.CHAIBI

Personne
Virtual Designation() Utilisation de la version de la
méthode de la classe Personne

Utilisation de la version de la
Etudiant
EHTP 2019/2020

méthode de la classe Etudiant


Virtual Designation()
Classe abstraite
Dr. H.CHAIBI

• Classe sans instance, seulement une base pour classes héritées


EHTP 2019/2020
Classe abstraite

 Les classes abstraites sont à utiliser lorsqu'une classe mère ne doit pas être
Dr. H.CHAIBI

instanciée.

 Une classe abstraite ne peut donc pas être instanciée.

 Une classe abstraite est une classe comportant au moins une méthode
virtuelle pure.

 Une méthode virtuelle pure est une méthode qui est déclarée mais non
EHTP 2019/2020

définie dans une classe. Elle est définie dans une des classes dérivées de
cette classe.
Méthode virtuelle pure
Dr. H.CHAIBI

• Pour déclarer une méthode virtuelle pure dans une classe, il suffit de
faire suivre sa déclaration de « =0 ». La fonction doit également être
déclarée virtuelle :
Syntaxe:
Virtual type nom (paramètres) =0;

• =0 signifie ici simplement qu'il n'y a pas d'implémentation de cette


EHTP 2019/2020

méthode dans cette classe.


Méthode virtuelle pure
Dr. H.CHAIBI

On peut résumer les fonctions virtuelles de la manière suivante :

→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.
EHTP 2019/2020
Polymorphisme
Dr. H.CHAIBI

• Le polymorphisme permet de manipuler des objets d'une classe


fille via des pointeurs ou des références sur une classe mère.
• Deux ingrédients sont nécessaires : des fonctions virtuelles et des
pointeurs ou références sur l'objet.
• 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 classe avec des méthodes virtuelles pures est dite abstraite. On
ne peut pas créer d'objet à partir d'une telle classe.
EHTP 2019/2020
Dr. H.CHAIBI

Les Entrées/ Sorties (iostream)


EHTP 2019/2020
Les Entrées/ Sorties
• Les classes d’entrées sorties standards :
Dr. H.CHAIBI

« istream » : classe dérivée de ios pour les flots en entrée,


« ostream » : classe dérivée de ios pour les flots en sortie,
« iostream » : classe dérivée de istream et de ostream pour les flots
bidirectionnels,

• Les classes pour la manipulation de fichiers


« ifstream » : classe permettant d'effectuer des entrées à partir des fichiers,
« ofstream » : classe permettant d'effectuer des sorties sur des fichiers,
« fstream » : classe permettant d'effectuer des entrées/sorties à partir des
EHTP 2019/2020

fichiers.
Les Entrées/ Sorties
Dr. H.CHAIBI

Les entrées et sorties sont gérées par deux classes définies


dans le fichier d'en-tête <iostream> :

•ostream (Output stream) permet d'écrire des données vers la


console, un fichier, ... Cette classe surdéfinit l'opérateur <<.

•istream (Input stream) permet de lire des données à partir de


la console, d'un fichier, ... Cette classe surdéfinit l'opérateur >>.
EHTP 2019/2020
Les Entrées/ Sorties
Dr. H.CHAIBI

Les instances des classes istream et ostream représentent les flux


standards :
•cout écrit vers la sortie standard,
•cerr écrit vers la sortie d'erreur,
•clog écrit vers la sortie technique,
•cin lit à partir de l'entrée standard (jusqu'au premier espace exclu,
éventuellement).
•getline lit à partir de l'entrée standard (tout).
EHTP 2019/2020

Ces objets sont définis dans l'espace de nom std.


Les Entrées/ Sorties: cout, cin, cerr
Dr. H.CHAIBI

• Exemple
EHTP 2019/2020
Les Entrées/ Sorties: ifstream, ofstream
Dr. H.CHAIBI

Pour gérer les fichiers, il faut inclure fstream. Il s'agit d'un ensemble de classes
standards donc il ne faut pas oublier "using namepace std;"
Il existe plusieurs types:
• ifstream(Input FileStream)
en lecture
• Ofstream (Output File Stream)
Fichier en écriture

• fstream
Fichier en lecture et écriture.

Il faut toujours fermer le fichier lorsque qu'on a fini avec la méthode close();
EHTP 2019/2020
Les Entrées/ Sorties: ifstream, ofstream
Dr. H.CHAIBI

Voici un exemple pour ouvrir un fichier dans le but d'écrire dedans.


EHTP 2019/2020
Les Entrées/ Sorties: ifstream, ofstream
Dr. H.CHAIBI

Voici un exemple pour lire le texte d’un fichier.


EHTP 2019/2020
Exercice: Entrées/ sorties en C++
Dr. H.CHAIBI

1. Écrire un programme qui écrit dans le fichier example.txt le texte:


« Hello world! Voici un programme qui écrit dans le fichier»
2. Ecrire un programme qui lit le fichier example.txt définit dans 1.
afficher son contenu
EHTP 2019/2020
EHTP 2019/2020 Dr. H.CHAIBI

Les espaces de nommage


Les espaces de nommage
Dr. H.CHAIBI

• Le “C” est un langage pour lequel il est impossible de dénombrer les


bibliothèques existantes,
• Parfois les auteurs de ces bibliothèques (puisqu'ils ne se consultent pas)
appellent leurs fonctions de la même façon même si elles réalisent des
traitements différents,

 Cela pose problème lorsque quelqu'un essaie d'utiliser deux bibliothèques


“incompatibles” en même temps,
EHTP 2019/2020

Le « C » ne propose aucune solution à ce type de problème


Les espaces de nommage
• Les “espaces de nommage” ont été défini afin de
Dr. H.CHAIBI

permettre une surcharge des données et méthodes


« globales »,

• namespace (signifiant espace de noms) est le mot


clef C++ c'est quelque chose qui regroupe des
variables et des fonctions, des classes, tout ce que
vous voulez dans une même boîte.
EHTP 2019/2020

 Et si on crée une deuxième boîte, on pourra y mettre une


fonction sans ce soucier de sa présence dans une autre
boîte.
Les espaces de nommage
Dr. H.CHAIBI

• La déclaration de namespace se mettent dans les fichiers header (.h)

• La définition dans le fichier source (.cpp)

• L’utilisation dans main.cpp avant la fonction main()


EHTP 2019/2020
Les espaces de nommage
Dr. H.CHAIBI

• L’utilisation des “espaces de nommage” peut


rapidement devenir fatiguant :
 Il faut mettre « espace:: » avant toutes ses
variables,
• Le langage C++ fournit le mot clef using,
• En faisant: « using namespace A » toutes les
variables, dont on ne précise pas le namespace,
seront considérées comme faisant parti de A.
EHTP 2019/2020

 Simplification de l’écriture,
Dr. H.CHAIBI

Programmation générique en C++


EHTP 2019/2020
Programmation générique en C++
Dr. H.CHAIBI

• Le but de la programmation, en tout cas à l'origine, est de simplifier


les tâches répétitives en les faisant s'exécuter sur votre ordinateur
• Nous allons voir comment faire s'exécuter un même code pour
différents types de variables ou classes. Cela nous permettra d'éviter
la tâche répétitive de réécriture de portions de code semblables pour
différents types.
• La force des templates est d'autoriser une fonction ou une classe à
utiliser des types différents. Leur marque de fabrique est la présence
EHTP 2019/2020

des chevrons < et > .


Les fonctions templates
Dr. H.CHAIBI

• il faudrait également fournir une fonction de ce


type pour les char, les unsigned int, les
nombres rationnels, etc. On se rend vite
compte que la tâche est très répétitive.
• Cependant, il y a un point commun à toutes ces
fonctions : le corps de la fonction est
strictement identique. Quel que soit le type, le
traitement que l'on effectue est le même. On
se rend compte que l'algorithme utilisé dans la
EHTP 2019/2020

fonction est générique.


Les fonctions templates
Dr. H.CHAIBI

• Il serait donc intéressant de pouvoir écrire une


seule fois la fonction en disant au compilateur :
« Cette fonction est la même pour tous les
types, c'est ce que permettent
les templates en C++ .
• Cela se fait de la manière suivante :
template<typename T>
• le mot-clé template prévient le compilateur que la
EHTP 2019/2020

prochaine chose dont on va lui parler sera générique ;


• le mot-clé typename indique au compilateur que T
sera le nom que l'on va utiliser pour notre « type
spécial » qui remplace n'importe quoi
Les fonctions templates
Dr. H.CHAIBI

• Nous aurons pas besoin d'écrire plus de code. Il faut


juste indiquer entre des chevrons quelle « version »
de la fonction on souhaite utiliser

• Il n'est pas toujours utile d'indiquer entre chevrons


quel type on souhaite utiliser pour les fonctions
templates. Le compilateur est assez intelligent
pour deviner ce que vous souhaitez faire.
EHTP 2019/2020

• Mais dans des cas compliqués ou s'il y a plusieurs


arguments de types différents, alors il devient
nécessaire de spécifier la version.
Des fonctions plus compliquées
Dr. H.CHAIBI

Exemple: division entière qui pose problème!.


• Le type de retours une fois réel et l’autre entier

• Pour résoudre le problème: Ajoutons un


deuxième paramètre template pour le type de
retour et utilisons-le.

• Il faut explicitement indiquer les types à utiliser


EHTP 2019/2020

lors de l'appel de la fonction


Exercice: template
Dr. H.CHAIBI

1. Écrivez une fonction renvoyant le plus petit de deux éléments sous


forme template.

2. Écrivez la fonction moyenne sous forme de template.


EHTP 2019/2020
EHTP 2019/2020 Dr. H.CHAIBI

Exercice: template
Les classes templates
Dr. H.CHAIBI

• Permet d’écrire une seule classe qui


pourra être instanciée par le
compilateur avec différents types.
• Exemple: Un rectangle a quatre
côtés
EHTP 2019/2020
Instanciation d'une classe template
Dr. H.CHAIBI
EHTP 2019/2020
Exercice: template
Dr. H.CHAIBI

1. Créer une classe Template pour la classe « Cercle »

2. Le type des attributs et des méthodes renvoyant une valeur


dépendront donc du paramètre Template rentré au préalable.

3. Créer une méthode retournant son aire.


EHTP 2019/2020
Dr. H.CHAIBI

Gestion des Exceptions en C++


EHTP 2019/2020
Les exceptions - Problématique
• Il existe plusieurs types d'erreurs pouvant survenir. Parmi les erreurs
Dr. H.CHAIBI

possibles, on connaît déjà les erreurs de syntaxe qui surviennent


lorsque l'on fait une faute dans le code source, par exemple si l'on
oublie un point-virgule à la fin d'une ligne.
Ces erreurs sont faciles à corriger car le compilateur peut les signaler.

• Un autre type de problème peut survenir si le programme est écrit


correctement mais qu'il exécute une action interdite. On peut citer
comme exemple le cas où l'on essaye de diviser sur zero ou encore le
calcul de la racine carrée d'un nombre négatif.
EHTP 2019/2020

On appelle ces erreurs les erreurs d'implémentation.


Les exceptions - Problématique
• Les exceptions sont la pour gérer les erreurs liées à l’exécution
Dr. H.CHAIBI

du programme :

→Erreurs matérielles : saturation mémoire, disque plein, rupture d’une


connexion réseau, etc.
→Erreurs logicielles : division par zéro, débordement dans un tableau, etc.

• La solution habituellement pratiquée est l'affichage d'un message d'erreur


EHTP 2019/2020

et l’arrêt du programme avec le renvoi d'un code d'erreur au programme


appelant.
Les exceptions - Problématique
Dr. H.CHAIBI

• Exemple: division de deux nombres entiers


EHTP 2019/2020
Les exceptions – Gestion classique des erreurs
Dr. H.CHAIBI

• Gestion classique des erreurs à l’exécution dans un programme


développé en langage C.
EHTP 2019/2020
Les exceptions - Implémentation C++
Dr. H.CHAIBI

• Une exception est une interruption de l'exécution du programme à la


suite d'un événement particulier. Le but des exceptions est de réaliser
des traitements spécifiques aux événements qui en sont la cause :
Ces traitements peuvent rétablir le programme dans son mode de
fonctionnement normal, auquel cas son exécution reprend,
Il se peut aussi que le programme se termine, si aucun traitement n'est
approprié,
• Lorsqu'une erreur survient, le programme doit lancer une exception.
L'exécution normale du programme s'arrête et le contrôle est passé à
EHTP 2019/2020

un gestionnaire d'exception.
Gestion des exceptions
• On crée des zones où l'ordinateur
Dr. H.CHAIBI

va essayer le code en sachant qu'une erreur Try {


peut survenir ; // (essaye) // Du code qui pourrait
créer une erreur.
• Si une erreur survient, on la signale
en lançant un objet qui contient des Throw
informations sur l'erreur ;
//(lance) signale l'erreur en lançant
un objet ;
• À l'endroit où l'on souhaite gérer les erreurs
survenues, on attrape l'objet et on gère }
l'erreur. Catch( . ..) {
EHTP 2019/2020

//(attrape) introduit la portion de code


• Les exceptions sont déclenchées grâce à qui récupère l'objet et gère l'erreur.
l'utilisation du mot-clé throw }
Gestion des exceptions
• try: Il permet d'introduire un bloc sensible aux exceptions, c'est-à-dire
Dr. H.CHAIBI

qu'on indique au compilateur qu'une certaine portion du code source


pourrait lancer un objet.
• throw: C'est grâce à lui qu'on lance l’objet. On peut lancer n'importe
quoi comme objet, par exemple un int qui correspond au numéro de
l'erreur ou un string contenant le texte de l'erreur.
La syntaxe est la suivante throw expression
catch: Il permet de créer un bloc de gestion d'une exception survenue.
Il faut créer un bloc catch par type d'objet lancé. Chaque bloc try doit
EHTP 2019/2020

obligatoirement être suivi d'un bloc catch


La syntaxe est la suivante : catch (type const& e){...}
Gestion des exceptions
Dr. H.CHAIBI

1. On commence par construire un objet X


de type quelconque qui représentera
l'erreur: dans l'exemple X, il est du type
string.
2. On lance une exception sur cet objet
grâce au mot-clé réservé, throw. Pour cet
exemple, cette exception est lancée dans le
cas où le dénominateur est nul.
3. Cette exception est alors enfermée dans
un bloc try, qui peut générer une erreur.
EHTP 2019/2020

4. Un bloc catch essaie d'attraper l'objet X,


représentant l'erreur. Puisque X est du type
string, nous avons défini un catch de ce
type-là.
Gestion des exceptions
Dr. H.CHAIBI

• On peut également lancer une


exception de type entier une
décrivant l'erreur.
EHTP 2019/2020
Les exceptions standard
• Maintenant que l'on sait gérer les exceptions, la question principale est de
Dr. H.CHAIBI

savoir quel type d'objet lancer?.


• En plus de la possibilité de lancer des exceptions de type entier ou string.
On peut aussi, par exemple, lancer un objet qui contiendrait plusieurs
attributs comme :

une phrase décrivant l'erreur ;


le numéro de l'erreur ;
le niveau de l'erreur (erreur fatale, erreur mineure...) ;
l'heure à laquelle l'erreur est survenue ;
EHTP 2019/2020

etc.
Les exceptions standard
Dr. H.CHAIBI

• La bibliothèque standard peut lancer 5 types d'exceptions différents


résumés dans le tableau suivant :
EHTP 2019/2020
Les exceptions standard
Dr. H.CHAIBI

• L’exemple présente une allocation mémoire importante qui a de


fortes chances d’être impossible !
EHTP 2019/2020
Dr. H.CHAIBI

Merci pour votre attention!


EHTP 2019/2020

Vous aimerez peut-être aussi