You are on page 1of 111

set.utbm.

fr

LO43 : Bases fondamentales de la


programmation orientée objet
Langage C++

Franck GECHTER

franck.gechter@utbm.fr

Automne 2005
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Plan du Cours
Les opérateurs
Les Amis
Les Classes Template La Conception Orientée Objet
La STL
L’Héritage Introduction au C++
Polymorphisme
Les Classes Abstraites
Les Classes
La STL
L’Héritage
Polymorphisme, Liaison Statique et Liaison
Dynamique
Les Classes Abstraites
set.utbm.fr

Plan du Cours
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les opérateurs
Les Amis
Les Classes Template
La STL
La Conception Orientée
L’Héritage
Polymorphisme
Objet (C.O.O.)
Les Classes Abstraites
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
La Conception Orientée Objet
Les opérateurs
Les Amis
(C.O.O.)
Les Classes Template
La STL
L’Héritage
Polymorphisme
Les Classes Abstraites I Introduction :
I Qu’est ce qu’un programme?
I Reflexions sur la vie d’un logiciel
I Qu’est ce qu’un bon programme?
I Modularité et Réutilisabilité
I Principes de la Conception Orientée Objet
set.utbm.fr

Plan du Cours
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les opérateurs
Les Amis
Les Classes Template
La STL
L’Héritage
Introduction
Polymorphisme
Les Classes Abstraites
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Qu’est ce qu’un programme?
Les opérateurs
Les Amis Un programme peut se résumer par l’équation
Les Classes Template
La STL
suivante
L’Héritage
Polymorphisme
Les Classes Abstraites
Programme = Algorithmes + Structures de Données

I Il y a donc deux choix de conception soit en


s’appuyant sur les traitements soit en
s’appuyant sur les données.
I L’approche par traitement est l’approche
traditionnelle (décomposition du problème en
tâches simples tout en utilisant les fonctions
existantes
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Inconvénients de la conception par
Les opérateurs
Les Amis
traitements
Les Classes Template
La STL
L’Héritage I Les modules sont, en général, ad hoc adaptés
Polymorphisme
au problème de départ
Les Classes Abstraites
I Les traitements ne prennent pas en
considération les structures de données
sous-jacentes
I Il n’est pas toujours évidant d’identifier les
traitements
I Les traitements sont généralement beaucoup
moins stables que les données
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Inconvénients de la conception par
Les opérateurs
Les Amis
traitements
Les Classes Template
La STL
L’Héritage
Polymorphisme
Les Classes Abstraites
Il y a quand même quelques avantages à ces
méthodes : approche intuitive, facilement
applicable pour des applications de taille
raisonnable.
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Reflexions sur la vie d’un logiciel
Les opérateurs
Les Amis
Les Classes Template
La STL
L’Héritage I La C.O.O. trouve ses fondements dans une
Polymorphisme reflexion menée autour de la vie du logiciel.
Les Classes Abstraites
I Le développement de logiciels de plus en plus
importants → Utilisation de règles → Qualité
de réalisation
I Réalisation plusieurs phases
I Le développement n’est que la première partie
I 70% correspond à la phase de maintenance.
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Qu’est ce qu’un bon programme?
Les opérateurs
Les Amis
Les Classes Template
La STL I La correction ou validité : le logiciel effectue
L’Héritage
Polymorphisme les tâches pour lesquelles il a été conçu.
Les Classes Abstraites I L’extensibilité : intégration de nouvelles
spécifications.
I La réutilisabilité : réutilisation globale ou
partielle - il faut prendre soin à l’organisation
du logiciel.
I La robustesse : capacité de fonctionnement
même dans des conditions anormales
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
La Modularité
Les opérateurs
Les Amis I Les contraintes énoncées précédemment
Les Classes Template
La STL
obligent à s’écarter d’une vision monolithique
L’Héritage de la programmation → programmation sous
Polymorphisme
forme de modules
Les Classes Abstraites
I Deux méthodes de conception modulaire :
I Approche descendante : décomposition d’un
problème donné en sous-problèmes de façon
récursive jusqu’à des sous problèmes triviaux
I Approche ascendante : composition de
briques logicielles simples (bibliothèques)
I Les deux méthodes ne sont pas mutuellement
exclusives
I L’approche descendante ne favorise pas
forcément la réutilisabilité.
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
La Modularité : Critères de qualité
Les opérateurs
Les Amis
Les Classes Template I Compréhensibilité modulaire : modules clairs,
La STL
L’Héritage
organisés de manière cohérente et
Polymorphisme communiquant avec un nombre limité de
Les Classes Abstraites
modules
I Continuité modulaire : une modification d’un
module → modification d’un petit nombre de
modules sans implication pour les relations
inter-modules.
I Protection modulaire : toute action sur un
module doit être confinée à ce module
(éventuellement nombre restreint de modules)
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
La Modularité : Principes
Les opérateurs
Les Amis
Les Classes Template I Interface limitée : Restreindre les actions
La STL
L’Héritage
possibles pour un module
Polymorphisme I Communications limitées : Limitation des
Les Classes Abstraites
communications de façon quantitatives
I Interface explicite
I Masquage de l’information : Les informations
contenus dans un module doivent être privées
à l’exception des actions ou des informations
publiques
I Le langage de programmation doit s’adapter à
la spécification du module
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
La Réutilisabilité
Les opérateurs
Les Amis I Ce n’est pas un concept nouveau
Les Classes Template
La STL (bibliothèques, structure de données
L’Héritage élémentaires,...)
Polymorphisme
Les Classes Abstraites
I Principes :
I Un module doit pouvoir utiliser plusieurs
types différents d’informations
I Un module doit pouvoir s’adapter aux
différentes structures de données (recherche
dans une liste idem recherche dans un
tableau)
I Un module doit offrir des opérations sans
pour autant en montrer leur implémentation
I Factorisation des opérations d’un groupe de
module au sein d’un même module
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Des techniques nouvelles
Les opérateurs
Les Amis
Les Classes Template
La STL
L’Héritage
Polymorphisme
Les Classes Abstraites I La Surcharge : des opérations associées à des
modules différents peuvent avoir le même nom.
I La Généricité : Définition de modules
paramètrés par le type qu’ils manipulent.
set.utbm.fr

Plan du Cours
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les opérateurs
Les Amis
Les Classes Template La Conception par Objets :
La STL
L’Héritage Principes
Polymorphisme
Les Classes Abstraites
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
La conception par objets
Les opérateurs
Les Amis
Les Classes Template
La STL
L’Héritage I Il semble maintenant naturel d’organiser la
Polymorphisme
programmation autour des données
Les Classes Abstraites
manipulées: les objets.
I Les données étant plus stables que les
traitements la conception est simplifiée
I L’approche par données respecte un certain
nombre de critères de qualité (modularité,
réutilisabilité,...)
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
La conception par objets
Les opérateurs
Les Amis
Les Classes Template
La STL Voici une définition de la conception par objets
L’Héritage donnée par B. Meyer ainsi qu’un conseil fort utile:
Polymorphisme
Les Classes Abstraites
”La conception par objet est la méthode qui
conduit à des architectures logicielles fondées sur
les OBJETS que tout système ou sous-sytème
manipule”

”Ne commencez pas par demander ce que fait le


système, demandez À QUOI il le fait!”
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Détermination des Objets
Les opérateurs
Les Amis
Les Classes Template
La STL I Les objets vont couvrir tout type d’entités.
L’Héritage
Polymorphisme I Ils sont assez similaires aux structures utilisées
Les Classes Abstraites
en Pascal ou en C mais sont dotés de
propriétés supplémentaires.
I Pour décrire un objet dont on va s’interesser,
on utilise une Classe.
I Les Classes constituent les modèles dont
seront issus les objets, que l’on appellera
également instance de classe
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Détermination des Objets
Les opérateurs
Les Amis
Les Classes Template
La STL
L’Héritage
Polymorphisme I Une classe est constituée d’une partie
Les Classes Abstraites
comportant des champs (ou attributs ou
données)...
I ... et d’une partie constituée de fonctions (ou
méthodes) s’appliquant sur les champs qui
décrit les services disponibles pour l’objet.
set.utbm.fr

Plan du Cours
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les opérateurs
Les Amis
Les Classes Template
La STL
L’Héritage
Introduction au C++
Polymorphisme
Les Classes Abstraites
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Introduction au C++
Les opérateurs
Les Amis
Les Classes Template Le langage C++ est un langage très complexe et
La STL complet.
L’Héritage
Polymorphisme
Les Classes Abstraites Il n’est pas possible d’en faire un tour complet au
cours de cette UV:
→ se reporter aux ouvrages donnés dans la
bibliographie !!
→ pratiquer chez soi !!

Il peut être vu comme une extension du langage C


(Un programme C valide est un programme C++
valide)
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Historique du C++
Les opérateurs
Les Amis
Les Classes Template
I Conçu dans les laboratoires AT&T Bell (par
La STL Bjarn Stroustrup)
L’Héritage
Polymorphisme
I Extension des fonctionnalités du C en intégrant
Les Classes Abstraites les concepts liés à la programmation objet.
I 1979 Création du langage C+ (C et
fonctionnalités objets)
I 1983 Création du langage C++ (C+ et
généricité, liaison dynamique,...)
I Jusqu’en 1997 évolution du langage et
établissement d’une norme (Attention certains
compilateurs ne respecte toujours pas
l’intégralité de la norme)
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les Modules
Les opérateurs
Les Amis
Les Classes Template
La STL Tout comme en C, un module C++ est
L’Héritage généralement implanté par un fichier d’interface et
Polymorphisme
Les Classes Abstraites
un fichier d’implémentation.
I .hh, .H ou .hpp, fichiers d’interface
contenant les services offerts par le module.
(Rq: dans la norme finale les headers devront
perdre leur extension)
I .cc, .C ou .cpp, fichiers d’implémentation
C++
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les Types Primitifs et
Les opérateurs
Les Amis
Commentaires
Les Classes Template
La STL
L’Héritage
Polymorphisme
I Les types primitifs sont les mêmes qu’en C
Les Classes Abstraites (char, int, float, double, void)
auxquels on a ajoutés un type supplémentaire
bool. Une variable de type bool peut prendre
deux valeurs true ou false.
I Les commentaires peuvent se faire comme en
C (/* .... */) ou en utilisant le sigle de
commentaires court // tenant sur une ligne.
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les Fonctions et Les Définitions de
Les opérateurs
Les Amis
Variables
Les Classes Template
La STL I Le langage C++ est fortement typé
L’Héritage
Polymorphisme
I Possibilité de définir des valeurs par défaut
Les Classes Abstraites pour les paramètres des fonctions (Attention à
l’ordre)
I Possibilité de définir des fonctions inline (à
chaque appel la fonction est remplacée par le
code source correspondant)
I On peut définir les variables à la volée
(Attention il est FORTEMENT conseillé de
continuer à les déclarer toutes en début de
bloc)
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les Références
Les opérateurs
Les Amis
Les Classes Template
I L’introduction de la notion de référence
La STL permet la mise en place d’un mécanisme
L’Héritage d’alias sur les variables.
Polymorphisme
Les Classes Abstraites
I La notion de pointeur du C permettait
d’accèder au contenu d’une variable.
I Une référence est un nouveau nom donné à
une variable existante.
I Une référence est également représentée sous
la forme d’une adresse (pointeur).
I Une référence s’utilise comme une variable.
I Les opération sur les références sont effectuées
sur les objets référenceés
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les Références
Les opérateurs
Les Amis
Les Classes Template
Définition d’une référence :
La STL
L’Héritage Type &nomRef = variableAReferencer;
Polymorphisme
Les Classes Abstraites int main() {
int val = 10;
int i;
int *pval = &val; //Pointeur sur val
int &refVal = val; //Référence sur val
int &refAutre; // Erreur !!!!

*pval = 12;
i = refval; // ’i’ vaut 12, valeur de ’val’
}
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les Références
Les opérateurs
Les Amis
Les Classes Template
La STL
L’Héritage
Polymorphisme I Contrairement aux pointeurs, les références
Les Classes Abstraites ne peuvent pas être vides
I Elles sont toujours initialisées lors de la
déclaration
I On préférera les utiliser lorsqu’on ne veut pas
de valeur inconsistante (NULL)
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les Références : Passage de
Les opérateurs
Les Amis
paramètres et valeur de retour
Les Classes Template
La STL
L’Héritage
I En C, le passage des paramètre et valeurs de
Polymorphisme retour se fait par valeur.
Les Classes Abstraites
I Pour simuler un passage par adresse on utilise
alors les pointeurs.
I En C++ on peut utiliser les Références pour
effectuer ce passage par adresse...
I .. et laisser le compilateur choisir les ”bonnes
instructions”
I Le choix du mode de transmission se fait lors
de la déclaration de la fonction
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les Références : Passage de
Les opérateurs
Les Amis
paramètres et valeur de retour
Les Classes Template
La STL
L’Héritage
Polymorphisme I La transmission d’arguments par référence
Les Classes Abstraites
simplifie l’écriture de la fonction.
I Ceci induit des effets de bords que l’on peut
éviter avec le mot const.
I On peut utiliser ce mécanisme pour la valeur
de retour d’une fonction (intérêts lors de la
surcharge d’opérateurs)
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les Références : SWAP
Les opérateurs
Les Amis
Les Classes Template
La STL
L’Héritage
Polymorphisme
Les Classes Abstraites
Exemple : Ecrivez la fonction Swap de deux entiers
avec les pointeurs puis les références.
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les Références : SWAP
Les opérateurs
Les Amis
Les Classes Template
La STL void swapC(int *i, int *j) {
L’Héritage int tmp = *i;
Polymorphisme
Les Classes Abstraites
*i = *j;
*j=tmp;}

void swapCpp(int &i, int &j) {


int tmp = i;
i = j;
j = tmp; }
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les Références : SWAP
Les opérateurs
Les Amis
Les Classes Template
La STL
L’Héritage
Polymorphisme
Les Classes Abstraites
int main() {
int m =1 , n = 2;

swapC(&m,&n);
swapCpp(m,n); }
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Allocation Dynamique de mémoire
Les opérateurs
Les Amis
Les Classes Template
La STL
L’Héritage I Allocation dynamique grace aux opérateurs
Polymorphisme
Les Classes Abstraites new et delete (ne plus utiliser malloc et
free !!!!!!!!!)
I Il n’est plus nécessaire d’utiliser sizeof
I Le principe d’utilisation est le même
I Pour les tableaux les opérateurs new et delete
sont remplacés par new[] et delete[]
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Allocation Dynamique : Exemple
Les opérateurs
Les Amis
Les Classes Template
La STL main()
L’Héritage
{
Polymorphisme
Les Classes Abstraites int *pi = new int;
int *tab = new int[10];
if ((pi != NULL) && (tab !=NULL) {
...
delete pi;
delete [] tab;
}
}
set.utbm.fr

Plan du Cours
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les opérateurs
Les Amis
Les Classes Template
La STL
La Surcharge
L’Héritage
Polymorphisme
Les Classes Abstraites
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
La Surcharge
Les opérateurs
Les Amis
Les Classes Template
La STL
L’Héritage I La surcharge est l’une des nouvelles
Polymorphisme fonctionnalités du C++ (réutilisabilité)
Les Classes Abstraites
I Elle permet d’attribuer le même nom à
plusieurs opérateurs ou fonctions.
I L’ambiguité est levée grâce au contexte
(nombre et/ou type des paramètres)
I Une définition séparée est nécessaire pour
chacun des profiles
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
La Surcharge : Exemple
Les opérateurs
Les Amis
Les Classes Template
La STL
L’Héritage
Polymorphisme
Les Classes Abstraites ...
int max(int a, int b);
int max(int *tab, int taille);
int max(int a, int b, int c);
...
set.utbm.fr

Plan du Cours
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les opérateurs
Les Amis
Les Classes Template
La STL Les Entrées-Sorties
L’Héritage
Polymorphisme
Les Classes Abstraites
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les Entrées-Sorties
Les opérateurs
Les Amis I Les entrées-sorties on été remaniées pour
Les Classes Template
La STL
profiter de la surcharge.
L’Héritage I Pour pouvoir les utiliser il faut inclure l’en-tête
Polymorphisme
<iostream>
Les Classes Abstraites
I il existe trois flots :
I cin : entrée standard (clavier par défaut)
I cout : sortie standard (écran par défaut)
I cerr : sortie message d’erreur (écran par
défaut)
I Les opérateurs  et  permettent de faire les
écritures et les lectures
I Ils sont surchargés pour permettre l’utilisation
de tous les types primitifs
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les Entrées-Sorties Avantages
Les opérateurs
Les Amis
C++ par rapport au C
Les Classes Template
La STL
L’Héritage
Polymorphisme I La vitesse d’execution est plus rapide
Les Classes Abstraites
(traduction effectuée au moment de la
compilation).
I Il n’y a plus de problèmes de type.
I Les instructions générées sont plus réduites.
I Il est possible de surcharger les opérateurs 
et  pour manipuler d’autres types.
set.utbm.fr

Plan du Cours
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les opérateurs
Les Amis
Les Classes Template
La STL Les Classes
L’Héritage
Polymorphisme
Les Classes Abstraites
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les Classes
Les opérateurs
Les Amis
Les Classes Template I Une classe permet de définir (interface et
La STL
implémentation) un objet en terme de
L’Héritage
Polymorphisme
structure de données et de fonctionnalités.
Les Classes Abstraites I On trouve à l’interieur d’une Classe C++ :
I Les attributs (variables définies dans la
classe)
I Les méthodes (services offerts par la classe)
I Pour déclarer une classe il faut utiliser le mot
clé class.
I Les attributs et méthodes sont ensuite définis
comme les champs dans une structure C
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Publique, Protégé ou Privé
Les opérateurs
Les Amis
Les Classes Template
I Les structures en C ne permettent que de
La STL réunir des variables, en C++ une classe y
L’Héritage ajoute des fonctions.
Polymorphisme
Les Classes Abstraites
I Une classe C++ peut comporter plusieurs
sections public, protected ou private qui
permettent de modifier le niveau de masquage
des informations.
I public : attributs et/ou méthodes
accessibles par n’importe quel client de la
classe.
I protected ou private : attributs et/ou
méthodes inaccessibles aux clients extérieurs
de la classe. (On verra la différence entre ces
deux notions un peu plus tard)
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Publique, Protégé ou Privé et
Les opérateurs
Les Amis
Encapsulation
Les Classes Template
La STL
L’Héritage
Polymorphisme
I Par convention les attributs de la classes sont
Les Classes Abstraites protected ou private.
I On les déclare dans une section autre que
public.
I Conséquence : les attributs ne sont plus
directement accessibles → Il faut des
méthodes d’accès publiques. C’est ce qu’on
appelle l’encapsulation.
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Utilisation
Les opérateurs
Les Amis
Les Classes Template
La STL
L’Héritage I Une classe définit un type qui peut être utilisé
Polymorphisme
Les Classes Abstraites comme tout autre type disponible
I L’accès aux champs (méthodes et attributs) se
fait de façon pointée (.) (objet ou référence
sur objet)
I La notation flèchée (->)est utilisée lorsque
l’on dispose d’un pointeur sur un objet.
set.utbm.fr

Plan du Cours
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les opérateurs
Les Amis
Les Classes Template
La STL Constructeur et Destructeur
L’Héritage
Polymorphisme
Les Classes Abstraites
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Constructeur et Destructeur
Les opérateurs
Les Amis
Les Classes Template
I Il est souvent nécessaire d’initialiser un objet
La STL au moment de la création.
L’Héritage
Polymorphisme
I Parfois il faut même effectuer de l’allocation
Les Classes Abstraites de mémoire.
I Il est donc nécessaire de disposer d’une (ou
plusieurs) méthode(s) spéciale(s) pour faire
cette initialisation : le Constructeur.
I De la même façon il faut pouvoir désallouer de
la mémoire utilisée par un objet lorsque l’on ne
l’utilise plus.
I On utilise alors une méthode particulière : le
Destructeur
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Constructeur
Les opérateurs
Les Amis
Les Classes Template
La STL I Les constructeurs n’ont aucun type de
L’Héritage
Polymorphisme
retour (même pas void !!!).
Les Classes Abstraites I Ils portent le même nom que la classe à
laquelle ils appartiennent
I Il sont rarement appelés explicitement par le
programmeur.
I Le compilateur se charge d’utiliser le bon
constructeur (surcharge) à la création de
l’objet.
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Constructeur par défaut et par
Les opérateurs
Les Amis
recopie
Les Classes Template
La STL
L’Héritage
Polymorphisme
I Le Constructeur par défaut
Les Classes Abstraites
I Il est utilisé lorsque l’objet est instancié sans
paramètre.
I Type ()
I Le Constructeur de recopie
I Il est utilisé lorsqu’un objet est créé à partir
d’un autre objet de même type.
I Type ( const Type& unAutreObjet)
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Constructeur par recopie
Les opérateurs
Les Amis
Les Classes Template
La STL
I Les attributs de l’objet passé en paramètre
L’Héritage
Polymorphisme sont recopiés dans les attributs de l’objet à
Les Classes Abstraites créer + Allocation d’un nouvel objet en
mémoire
I Les attributs ne sont pas recopiés si l’objet
passé en paramètre est incomplet
I On peut accéder directement à l’objet passé
en paramètre y compris aux champs
protected et private
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Destructeur
Les opérateurs
Les Amis
Les Classes Template
La STL
I Il n’y a qu’un seul destructeur par classe!!!
L’Héritage I Son identificateur est composé du nom de la
Polymorphisme
Les Classes Abstraites
classe précédé du signe : ~
Type().
I Les destructeurs n’ont pas de paramètres ni de
type de retour.
I Il est préférable de préfixer les destructeurs par
le mot clé virtual. (on verra une explication
plus tard dans le cours)
I Les destructeurs ne sont jamais explicitement
appellé par le programmeur.
set.utbm.fr

Plan du Cours
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les opérateurs
Les Amis
Les Classes Template
La STL
Forme Canonique
L’Héritage
Polymorphisme
Les Classes Abstraites
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Forme Canonique
Les opérateurs
Les Amis
Les Classes Template
La STL Pour qu’une classe soit sous la forme canonique de
L’Héritage
Polymorphisme
Coplien, elle doit possèder les quatre méthodes
Les Classes Abstraites suivantes (Ceci est nécessaire dés lors que la classe
dispose de pointeurs sur des parties dynamiques):
I Constructeur par défaut
I Constructeur de recopie
I Destructeur
I Opérateur d’affectation
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Le mot clé this
Les opérateurs
Les Amis I Le mot clé this est le symbole de
Les Classes Template
La STL
l’auto-référence.
L’Héritage I Lorsqu’une fonction membre est appelée elle
Polymorphisme
reçoit implicitement une référence vers l’objet
Les Classes Abstraites
appelant.
I En général, l’accès aux attributs privés se fait
de façon directe.
I Dans certain cas, on a besoin de connaı̂tre
l’adresse de l’objet appelant (insertion d’un
objet dans une liste)
I this est un pointeur vers cet objet appelant
I Il ne peut être utilisé que dans les fonctions
membres.
set.utbm.fr

Plan du Cours
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les opérateurs
Les Amis
Les Classes Template
La STL
Les opérateurs
L’Héritage
Polymorphisme
Les Classes Abstraites
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les opérateurs
Les opérateurs
Les Amis
Les Classes Template I Nous avons vu que les méthodes pouvait être
La STL surchargées...
L’Héritage
Polymorphisme I ... il est également possible d’effectuer cette
Les Classes Abstraites opération avec les opérateurs.
I Utilité: on peut utiliser le même opérateur
pour traiter des éléments de types différents.
I exemple : a + b peut correspondre à
I L’addition de deux entiers (int)
I L’addition de deux flottant (float)
I L’addition de deux flottant double précision
(double)
I ...
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les opérateurs : Exemple
Les opérateurs
Les Amis Pour redéfinir l’opérateur d’addition pour une
Les Classes Template
La STL classe point, il suffit de définir une fonction
L’Héritage memebre de nom operator+ et prenant 1
Polymorphisme
Les Classes Abstraites
paramètre de type point et retournant un objet de
même type (c = a + b;).
I En général on utilise le mot clé operator suivi
de l’opérateur concerné.
I Le premier opérande de l’opérateur est
transmis implicitement comme étant l’objet
appelant
I On se retrouve avec la fonction membre
suivante : point operator+(point)
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les opérateurs : Exemple
Les opérateurs
Les Amis
Les Classes Template
La STL I Il existe 2 façons d’utiliser la méthode :
L’Héritage
Polymorphisme
I c = a + b;
Les Classes Abstraites I c = a.operator+(b);
I Dans le cas d’objet de grande taille on peut
passer les arguments par référence.
I Ce n’est par contre pas systèmatique pour la
valeur de retour qui peut poser problème dans
certain cas (référence sur un objet local)
I Il faut se limiter aux opérateurs existants
set.utbm.fr

Plan du Cours
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les opérateurs
Les Amis
Les Classes Template
La STL Les Amis
L’Héritage
Polymorphisme
Les Classes Abstraites
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les Amis
Les opérateurs
Les Amis I On a vu que le masquage des données
Les Classes Template
La STL
impliquait un accés impossible aux membres
L’Héritage privés ou protégés d’une classe par une autre
Polymorphisme
classe indépendante.
Les Classes Abstraites
I Dans certain cas, il est utile d’avoir accès aux
membres privés d’une autre classe sans
changer le masquage. (beurk !!!!) (vecteur et
matrice)
I Pour cela nous allons utiliser des fonctions
amies
I L’amitié autorise l’accés à tous les membres
privés
I la déclaration se fait par le mot clé friend
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les Amis
Les opérateurs
Les Amis
Les Classes Template
La STL
L’Héritage Il existe plusieurs situation d’amitié :
Polymorphisme
Les Classes Abstraites
I Fonction indépendante, amie d’une classe
I Fonction membre d’une classe amie d’une
autre classe
I Fonction amie de plusieurs classes
I Toute les fonctions membres d’une classe,
amies d’une autre classe
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Fonction indépendante, amie d’une
Les opérateurs
Les Amis
classe : Exemple
Les Classes Template
La STL
L’Héritage friend point operator+(point,point);
Polymorphisme
I Contrairement à la surcharge proposée
Les Classes Abstraites
précédemment, le premier opérande est
explicite.
I Ce n’est plus une fonction membre de point.
I L’emplacement de la déclaration d’amitié est
indifférent.
I Les deux arguments peuvent éventuellement
être passé par référence.
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Fonction membre d’une classe amie
Les opérateurs
Les Amis
d’une autre classe : Exemple
Les Classes Template
La STL
L’Héritage I Supposons que nous ayons deux classes A et B
Polymorphisme
Les Classes Abstraites
et que dans B nous ayons une fonction
membre f de prototype : int f(char, A);
I Si f doit accéder aux champs privés de A elle
doit être déclarée comme amie dans A.
I La déclaration d’amitié se fait alors de la façon
suivante : friend int B::f(char, A);
I Il faut avoir compilé la classe B avant la classe
A
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Fonction amie de plusieurs classes :
Les opérateurs
Les Amis
Exemple
Les Classes Template
La STL
L’Héritage
Polymorphisme
Les Classes Abstraites I C’est le même principe que pour une méthode
non membre, amie d’une classe.
I Par exemple : on met friend void f(A,B);
dans les deux classes A et B.
I On définit ensuite la fonction void
f(A...,B...) où l’on veut.
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Toute les fonctions membres d’une
Les opérateurs
Les Amis
classe, amies d’une autre classe
Les Classes Template
La STL
L’Héritage
Polymorphisme
I C’est une généralisation du cas fonction
Les Classes Abstraites membre, amie d’une autre classe.
I On pourrait déclarer amie toutes les méthodes
concernées.
I Il est plus simple de placer dans la classe A
l’instruction suivante : friend class B;
I Dans ce cas toutes les fonctions membres de
la classe B sont amies de la classe A.
set.utbm.fr

Plan du Cours
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les opérateurs
Les Amis
Les Classes Template
La STL
Les Classes Templates
L’Héritage
Polymorphisme
Les Classes Abstraites
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Pour commencer : Les patrons de
Les opérateurs
Les Amis
fonctions
Les Classes Template
La STL
L’Héritage
Exemple de la fonction min pour les int:
Polymorphisme
Les Classes Abstraites
int min (int a, int b) {
if (a < b) return a;
else return b; }

ou

int min (int a, int b) { return a < b ?


a : b; }
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Pour commencer : Les patrons de
Les opérateurs
Les Amis
fonctions
Les Classes Template
La STL
L’Héritage
La même pour les float:
Polymorphisme
Les Classes Abstraites
float min (float a, float b) {
if ( a < b) return a;
else return b; }

ou

float min (float a, float b) { return a <


b ? a : b; }
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Pour commencer : Les patrons de
Les opérateurs
Les Amis
fonctions
Les Classes Template
La STL
L’Héritage
Polymorphisme
Les Classes Abstraites
I On voudrait refaire la même chose pour tous
les types. Il y a deux solutions:
I Faire un copier/coller pour tous les types.
(beurk !!!)
I Utiliser une fonction patron (ou template)
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Pour commencer : Les patrons de
Les opérateurs
Les Amis
fonctions
Les Classes Template
La STL
L’Héritage
Polymorphisme #include <iostream.h>
Les Classes Abstraites
template <classe T> T min (T a, T b) {
if (a < b) return a;
else return b; }
ou
template <classe T> T min (T a, T b) {
return a < b ? a : b; }
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Pour commencer : Les patrons de
Les opérateurs
Les Amis
fonctions
Les Classes Template
La STL
L’Héritage
Polymorphisme
Les Classes Abstraites I la mention template <class T> indique que
l’on utilise un patron (template) dans lequel
apparait un paramètre de type nommé T.
I L’entête précise ensuite que la fonction recoit
deux arguments de type T et retourne un
résultat du même type.
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Pour commencer : Les patrons de
Les opérateurs
Les Amis
fonctions
Les Classes Template
La STL
L’Héritage
Polymorphisme
Les Classes Abstraites
Utilisation main() {
int n=4, c=12;
cout  "min (n,c) = "  min(n,c)  "
n" ; // int min(int,int) }
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Pour commencer : Les patrons de
Les opérateurs
Les Amis
fonctions
Les Classes Template
La STL
L’Héritage I Les deux arguments de la fonction doivent
Polymorphisme impérativement être du même type!!!
Les Classes Abstraites
I On peut bien évidemment surcharger les
patrons de fonctions
I Il faut faire attention à la déclaration des
variables locales du même type que le
paramètre générique.
I On peut éventuellement spécialiser les patrons
(Ne marche pas avec tous les compilateurs)
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les patrons de classes
Les opérateurs
Les Amis
Les Classes Template
La STL
L’Héritage I Il est également possible de paramètrer une
Polymorphisme
famille de fonctions réunies dans une même
Les Classes Abstraites
classe.
I Il suffit de définir la classe tout entière comme
un patron.
template <class T> class point {
...
}
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les patrons de classes
Les opérateurs
Les Amis
Les Classes Template
La STL I De la même façon que pour les fonctions il
L’Héritage
peut y avoir plusieurs paramètres.
Polymorphisme
Les Classes Abstraites I On peut également utiliser un paramètre
expression permettant de conditionner les
membres de la classe.
template <class T, int n> class tableau {
T tab[n];
public :
...
}
set.utbm.fr

Plan du Cours
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les opérateurs
Les Amis
Les Classes Template
La STL La STL
L’Héritage
Polymorphisme
Les Classes Abstraites
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
La STL
Les opérateurs
Les Amis
Les Classes Template
La STL
L’Héritage I La bibliothèque STL (Standard Template
Polymorphisme
Les Classes Abstraites Library) est l’un des atouts de C++
I Elle fournit un ensemble de composants bien
structurés, cohérents et facilement adaptables.
I Il est facile d’utiliser les éléments de la STL
avec des algorithmes personnels ou des
structures de données personnelles.
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
La STL
Les opérateurs
Les Amis
Les Classes Template
La STL
L’Héritage
Polymorphisme
I Ici, uniquement les généralités vont être
Les Classes Abstraites présentées. Libre à vous ensuite d’approfondir
l’utilisation.
I La STL contient 5 types d’objets : des
containers, des itérateurs, des algorithmes, des
objets-fonctions et des adaptateurs. Nous
allons essentiellement détailler les 2 premiers.
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
La STL : Les containers
Les opérateurs
Les Amis
Les Classes Template
I Les containers ont des objets qui permettent
La STL de stocker d’autres objets.
L’Héritage
Polymorphisme
I Ils sont décris par des classes génériques les
Les Classes Abstraites plus courantes : listes, tableaux, ensembles,...
I Ces classes possèdent des méthodes pour
ajouter, retirer, rechercher, trier... des
éléments sans se préoccuper de la gestion de la
mémoire.
I Un certain nombre de méthodes sont
commune à tous les containers (push_back())
I D’autres méthodes sont spécifiques à la nature
du container.
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
La STL : Les containers
Les opérateurs
Les Amis
Les Classes Template
La STL Les containers peuvent manipuler n’importe quel
L’Héritage
type de donnée à condition de possèder les
Polymorphisme
Les Classes Abstraites
méthodes suivantes
I Un constructeur par défaut
I Un constructeur par recopie
I L’opérateur d’affectation
I L’opérateur d’égalité (==)
I L’opérateur inférieur (uniquement pour les tris)
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
La STL : Les containers
Les opérateurs
Les Amis
Les Classes Template
Les différents containers disponibles sont les
La STL suivants :
L’Héritage
Polymorphisme
I vector : implémentation des tableaux
Les Classes Abstraites I list : implémentation de listes doublement
chaı̂nées
I deque : idem vector mais avec mise à jour en
début à temps constant
I set : implémentation des ensembles (sans
doublons)
I multiset ; implémentation des ensembles (avec
doublons)
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
La STL : Les containers
Les opérateurs
Les Amis
Les Classes Template
La STL
L’Héritage
Polymorphisme
I map : ensembles avec une clé unique associé à
Les Classes Abstraites chacun des éléments
I multimap : équivalent de multiset pour les
map
I stack : implémentation d’une pile (liste LIFO)
I queue : implémentation d’une file (liste FIFO)
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
La STL : Les itérateurs
Les opérateurs
Les Amis
Les Classes Template
I Les itérateurs sont une généralisation des
La STL pointeurs qui permet au programmeur de
L’Héritage
travailler avec des container de façon uniforme.
Polymorphisme
Les Classes Abstraites I Ils permettent de spécifier une position à
l’intérieur du container.
I Ils peuvent être incrémentés, déréférencés ou
comparés entre eux.
I Tous les containers possèdent une méthode
begin() qui retourne un itérateur sur le
premier élément et d’une méthode end() qui
retourne un itérateur sur une place après le
dernier élément.
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
La STL : Les itérateurs
Les opérateurs
Les Amis
Les Classes Template
La STL
L’Héritage ...
Polymorphisme
list<int> lesEntiers;
Les Classes Abstraites
list<int>::iterator it;

for (it = lesEntiers.begin(); it != lesEntiers.end();


it++)
cout < < *it < <endl;
...
set.utbm.fr

Plan du Cours
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les opérateurs
Les Amis
Les Classes Template
La STL
L’Héritage
L’Héritage
Polymorphisme
Les Classes Abstraites
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
L’Héritage
Les opérateurs
Les Amis
Les Classes Template
La STL
L’Héritage
Polymorphisme I L’héritage est l’un des fondamentaux de la
Les Classes Abstraites
programmation orientée objet
I Il est à la base des possibilités de réutilisation
des composants logiciels.
I Il permet une dérivation d’une classe en une
classe dérivée plus spécialisée.
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
L’Héritage
Les opérateurs
Les Amis
Les Classes Template
La STL Par exemple :
L’Héritage
Polymorphisme
I On possède une classe Article comportant
Les Classes Abstraites les attributs suivants (nom, prixBrut,
quantité).
I On peut très bien construire une classe
Boisson à partir de cette classe en y ajoutant
uniquement un attribut supplémentaire
(volume)
I Et sans copier-coller sauvage !!!
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
L’Héritage : Terminologie
Les opérateurs
Les Amis
Les Classes Template
La STL I La dérivation de classe est la technique qui
L’Héritage
Polymorphisme
consite à faire hériter une classe d’une autre
Les Classes Abstraites classe.
I On dit qu’une classe B est dérivée d’une
classe A si elle en hérite.
I A est alors appelée la superclasse ou la classe
de base de la classe B
I la déclaration se fait de la manière suivante:
class B : <mode_dérivation> A {...}
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
L’Héritage : Les modes de
Les opérateurs
Les Amis
dérivation
Les Classes Template
La STL
Les modes de dérivations permettent de fixer le
L’Héritage statut (public, protected, private) des
Polymorphisme
membres (attributs, fonctions) de la classe B en
Les Classes Abstraites
fonction du statut des membres de la classe A. Les 3
principaux modes de dérivations sont les suivants:
I L’heritage de spécialisation : relation de type
”est un”
I L’héritage d’implémentation : relation de
type ”est implémenté en tant que”
I L’aggrégation ou Layering (attention ce n’est
pas tout à fait un héritage)
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
L’Héritage : Les modes de
Les opérateurs
Les Amis
dérivation
Les Classes Template
La STL
L’Héritage
Polymorphisme
Les Classes Abstraites
I Le mode par défaut en C++ est l’heritage
d’implémentation qui utilise le mot clé
private
I Par contre la méthode d’héritage la plus
utilisée est l’héritage de spécialisation invoquée
par le mot clé public
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
L’Héritage : Les modes de
Les opérateurs
Les Amis
dérivation
Les Classes Template
La STL
L’Héritage
Polymorphisme I Le troisième mode par layering est une
Les Classes Abstraites
solution intermédiaire qui utilise plus le
mécanisme de masquage lié à la C.O.O. que la
notion d’héritage.
I En C++ il est également possible d’hériter de
façon protégée en utilisant le mot clé
protected.
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
L’Héritage : Les modes de
Les opérateurs
Les Amis
dérivation
Les Classes Template
La STL
L’Héritage
Polymorphisme
Les Classes Abstraites

Récapitulatif des modes de dérivations en C++ :


set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
L’Héritage
Les opérateurs
Les Amis
Les Classes Template I Lors de la construction d’un objet, tous les
La STL
L’Héritage constructeurs de la hiérarchie d’héritage sont
Polymorphisme automatiquement appelé du plus général au
Les Classes Abstraites
plus particulier
I Lors de la destruction les destructeurs de la
hierarchie sont appelé du plus spécifique au
plus général.
I Lors d’une dérivation les méthodes et les
attributs sont tous hérités (modulo le mode de
dérivation) sauf, les méthodes correspondant à
la forme canonique de Coplien.
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
L’Héritage : Redéfinition de
Les opérateurs
Les Amis
méthodes
Les Classes Template
La STL I Il est possible de redéfinir des méthodes de la
L’Héritage classe mère dans une classe fille.
Polymorphisme
Les Classes Abstraites I L’entête de la méthode doit être identique à
l’originale.
I La méthode initiale reste utilisable mais il faut
la préfixer par le nom de la classe dans laquelle
elle a été définie.
I Lorsqu’une méthode surchargée est redéfinie
dans une classe fille, toutes les définitions de
base sont masquées (pas uniquement celle
redéfinie!!!)
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
L’Héritage : Conversion entre
Les opérateurs
Les Amis
objets de la même structure
Les Classes Template hiérachique
La STL
L’Héritage
Polymorphisme
Les Classes Abstraites Soit class B : public A
...
A a;
B b;
...
a = b ; // ceci est autorisé
b = a ; // ceci est rejeté
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
L’Héritage : Conversion entre
Les opérateurs
Les Amis
objets utilisant les pointeurs
Les Classes Template
La STL
L’Héritage
Polymorphisme
A * pa;
Les Classes Abstraites
B * pb;

pa = pb; // est autorisé


pb = pa; // est rejeté mais...
pb = (B * ) pa // est autorisé par le
compilateur !!!!!
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
L’Héritage Multiple
Les opérateurs
Les Amis
Les Classes Template
I Il est possible (depuis la version 2) d’utiliser de
La STL l’héritage multiple.
L’Héritage
Polymorphisme
I Ce principe pose un certain nombre de
Les Classes Abstraites problèmes de conception et de compilation
dans certain cas.
I On l’utilise en général pour bénéficier des
avantages d’un héritage de spécialisation avec
les contraintes d’un héritage d’implémentation.
I Dans la plupart des autres cas, le recours à
l’héritage multiple traduit un problème de
conception.
I Vous verez cette notion en détail en TD.
set.utbm.fr

Plan du Cours
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les opérateurs
Les Amis
Les Classes Template
Polymorphisme, Liaison
La STL Statique et Liaison
L’Héritage
Polymorphisme
Les Classes Abstraites
Dynamique
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Type statique, Type dynamique
Les opérateurs
Les Amis
Les Classes Template
La STL
L’Héritage
Polymorphisme I Le type Statique d’un objet ou d’un pointeur
Les Classes Abstraites
sur un objet (ou d’une référence) est le type
de sa déclaration dans le programme.
I Son type Dynamique est le type qu’il prend en
fonction de ses affectations/manipulations
I considéront l’exemple suivant:
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Type statique, Type dynamique
Les opérateurs
Les Amis
Les Classes Template
class A {
La STL
L’Héritage ...
Polymorphisme };
Les Classes Abstraites
class B : public A {
...
};
B unB;
...
A unA = unB;
A *ptrA = &unB;
A &refA = unB;}
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Type statique, Type dynamique
Les opérateurs
Les Amis
Les Classes Template
I Les trois affectations sont légitimes, elles font
La STL jouer la conversion standard d’une classe vers
L’Héritage une classe de base.
Polymorphisme
Les Classes Abstraites
I Le type de unA ne pose pas problème (c’est un
A). Par contre les types de ptrA et refA sont
plus ambigus. (prtA pointe-il vers un A ou un
B?)
I Le type statique de *ptrA (ce que ptrA
pointe) et de refA est A, car c’est de cette
façon qu’ils ont été déclarés.
I Le type dynamique de *ptrA et de refA est
B, car tel est le type des valeurs effectives de
ces variables.
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Type statique, Type dynamique:
Les opérateurs
Les Amis
Polymorphisme
Les Classes Template
La STL
L’Héritage I Le type statique d’une expression découle de
Polymorphisme
Les Classes Abstraites
l’analyse du texte du programme, il est connu
à la compilation.
I Le type dynamique, au contraire, est déterminé
par la valeur courante de l’expression, il peut
changer durant l’exécution du programme.
I Par conséquent, un pointeur sur un objet de
type A peut pointer vers un objet de type B.
C’est ce que l’on appelle le polymorphisme.
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Liaison statique, Liaison dynamique
Les opérateurs
Les Amis
Les Classes Template I Par défaut, les méthodes d’un objet sont liées
La STL
L’Héritage statiquement à la compilation.
Polymorphisme I Autrement dit, même si le type dynamique
Les Classes Abstraites
change au cours d’un programme, la liaison
avec les méthodes ne change pas (statique).
I Dans le cadre de l’exemple précédent, en
supposant que les classes A et B disposent
chacune d’une méthode void Affiche().
L’appel de *ptrA.Affiche() va faire appel à
la méthode A::Affiche() même si sont type
dynamique est B.
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Liaison statique, Liaison dynamique
Les opérateurs
Les Amis
Les Classes Template
La STL
L’Héritage I Il est possible en C++ d’effectuer une liaison
Polymorphisme
dynamique avec les méthodes (i.e. au moment
Les Classes Abstraites
de l’exécution).
I Cette liaison est également dite virtuelle.
I Pour cela, il suffit d’utiliser le mot clé
virtual lors de la première déclaration de la
méthode. (Et à chaque que l’on veut en faire
bénéficier les descendants d’une classe)
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Liaison statique, Liaison dynamique
Les opérateurs
Les Amis
Les Classes Template
La STL
L’Héritage
Polymorphisme I Dans l’exemple, il suffit de définir la méthode
Les Classes Abstraites
Affiche de la façon suivante dans A :
virtual void Affiche {...};...
I ... et de la redéfinir dans B
I L’exécution de *ptrA.Affiche() fera alors
appel à B::Affiche()
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Liaison dynamique : Intérêts
Les opérateurs
Les Amis
Les Classes Template
La STL
L’Héritage
Polymorphisme I La liaison dynamique est très utile lors de
Les Classes Abstraites
traitements génériques sur des objets
spécialisés issus de la même classe mère.
I Il suffit alors d’écrire les traitements sur des
objets du type de la classe mère et laisser la
liaison dynamique faire le reste.
set.utbm.fr

Plan du Cours
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les opérateurs
Les Amis
Les Classes Template
La STL Les Classes Abstraites
L’Héritage
Polymorphisme
Les Classes Abstraites
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les Classes Abstraites
Les opérateurs
Les Amis
Les Classes Template
I Il est possible de définir dans dans une classe
La STL des méthodes virtuelles pures, c’est à dire
L’Héritage dont l’entête est défini mais dont le corps n’est
Polymorphisme
Les Classes Abstraites
pas rédigé.
I L’écriture est la suivante: virtual void
affiche() = 0 ;
I Ceci oblige toutes les classes héritières à
redéfinir cette méthode en se conformant au
profil énoncé.
I On dit d’une classe qu’elle est abstraite à
partir du moment où elle possède au moins
une méthode virtuelle pure.
set.utbm.fr
LO43 : Bases fondamentales de la programmation orientée objet
Plan du Cours
Automne 2005
La C.O.O.
Introduction au C++
Les Classes
Constructeur-Destructeur
Forme Canonique
Les Classes Abstraites
Les opérateurs
Les Amis I On utilise en général les classes abstraites pour
Les Classes Template
La STL
définir une interface commune à toutes les
L’Héritage classes filles sans définir le contenu des
Polymorphisme
méthodes qui peut être lié à la nature
Les Classes Abstraites
spécifique de chaque classe.
I D’après la norme ANSI, il n’est pas possible
d’instancier une classe abstraite (pour des
raisons évidentes).
I Il n’y a donc pas a priori de constructeur.
I Cependant, un grand nombre de compilateurs
l’autorise. Ce qui implique la définition de
constructeur permettant d’initialiser certains
des attributs de la classe abstraite.

You might also like