Cours - LUTH - Observatoire de Paris
Cours - LUTH - Observatoire de Paris
Cours - LUTH - Observatoire de Paris
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Le langage C++:<br />
comment ça marche?<br />
Jérôme Novak<br />
Jerome.Novak@obspm.fr<br />
http://luth.obspm.fr/~luthier/novak<br />
Laboratoire Univers et Théories (<strong>LUTH</strong>)<br />
CNRS / <strong>Observatoire</strong> <strong>de</strong> <strong>Paris</strong> / Université <strong>Paris</strong> Di<strong>de</strong>rot<br />
Master 2 e année recherche, Septembre 2012
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Plan<br />
1 Introduction : Pourquoi le C++ ?<br />
2 La syntaxe (premiers pas)<br />
3 Les classes : orientation objet<br />
4 Héritage et polymorphisme<br />
5 ≪ En pratique ≫<br />
6 Pour aller plus loin ...
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Plan<br />
1 Introduction : Pourquoi le C++ ?<br />
2 La syntaxe (premiers pas)<br />
3 Les classes : orientation objet<br />
4 Héritage et polymorphisme<br />
5 ≪ En pratique ≫<br />
6 Pour aller plus loin ...
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Plan<br />
1 Introduction : Pourquoi le C++ ?<br />
2 La syntaxe (premiers pas)<br />
3 Les classes : orientation objet<br />
4 Héritage et polymorphisme<br />
5 ≪ En pratique ≫<br />
6 Pour aller plus loin ...
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Plan<br />
1 Introduction : Pourquoi le C++ ?<br />
2 La syntaxe (premiers pas)<br />
3 Les classes : orientation objet<br />
4 Héritage et polymorphisme<br />
5 ≪ En pratique ≫<br />
6 Pour aller plus loin ...
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Plan<br />
1 Introduction : Pourquoi le C++ ?<br />
2 La syntaxe (premiers pas)<br />
3 Les classes : orientation objet<br />
4 Héritage et polymorphisme<br />
5 ≪ En pratique ≫<br />
6 Pour aller plus loin ...
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Plan<br />
1 Introduction : Pourquoi le C++ ?<br />
2 La syntaxe (premiers pas)<br />
3 Les classes : orientation objet<br />
4 Héritage et polymorphisme<br />
5 ≪ En pratique ≫<br />
6 Pour aller plus loin ...
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Introduction<br />
1 Pourquoi le C++ ?<br />
2 État <strong>de</strong>s lieux<br />
3 Quelques notions pour démarrer<br />
4 Un avant-goût <strong>de</strong>s classes
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Intérêt du C++ ?<br />
langage orienté objet<br />
gestion dynamique <strong>de</strong> la mémoire<br />
écriture du co<strong>de</strong> très rigoureuse<br />
possibilité d’incorporer <strong>de</strong>s routines en C ou fortran<br />
possibilité <strong>de</strong> compiler les programmes C, avec le<br />
compilateur C++<br />
compilateurs disponibles et fiables (même gratuits !)<br />
norme respectée (norme 2011 ?)<br />
nombreuses bibliothèques<br />
existence d’outils pour le développement, l’optimisation, ...<br />
(Purify/Electric Fence/Valgrind, Doxygen,...)
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Pour et contre...<br />
⇒ Pour pouvoir gérer les co<strong>de</strong>s complexes<br />
⇒ Pour travailler à plusieurs sur un même projet<br />
(collaborateurs, visiteurs, ...)<br />
⇒ Pour réduire le temps <strong>de</strong> développement, <strong>de</strong> correction et<br />
<strong>de</strong> tests<br />
Mais<br />
Apprentissage long<br />
et complexe<br />
Légère perte en<br />
vitesse d’exécution
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Pour et contre...<br />
⇒ Pour pouvoir gérer les co<strong>de</strong>s complexes<br />
⇒ Pour travailler à plusieurs sur un même projet<br />
(collaborateurs, visiteurs, ...)<br />
⇒ Pour réduire le temps <strong>de</strong> développement, <strong>de</strong> correction et<br />
<strong>de</strong> tests<br />
Mais<br />
Apprentissage long<br />
et complexe<br />
Légère perte en<br />
vitesse d’exécution
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Pour et contre...<br />
⇒ Pour pouvoir gérer les co<strong>de</strong>s complexes<br />
⇒ Pour travailler à plusieurs sur un même projet<br />
(collaborateurs, visiteurs, ...)<br />
⇒ Pour réduire le temps <strong>de</strong> développement, <strong>de</strong> correction et<br />
<strong>de</strong> tests<br />
Mais<br />
Apprentissage long<br />
et complexe<br />
Légère perte en<br />
vitesse d’exécution
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Pour et contre...<br />
⇒ Pour pouvoir gérer les co<strong>de</strong>s complexes<br />
⇒ Pour travailler à plusieurs sur un même projet<br />
(collaborateurs, visiteurs, ...)<br />
⇒ Pour réduire le temps <strong>de</strong> développement, <strong>de</strong> correction et<br />
<strong>de</strong> tests<br />
Mais<br />
Apprentissage long<br />
et complexe<br />
Légère perte en<br />
vitesse d’exécution
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
... et ça marche !<br />
Certains co<strong>de</strong>s n’auraient jamais pu être écrits en fortran ou<br />
en C...
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Une organisation possible<br />
pour un projet complexe<br />
Python, perl, . . .<br />
Organisation <strong>de</strong>s co<strong>de</strong>s : données initiales, évolution,<br />
post-traitement, gestion <strong>de</strong>s entrées/sorties complexes,<br />
affichage, visualisation, . . .<br />
C++, java, . . .<br />
⇑<br />
Organisation <strong>de</strong>s objets : concepts mathématiques / physiques,<br />
structures <strong>de</strong> stockage, grands groupes d’opérations, . . .<br />
C, fortran, . . .<br />
Opérations élémentaires : algèbre linéaire, transformées <strong>de</strong><br />
Fourier, Newton-Raphson, . . .<br />
⇑
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Une organisation possible<br />
pour un projet complexe<br />
Python, perl, . . .<br />
Organisation <strong>de</strong>s co<strong>de</strong>s : données initiales, évolution,<br />
post-traitement, gestion <strong>de</strong>s entrées/sorties complexes,<br />
affichage, visualisation, . . .<br />
C++, java, . . .<br />
⇑<br />
Organisation <strong>de</strong>s objets : concepts mathématiques / physiques,<br />
structures <strong>de</strong> stockage, grands groupes d’opérations, . . .<br />
C, fortran, . . .<br />
Opérations élémentaires : algèbre linéaire, transformées <strong>de</strong><br />
Fourier, Newton-Raphson, . . .<br />
⇑
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Une organisation possible<br />
pour un projet complexe<br />
Python, perl, . . .<br />
Organisation <strong>de</strong>s co<strong>de</strong>s : données initiales, évolution,<br />
post-traitement, gestion <strong>de</strong>s entrées/sorties complexes,<br />
affichage, visualisation, . . .<br />
C++, java, . . .<br />
⇑<br />
Organisation <strong>de</strong>s objets : concepts mathématiques / physiques,<br />
structures <strong>de</strong> stockage, grands groupes d’opérations, . . .<br />
C, fortran, . . .<br />
Opérations élémentaires : algèbre linéaire, transformées <strong>de</strong><br />
Fourier, Newton-Raphson, . . .<br />
⇑
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Quelques documents utiles<br />
Un serveur <strong>de</strong> documents et <strong>de</strong> ressources sur le C/C++ :<br />
www.cplusplus.com/main.html ;<br />
Le cours <strong>de</strong> C++ du Laboratoire Jacques-Louis Lions<br />
(labo d’analyse numérique <strong>de</strong> Jussieu) sur<br />
www.ann.jussieu.fr/courscpp.<br />
LE manuel <strong>de</strong> référence : Le langage C++, <strong>de</strong> Bjarne<br />
Stroustrup, Eds. Vuibert.<br />
Un livre très complet : Langage C++ – Le standard<br />
ANSI/ISO expliqué, <strong>de</strong> Jacquelin Charbonnel, Eds. Dunod.<br />
Mon petit poly en anglais :<br />
www.lorene.obspm.fr/cpp digest.pdf.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Où va-t-on ?<br />
un cours théorique (∼ 8 h),<br />
<strong>de</strong>s TP d’application directe et <strong>de</strong> familiarisation (∼ 8<br />
h),<br />
<strong>de</strong>s TP <strong>de</strong> conception <strong>de</strong> co<strong>de</strong>s plus élaborés, qui<br />
seront éventuellement utilisés pour le projet <strong>de</strong><br />
modélisation numérique (s’il reste du temps ! !).<br />
... le tout mélangé au cours <strong>de</strong>s séances.<br />
Objectif <strong>de</strong>s TP ≪ élaborés ≫ :<br />
Résoudre une équation différentielle du second ordre à<br />
coefficients constants avec second membre.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Où va-t-on ?<br />
un cours théorique (∼ 8 h),<br />
<strong>de</strong>s TP d’application directe et <strong>de</strong> familiarisation (∼ 8<br />
h),<br />
<strong>de</strong>s TP <strong>de</strong> conception <strong>de</strong> co<strong>de</strong>s plus élaborés, qui<br />
seront éventuellement utilisés pour le projet <strong>de</strong><br />
modélisation numérique (s’il reste du temps ! !).<br />
... le tout mélangé au cours <strong>de</strong>s séances.<br />
Objectif <strong>de</strong>s TP ≪ élaborés ≫ :<br />
Résoudre une équation différentielle du second ordre à<br />
coefficients constants avec second membre.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
État <strong>de</strong>s lieux<br />
compilateur (compilation, lien)<br />
système Unix/Linux (base, éditeur, makefile,<br />
...)<br />
programmation (pointeurs, programmation<br />
orientée objet)<br />
C++ ...
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
État <strong>de</strong>s lieux<br />
compilateur (compilation, lien)<br />
système Unix/Linux (base, éditeur, makefile,<br />
...)<br />
programmation (pointeurs, programmation<br />
orientée objet)<br />
C++ ...
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
État <strong>de</strong>s lieux<br />
compilateur (compilation, lien)<br />
système Unix/Linux (base, éditeur, makefile,<br />
...)<br />
programmation (pointeurs, programmation<br />
orientée objet)<br />
C++ ...
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
État <strong>de</strong>s lieux<br />
compilateur (compilation, lien)<br />
système Unix/Linux (base, éditeur, makefile,<br />
...)<br />
programmation (pointeurs, programmation<br />
orientée objet)<br />
C++ ...
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
État <strong>de</strong>s lieux<br />
compilateur (compilation, lien)<br />
système Unix/Linux (base, éditeur, makefile,<br />
...)<br />
programmation (pointeurs, programmation<br />
orientée objet)<br />
C++ ...
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Quelques notions pour démarrer<br />
programme/sous-programme → fonctions en C/C++<br />
variables<br />
types<br />
pointeurs<br />
références<br />
tableaux<br />
fonctions<br />
allocation dynamique <strong>de</strong> mémoire<br />
et <strong>de</strong>s conventions :<br />
déclaration<br />
définition<br />
concepteur/utilisateur
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Quelques notions pour démarrer<br />
programme/sous-programme → fonctions en C/C++<br />
variables<br />
types<br />
pointeurs<br />
références<br />
tableaux<br />
fonctions<br />
allocation dynamique <strong>de</strong> mémoire<br />
et <strong>de</strong>s conventions :<br />
déclaration<br />
définition<br />
concepteur/utilisateur
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Illustration<br />
Un co<strong>de</strong> qui ne sert à rien : exemple1.cpp<br />
// hea<strong>de</strong>rs C++<br />
#inclu<strong>de</strong> <br />
#inclu<strong>de</strong> <br />
// hea<strong>de</strong>rs C<br />
#inclu<strong>de</strong> <br />
#inclu<strong>de</strong> <br />
// // hea<strong>de</strong>rs maison<br />
#inclu<strong>de</strong> "ma_fonction.h //Il faut mettre la les fichiers <strong>de</strong>clarant<br />
//<strong>de</strong>s fonctions et classes qui ne font pas<br />
//partie du systeme.<br />
using namespace std ;<br />
/* Ce programme ne fait pas<br />
grand chose, sinon <strong>de</strong> montrer<br />
une syntaxe "<strong>de</strong> base" */<br />
int main(){<br />
const int nmax = 200 ;<br />
double tableau1[nmax] ;<br />
char dim[] = "taille" ;<br />
cout
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Illustration<br />
Un co<strong>de</strong> qui ne sert à rien : exemple1.cpp<br />
if ((taille200)) {<br />
cout
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Illustration<br />
Un co<strong>de</strong> qui ne sert à rien : ma fonction.h<br />
// <strong>de</strong>claration seule d’une fonction<br />
double ma_fonction(double , int) ;
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
TP n o 1<br />
Le programme ≪ bonjour le Mon<strong>de</strong> ! ≫<br />
Objectifs :<br />
1 se familiariser avec l’environnement...<br />
2 compiler avec un Makefile<br />
3 écrire et exécuter un programme affichant<br />
une phrase et effectuant un calcul après<br />
l’entrée <strong>de</strong>s données par l’utilisateur<br />
4 éventuellement, ce programme construira un<br />
tableau <strong>de</strong> taille donnée par l’utilisateur au<br />
moment <strong>de</strong> l’exécution
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
C++ C amélioré ?<br />
⇒pas seulement !<br />
langage très typé, même pour les pointeurs<br />
utilisation <strong>de</strong> références<br />
surcharge <strong>de</strong> fonctions<br />
utilisation <strong>de</strong> classes...<br />
... et <strong>de</strong> ≪ patrons ≫(modèles) <strong>de</strong> classes, <strong>de</strong><br />
fonctions.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Les classes : le début<br />
Une classe contient <strong>de</strong>s données (variables <strong>de</strong> types pré-définis<br />
ou autres classes) et <strong>de</strong>s fonctions. Elle est la généralisation du<br />
concept <strong>de</strong> type dans les langages informatiques.<br />
Pour les classes simples, les données représentent l’information<br />
contenue dans la classe et les fonctions décrivent à l’ordinateur<br />
la façon <strong>de</strong> la gérer.<br />
Il existe quatre fonctions ≪ obligatoires ≫ :<br />
le constructeur par défaut<br />
le constructeur par recopie<br />
le <strong>de</strong>structeur<br />
l’opérateur d’affectation
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
// Declaration <strong>de</strong> la classe "Ma_classe"<br />
#ifn<strong>de</strong>f __MA_CLASSE_H_ // Pour eviter les <strong>de</strong>clarations multiples<br />
#<strong>de</strong>fine __MA_CLASSE_H_<br />
// hea<strong>de</strong>rs C++<br />
#inclu<strong>de</strong> // Eventuellement , , ...<br />
// hea<strong>de</strong>rs C<br />
#inclu<strong>de</strong> <br />
// + hea<strong>de</strong>rs perso s’il y en a ... #inclu<strong>de</strong> "???"<br />
using namespace std ;<br />
class Ma_classe {<br />
// Donnees :<br />
protected:<br />
int entier_membre_1 ; double reel_membre_1 ; //etc...<br />
// Constructeurs<br />
public:<br />
Ma_classe(char*, int, double, ...) ; // Constructeur standard<br />
Ma_classe(const Ma_classe& ) ; // Constructeur par copie<br />
// Destructeur<br />
virtual ~Ma_classe() ;<br />
// Operateur d’affectation<br />
void operator=(const Ma_classe&) ;<br />
// Affichage (non obligatiore, mais tres utile)<br />
friend ostream& operator
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
// Definition <strong>de</strong> Ma_classe<br />
// hea<strong>de</strong>rs perso : les hea<strong>de</strong>rs C++ / C sont inclus dans ma_classe.h<br />
#inclu<strong>de</strong> "ma_classe.h"<br />
// Constructeur<br />
Ma_classe::Ma_classe() { // Eventuellement avec <strong>de</strong>s parametres<br />
cout
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Les classes : un exemple<br />
Une classe Fiche contient :<br />
le nom ⇒<strong>de</strong> type ≪ chaîne <strong>de</strong> caractères ≫ (char*)<br />
le prénom ⇒<strong>de</strong> type ≪ chaîne <strong>de</strong> caractères ≫ (char*)<br />
l’âge ⇒<strong>de</strong> type entier (int)<br />
le numéro ⇒<strong>de</strong> type entier (int)
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
fiche.h<br />
// Declaration <strong>de</strong> la classe "Fiche"<br />
#ifn<strong>de</strong>f __FICHE_H_<br />
#<strong>de</strong>fine __FICHE_H_<br />
// hea<strong>de</strong>rs C++<br />
#inclu<strong>de</strong> <br />
// hea<strong>de</strong>rs C<br />
#inclu<strong>de</strong> <br />
using namespace std ;<br />
class Fiche {<br />
// Donnees :<br />
protected:<br />
char* nom ;<br />
char* prenom ;<br />
int age ;<br />
int matricule ;<br />
// Constructeurs<br />
public:<br />
Fiche(const char* nom_i, const char* prenom_i, int age_i,<br />
int matricule_i) ; // Constructeur standard<br />
Fiche(const Fiche& fiche_arg) ; // Constructeur par copie<br />
// Destructeur<br />
virtual ~Fiche() ;<br />
// Operateur d’affectation<br />
void operator=(const Fiche& fiche_arg) ;
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
fiche.h<br />
// Acces aux donnees ...<br />
// ... en lecture seule<br />
const char* lit_nom() const ;<br />
const char* lit_prenom() const ;<br />
int lit_age() const ;<br />
int lit_matricule() const ;<br />
// ... en lecture / ecriture<br />
void change_nom(const char* nom_i) ;<br />
void change_prenom(const char* nom_i) ;<br />
void change_age(int age_i) ;<br />
void change_matricule(int matricule_i) ;<br />
// Affichage (non obligatiore, mais tres utile)<br />
friend ostream& operator
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
fiche.cpp<br />
// Definition <strong>de</strong> Fiche<br />
#inclu<strong>de</strong> <br />
#inclu<strong>de</strong> "fiche.h"<br />
// Constructeur<br />
Fiche::Fiche(const char* nom_i, const char* prenom_i, int age_i, int matricule_i):<br />
nom(0x0), prenom(0x0), age(age_i), matricule(matricule_i)<br />
{<br />
int l_nom = strlen(nom_i) + 1;<br />
nom = new char[l_nom] ;<br />
strcpy(nom, nom_i) ;<br />
}<br />
int l_pnom = strlen(prenom_i) + 1 ;<br />
prenom = new char[l_pnom] ;<br />
strcpy(prenom, prenom_i) ;<br />
// Constructeur par Copie<br />
Fiche::Fiche(const Fiche & fiche_arg) :<br />
nom(0x0), prenom(0x0), age(fiche_arg.age), matricule(fiche_arg.matricule)<br />
{<br />
int l_nom = strlen(fiche_arg.nom) + 1 ;<br />
nom = new char[l_nom] ;<br />
strcpy(nom, fiche_arg.nom) ;<br />
}<br />
int l_pnom = strlen(fiche_arg.prenom) + 1 ;<br />
prenom = new char[l_pnom] ;<br />
strcpy(prenom, fiche_arg.prenom) ;
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
fiche.cpp<br />
// Destructeur<br />
Fiche::~Fiche() {<br />
if (nom != 0x0) <strong>de</strong>lete [] nom ;<br />
if (prenom != 0x0) <strong>de</strong>lete [] prenom ;<br />
}<br />
// Operateur d’affectation<br />
void Fiche::operator=(const Fiche & fiche_arg) {<br />
if (nom != 0x0) <strong>de</strong>lete [] nom ;<br />
int l_nom = strlen(fiche_arg.nom) + 1 ;<br />
nom = new char[l_nom] ;<br />
strcpy(nom, fiche_arg.nom) ;<br />
if (prenom !=0x0) <strong>de</strong>lete [] prenom ;<br />
int l_pnom = strlen(fiche_arg.prenom) + 1 ;<br />
prenom = new char[l_pnom] ;<br />
strcpy(prenom, fiche_arg.prenom) ;<br />
age = fiche_arg.age ;<br />
matricule = fiche_arg.matricule ;<br />
return ;<br />
}<br />
const char* Fiche::lit_nom() const { return nom ; }<br />
const char* Fiche::lit_prenom() const { return prenom ; }<br />
int Fiche::lit_age() const { return age ; }<br />
int Fiche::lit_matricule() const { return matricule ; }
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
fiche.cpp<br />
void Fiche::change_nom(const char* nom_i)<br />
{<br />
if (nom != 0x0) <strong>de</strong>lete [] nom ;<br />
int l_nom = strlen(nom_i) + 1 ;<br />
nom = new char[l_nom] ;<br />
strcpy(nom, nom_i) ;<br />
}<br />
return ;<br />
void Fiche::change_prenom(const char* prenom_i)<br />
{<br />
if (prenom !=0x0) <strong>de</strong>lete [] prenom ;<br />
int l_pnom = strlen(prenom_i) + 1 ;<br />
prenom = new char[l_pnom] ;<br />
strcpy(prenom, prenom_i) ;<br />
}<br />
return ;<br />
void Fiche::change_age(int age_i) { age = age_i ; }<br />
void Fiche::change_matricule(int matricule_i) { matricule = matricule_i ; }<br />
// Affichage a l’ecran<br />
ostream& operator
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
programme principal<br />
Exemple<br />
// hea<strong>de</strong>rs systeme<br />
#inclu<strong>de</strong><br />
// hea<strong>de</strong>rs maison<br />
#inclu<strong>de</strong> "fiche.h"<br />
int main(){<br />
const int longueur = 30 ;<br />
char un_nom[longueur] ;<br />
cout > un_nom ;<br />
char un_prenom[longueur] ;<br />
cout > un_prenom ;<br />
cout > un_age ;<br />
cout > un_matricule ;<br />
Fiche f1(un_nom, un_prenom, un_age, un_matricule) ;<br />
cout
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
TP n o 2<br />
une classe simple <strong>de</strong> rationnels<br />
1 construire une classe rationnel qui représente un nombre<br />
du type a/b, où a et b sont <strong>de</strong>s entiers.<br />
2 doter la classe rationnel <strong>de</strong> l’arithmétique exacte <strong>de</strong>s<br />
rationnels.<br />
3 être capable d’afficher le résultat d’un calcul du genre :<br />
rationnel(420,315) + 5 qui soit plutôt 19/3...<br />
Il faut commencer par concevoir la classe, ce qui se fait le<br />
mieux en écrivant les déclarations.<br />
⇒expliquer à l’ordinateur comment va fonctionner ce nouveau<br />
type.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
TP n o 2<br />
une classe simple <strong>de</strong> rationnels<br />
1 construire une classe rationnel qui représente un nombre<br />
du type a/b, où a et b sont <strong>de</strong>s entiers.<br />
2 doter la classe rationnel <strong>de</strong> l’arithmétique exacte <strong>de</strong>s<br />
rationnels.<br />
3 être capable d’afficher le résultat d’un calcul du genre :<br />
rationnel(420,315) + 5 qui soit plutôt 19/3...<br />
Il faut commencer par concevoir la classe, ce qui se fait le<br />
mieux en écrivant les déclarations.<br />
⇒expliquer à l’ordinateur comment va fonctionner ce nouveau<br />
type.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Le programme principal<br />
#inclu<strong>de</strong><br />
//Declarations of the class rational<br />
#inclu<strong>de</strong> "rational.h"<br />
int main(){<br />
}<br />
rational p(420,315) ; // 420/315, simplified<br />
// by the constructor<br />
cout
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Syntaxe (premiers pas)<br />
1 Les types <strong>de</strong> variables<br />
2 Les fonctions<br />
3 Les instructions<br />
4 Les pointeurs, références et allocation <strong>de</strong><br />
mémoire<br />
5 Les entrées/sorties basiques<br />
6 Les constantes<br />
NB : tout ce qui marche en C, marche aussi en<br />
C++ !
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Syntaxe (premiers pas)<br />
1 Les types <strong>de</strong> variables<br />
2 Les fonctions<br />
3 Les instructions<br />
4 Les pointeurs, références et allocation <strong>de</strong><br />
mémoire<br />
5 Les entrées/sorties basiques<br />
6 Les constantes<br />
NB : tout ce qui marche en C, marche aussi en<br />
C++ !
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Les types <strong>de</strong> variables<br />
int annee=2002 ;<br />
float epsilon1=1e-8 ;<br />
double epsilon2=1e-16 ;<br />
char lettre=’w’ ;<br />
bool condition=true ;<br />
Les variables peuvent être déclarées à n’importe quel endroit du<br />
co<strong>de</strong>, mais elles doivent toujours être déclarées avant leur<br />
utilisation.<br />
La portée d’une déclaration est locale, c’est-à-dire elle ne vaut<br />
que dans le bloc { ... } où elle a été faite.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Les fonctions<br />
Tout doit être déclaré :<br />
double Tchebychev (double x, int <strong>de</strong>gre) ; :<br />
d’abord dans les en-têtes (fichiers.h) <strong>de</strong> tous les<br />
programmes (routines) qui vont l’utiliser, ⇒déclaration<br />
(attention aux déclarations multiples !)<br />
puis elle doit être programmée dans un fichier.C (ou<br />
fichier.cpp). ⇒définition<br />
Si la fonction ne retourne rien (par exemple affichage) elle<br />
est <strong>de</strong> la forme void diagonalise (Matrice& T) ;.<br />
Les fonctions mathématiques (sin, cos, log, pow, exp, sqrt,<br />
fabs, ...) sont déclarées dans .<br />
On peut aussi définir une fonction dans le<br />
≪ fichier.h ≫(inline).
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Arguments par défaut<br />
Certains arguments d’une fonction peuvent prendre souvent la<br />
même valeur.<br />
Pour ne pas avoir à spécifier ces valeurs à chaque appel <strong>de</strong> la<br />
fonction, le C++ permet <strong>de</strong> donner <strong>de</strong>s valeurs par défaut dans<br />
la déclaration <strong>de</strong> la fonction (ils doivent être mis à la fin <strong>de</strong> la<br />
liste !).<br />
void affiche(int valeur, int base = 10);<br />
void main() {<br />
affiche(16) ; // affiche 16 en base 10<br />
affiche(16,2) ; // affiche 16 en base 2<br />
}<br />
et dans la définition :<br />
void affiche(int valeur, int base) { ... }
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Les instructions<br />
for(i=0; i
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Pointeurs<br />
Un pointeur sur une variable est l’adresse en<br />
mémoire <strong>de</strong> cette variable :<br />
int g ;<br />
int *point = &g ;<br />
point contient l’adresse <strong>de</strong> g, il est <strong>de</strong> la forme<br />
0x0045a3f9 (en hexadécimal).<br />
En C++ un pointeur est typé : un int * n’est<br />
pas compatible avec un double *.<br />
Par défaut, un pointeur pointe sur 0x0 (pointeur<br />
nul)
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Tableaux<br />
Un tableau est un pointeur sur le premier<br />
élément.<br />
int tab[10]; ⇒tab est du type int * et<br />
contient l’adresse <strong>de</strong> du premier élément<br />
(tab[0]).<br />
Dans ce type <strong>de</strong> déclarations (double<br />
tab[N]), N doit pouvoir être calculé à la<br />
compilation (allocation statique).<br />
Avec : int *ptr = tab ;<br />
ptr++ ;<br />
que vaut ptr[0] ?<br />
NB : On peut définir int tab3[N3][N2][N1]
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Tableaux<br />
Un tableau est un pointeur sur le premier<br />
élément.<br />
int tab[10]; ⇒tab est du type int * et<br />
contient l’adresse <strong>de</strong> du premier élément<br />
(tab[0]).<br />
Dans ce type <strong>de</strong> déclarations (double<br />
tab[N]), N doit pouvoir être calculé à la<br />
compilation (allocation statique).<br />
Avec : int *ptr = tab ;<br />
ptr++ ;<br />
que vaut ptr[0] ?<br />
NB : On peut définir int tab3[N3][N2][N1]
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Gestion dynamique <strong>de</strong> la mémoire<br />
Pour avoir un tableau <strong>de</strong> taille définie au cours <strong>de</strong><br />
l’exécution (par exemple, donnée par l’utilisateur), il faut<br />
faire <strong>de</strong>s allocations dynamiques :<br />
type *tab dynamique ;<br />
tab dynamique = new type[un entier] ;<br />
Cet espace <strong>de</strong> la mémoire DOIT être rendu quand on ne<br />
s’en sert plus (à défaut, à la fin du programme) par :<br />
<strong>de</strong>lete[] tab;<br />
Il n’y a aucun contrôle sur l’accès aux éléments d’un<br />
tableau.<br />
⇒la gestion dynamique <strong>de</strong> la mémoire est délicate. Il est<br />
bon <strong>de</strong> bien séparer les parties concepteur/utilisateur et d’<br />
utiliser <strong>de</strong>s outils <strong>de</strong> développement.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Gestion dynamique <strong>de</strong> la mémoire<br />
Pour avoir un tableau <strong>de</strong> taille définie au cours <strong>de</strong><br />
l’exécution (par exemple, donnée par l’utilisateur), il faut<br />
faire <strong>de</strong>s allocations dynamiques :<br />
type *tab dynamique ;<br />
tab dynamique = new type[un entier] ;<br />
Cet espace <strong>de</strong> la mémoire DOIT être rendu quand on ne<br />
s’en sert plus (à défaut, à la fin du programme) par :<br />
<strong>de</strong>lete[] tab;<br />
Il n’y a aucun contrôle sur l’accès aux éléments d’un<br />
tableau.<br />
⇒la gestion dynamique <strong>de</strong> la mémoire est délicate. Il est<br />
bon <strong>de</strong> bien séparer les parties concepteur/utilisateur et d’<br />
utiliser <strong>de</strong>s outils <strong>de</strong> développement.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Gestion dynamique <strong>de</strong> la mémoire<br />
Pour avoir un tableau <strong>de</strong> taille définie au cours <strong>de</strong><br />
l’exécution (par exemple, donnée par l’utilisateur), il faut<br />
faire <strong>de</strong>s allocations dynamiques :<br />
type *tab dynamique ;<br />
tab dynamique = new type[un entier] ;<br />
Cet espace <strong>de</strong> la mémoire DOIT être rendu quand on ne<br />
s’en sert plus (à défaut, à la fin du programme) par :<br />
<strong>de</strong>lete[] tab;<br />
Il n’y a aucun contrôle sur l’accès aux éléments d’un<br />
tableau.<br />
⇒la gestion dynamique <strong>de</strong> la mémoire est délicate. Il est<br />
bon <strong>de</strong> bien séparer les parties concepteur/utilisateur et d’<br />
utiliser <strong>de</strong>s outils <strong>de</strong> développement.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Gestion dynamique <strong>de</strong> la mémoire<br />
Pour avoir un tableau <strong>de</strong> taille définie au cours <strong>de</strong><br />
l’exécution (par exemple, donnée par l’utilisateur), il faut<br />
faire <strong>de</strong>s allocations dynamiques :<br />
type *tab dynamique ;<br />
tab dynamique = new type[un entier] ;<br />
Cet espace <strong>de</strong> la mémoire DOIT être rendu quand on ne<br />
s’en sert plus (à défaut, à la fin du programme) par :<br />
<strong>de</strong>lete[] tab;<br />
Il n’y a aucun contrôle sur l’accès aux éléments d’un<br />
tableau.<br />
⇒la gestion dynamique <strong>de</strong> la mémoire est délicate. Il est<br />
bon <strong>de</strong> bien séparer les parties concepteur/utilisateur et d’<br />
utiliser <strong>de</strong>s outils <strong>de</strong> développement.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Références<br />
double a; double& ref a = a désigne une référence sur a,<br />
il s’agit d’un synonyme (ou équivalent) <strong>de</strong> a.<br />
Les références sont surtout utilisées pour passer <strong>de</strong>s arguments<br />
aux fonctions, ou pour la valeur <strong>de</strong> retour <strong>de</strong>s fonctions (à<br />
éviter).<br />
On ne peut pas déclarer int &a seul, mais on utilise :<br />
void swap(int &x, int &y) {<br />
int z = x ;<br />
x = y ; y = z ; }<br />
et dans le programme principal :<br />
int a=1; int b=2 ;<br />
swap(a,b) ;<br />
Contrairement aux pointeurs, toute modification <strong>de</strong> la référence<br />
modifie aussi l’objet original !
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Références<br />
double a; double& ref a = a désigne une référence sur a,<br />
il s’agit d’un synonyme (ou équivalent) <strong>de</strong> a.<br />
Les références sont surtout utilisées pour passer <strong>de</strong>s arguments<br />
aux fonctions, ou pour la valeur <strong>de</strong> retour <strong>de</strong>s fonctions (à<br />
éviter).<br />
On ne peut pas déclarer int &a seul, mais on utilise :<br />
void swap(int &x, int &y) {<br />
int z = x ;<br />
x = y ; y = z ; }<br />
et dans le programme principal :<br />
int a=1; int b=2 ;<br />
swap(a,b) ;<br />
Contrairement aux pointeurs, toute modification <strong>de</strong> la référence<br />
modifie aussi l’objet original !
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
valeur, pointeur et référence<br />
En C++, il existe trois façon d’accé<strong>de</strong>r à une variable. Après<br />
avoir déclaré int a; soit<br />
par sa valeur<br />
a = 5;<br />
cout
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
valeur, pointeur et référence<br />
En C++, il existe trois façon d’accé<strong>de</strong>r à une variable. Après<br />
avoir déclaré int a; soit<br />
par sa valeur<br />
a = 5;<br />
cout
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
valeur, pointeur et référence<br />
En C++, il existe trois façon d’accé<strong>de</strong>r à une variable. Après<br />
avoir déclaré int a; soit<br />
par sa valeur<br />
a = 5;<br />
cout
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Entrées et sorties simples<br />
Le C++ dispose <strong>de</strong> ≪ flots ≫d’entrées/sorties standard,<br />
déclarés dans (il faut aussi déclarer :<br />
using namespace std ;)<br />
cout qui correspond à la sortie standard (≪ à<br />
l’écran ≫),<br />
cin qui correspond à l’entrée standard.<br />
On écrira donc :<br />
int n;<br />
cout n ; "endl" est ici un manipulateur qui est<br />
équivalent à une fin <strong>de</strong> ligne.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Les constantes<br />
Elles sont obligatoires pour les dimensions <strong>de</strong>s tableaux<br />
non-dynamiques.<br />
Elles sont fortement conseillées pour protéger les<br />
variables en écriture.<br />
Plus concrètement :<br />
const double est un cas particulier <strong>de</strong> double.<br />
const int *ptr veut dire que la variable pointée est<br />
constante, mais pas l’adresse. Pour cela, il faut écrire<br />
int *const ptr<br />
const int& ref est similaire au cas <strong>de</strong>s pointeurs :<br />
la variable référencée ne peut pas être modifiée à<br />
travers cette référence.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Les constantes<br />
Elles sont obligatoires pour les dimensions <strong>de</strong>s tableaux<br />
non-dynamiques.<br />
Elles sont fortement conseillées pour protéger les<br />
variables en écriture.<br />
Plus concrètement :<br />
const double est un cas particulier <strong>de</strong> double.<br />
const int *ptr veut dire que la variable pointée est<br />
constante, mais pas l’adresse. Pour cela, il faut écrire<br />
int *const ptr<br />
const int& ref est similaire au cas <strong>de</strong>s pointeurs :<br />
la variable référencée ne peut pas être modifiée à<br />
travers cette référence.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Les classes<br />
orientation objets<br />
1 Les membres : données et fonctions<br />
2 Les membres ≪ obligatoires ≫<br />
3 Restrictions d’accès aux membres<br />
4 Surcharge <strong>de</strong> fonctions<br />
5 Membres constants<br />
6 TP n o 3 : une classe <strong>de</strong> stockage <strong>de</strong> réels
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Les membres<br />
données et fonctions<br />
Le programmeur peut définir ses propres ≪ types ≫et les<br />
fonctions qui leurs sont associées.<br />
Une classe Alpha est ainsi constituée :<br />
<strong>de</strong> données : variables, pointeurs, tableaux... ou d’objets<br />
d’autres classes !<br />
et <strong>de</strong> fonctions.<br />
⇒Ce sont les membres <strong>de</strong> la classe Alpha.<br />
Les membres (données et fonctions) définissent une classe.<br />
La déclaration d’un objet <strong>de</strong> la classe s’appelle une instance <strong>de</strong><br />
la classe.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Implémentation d’une classe<br />
Déclaration<br />
class Alpha { int entier1 ; // les données ...<br />
double reel1 ;<br />
Beta autre objet ;<br />
int *tableau ; //alloué dynamiquement par le<br />
constructeur ou une fonction membre<br />
...<br />
double fonction1(const int&) ;<br />
Alpha *fonction2(double, const Gamma&) ;};<br />
Définition<br />
Si elle n’est pas dans le bloc <strong>de</strong> déclaration :<br />
double Alpha::fonction1(const int& i) { ... } et<br />
on peut utiliser le pointeur this ainsi que tous les membres.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Implémentation d’une classe<br />
Déclaration<br />
class Alpha { int entier1 ; // les données ...<br />
double reel1 ;<br />
Beta autre objet ;<br />
int *tableau ; //alloué dynamiquement par le<br />
constructeur ou une fonction membre<br />
...<br />
double fonction1(const int&) ;<br />
Alpha *fonction2(double, const Gamma&) ;};<br />
Définition<br />
Si elle n’est pas dans le bloc <strong>de</strong> déclaration :<br />
double Alpha::fonction1(const int& i) { ... } et<br />
on peut utiliser le pointeur this ainsi que tous les membres.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Utilisation<br />
Dans le programme principal, l’utilisation d’une<br />
classe se fait <strong>de</strong> la manière suivante (après l’avoir<br />
déclarée) :<br />
Alpha a; //instance <strong>de</strong> Alpha<br />
Alpha *pta ; // pas instance <strong>de</strong> Alpha<br />
a.reel1 = 1.2 ;<br />
pta->entier1 = 37 ;<br />
double d = a.fonction1(3) ;<br />
const Gamma g;<br />
a = *pta->fonction2(3.4, g) ;
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Membres obligatoires<br />
Dans chaque classe il faut qu’il y ait 4 fonctions membres<br />
≪ spéciales ≫, sinon, elles seront créées par le compilateur...<br />
au moins un constructeur (autre que copie)<br />
un <strong>de</strong>structeur<br />
un constructeur par recopie<br />
un opérateur d’affectation (copie sans création)<br />
Il faut déclarer, puis définir ces fonctions membres, sauf si<br />
vous savez exactement ce que va faire le compilateur (et<br />
que ça vous va...).
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
constructeurs<br />
Ce sont les fonctions membres qui construisent les<br />
données (ils peut y en avoir plusieurs).<br />
Ils n’ont pas <strong>de</strong> type <strong>de</strong> retour (même pas void !).<br />
Ils portent le même nom que la classe qu’ils peuvent<br />
construire.<br />
Ils se différencient par la liste <strong>de</strong> leurs arguments.<br />
Initialiser les données membres sur l’en-tête du constructeur<br />
(liste d’initialisation) :<br />
Alpha::Alpha(double a, int n, const Beta<br />
&b):entier1(n), reel1(a), autre objet(b) { ... }<br />
Remarque : il n’est pas nécessaire que ce soit le constructeur<br />
qui alloue toute la mémoire dynamique <strong>de</strong> l’objet.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
constructeurs<br />
Ce sont les fonctions membres qui construisent les<br />
données (ils peut y en avoir plusieurs).<br />
Ils n’ont pas <strong>de</strong> type <strong>de</strong> retour (même pas void !).<br />
Ils portent le même nom que la classe qu’ils peuvent<br />
construire.<br />
Ils se différencient par la liste <strong>de</strong> leurs arguments.<br />
Initialiser les données membres sur l’en-tête du constructeur<br />
(liste d’initialisation) :<br />
Alpha::Alpha(double a, int n, const Beta<br />
&b):entier1(n), reel1(a), autre objet(b) { ... }<br />
Remarque : il n’est pas nécessaire que ce soit le constructeur<br />
qui alloue toute la mémoire dynamique <strong>de</strong> l’objet.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
copie et affectation<br />
constructeur par recopie<br />
C’est un constructeur <strong>de</strong> la forme :<br />
Alpha::Alpha(const Alpha&) { ... }<br />
qui recopie membre à membre.<br />
opérateur d’affectation<br />
Ce n’est pas un constructeur, il se contente <strong>de</strong> recopier les<br />
membres d’un objet dans ceux d’un autre existant déjà :<br />
Alpha::operator=(const Alpha&) { ...}
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
copie et affectation<br />
constructeur par recopie<br />
C’est un constructeur <strong>de</strong> la forme :<br />
Alpha::Alpha(const Alpha&) { ... }<br />
qui recopie membre à membre.<br />
opérateur d’affectation<br />
Ce n’est pas un constructeur, il se contente <strong>de</strong> recopier les<br />
membres d’un objet dans ceux d’un autre existant déjà :<br />
Alpha::operator=(const Alpha&) { ...}
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
le <strong>de</strong>structeur<br />
Un <strong>de</strong>structeur est une fonction membre spéciale<br />
appelée automatiquement juste avant la <strong>de</strong>struction<br />
d’un objet.<br />
Il porte le même nom que la classe, précédé du signe ˜.<br />
Il n’a pas d’argument, ni <strong>de</strong> type <strong>de</strong> retour.<br />
Il donne au programme une <strong>de</strong>rnière occasion <strong>de</strong><br />
libérer la mémoire allouée à l’objet.<br />
Une classe ne peut avoir qu’un seul <strong>de</strong>structeur.<br />
Alpha::~Alpha() { ... }
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Restriction d’accès aux membres<br />
Tous les membres ne sont pas accessibles par l’utilisateur d’une<br />
classe.<br />
C’est le concepteur (programmeur) <strong>de</strong> cette classe qui déci<strong>de</strong><br />
quels membres pourront être manipulés directement par<br />
l’utilisateur.<br />
Il existe trois types d’accès :<br />
l’accès public : tout le mon<strong>de</strong> a accès,<br />
l’accès protected : les fonctions membres <strong>de</strong> la classe et<br />
<strong>de</strong>s classes dérivées ont accès,<br />
l’accès private : seules les fonctions membres <strong>de</strong> la classe<br />
ont accès.<br />
Il faut mettre le mot-clef correspondant au type d’accès avant<br />
les membres dans la déclaration <strong>de</strong> la classe (.h).
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Déclaration <strong>de</strong> type d’accès<br />
public:<br />
double fonction1...<br />
Ce type d’accès vaut pour tous les membres jusqu’à la<br />
rencontre d’un nouveau mot-clef.<br />
Par défaut, les membres sont privés.<br />
fonctions et classes amies<br />
Ce sont <strong>de</strong>s fonctions (ou <strong>de</strong>s classes) qui ont libre accès aux<br />
membres privés ou protégés.<br />
Elles sont déclarées au même endroit que les membres :<br />
friend double fonction pote(const char*) ;<br />
friend class Gamma ;
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Déclaration <strong>de</strong> type d’accès<br />
public:<br />
double fonction1...<br />
Ce type d’accès vaut pour tous les membres jusqu’à la<br />
rencontre d’un nouveau mot-clef.<br />
Par défaut, les membres sont privés.<br />
fonctions et classes amies<br />
Ce sont <strong>de</strong>s fonctions (ou <strong>de</strong>s classes) qui ont libre accès aux<br />
membres privés ou protégés.<br />
Elles sont déclarées au même endroit que les membres :<br />
friend double fonction pote(const char*) ;<br />
friend class Gamma ;
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Surcharge <strong>de</strong>s fonctions<br />
Une fonction n’est pas entièrement déterminée par son<br />
nom, mais aussi par les types <strong>de</strong> ses arguments.<br />
Par exemple, operator +(...) ne fait pas ≪ la même<br />
chose ≫avec <strong>de</strong>s entiers et <strong>de</strong>s réels.<br />
Le programmeur peut redéfinir (surcharger) les opérateurs<br />
et les fonctions avec d’autres arguments.<br />
⇒fonctions membres d’une classe (constructeur,<br />
opérateurs arithmétiques, etc...).<br />
Le lien avec la ≪ bonne ≫fonction est fait par le<br />
compilateur.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Membres constants<br />
Les données membres constantes suivent les mêmes<br />
règles que les ≪ variables constantes ≫(elles sont<br />
initialisées dans les en-têtes).<br />
Une fonction membre constante (par exemple <strong>de</strong><br />
Alpha) se déclare :<br />
double fonction1(const int&) const ;<br />
c’est une fonction qui ne modifie pas le données<br />
membres <strong>de</strong> la classe.<br />
Les fonctions membres constantes sont les seules à<br />
pouvoir être appelées sur <strong>de</strong>s objets (<strong>de</strong> la classe<br />
Alpha, dans notre exemple) constants.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Données membres mutables<br />
La notion <strong>de</strong> constance peut correspondre à <strong>de</strong>ux concepts<br />
différents :<br />
constance physique : l’objet conserve sa valeur initiale<br />
jusqu’à sa <strong>de</strong>struction (⇒const),<br />
constance logique : les utilisateurs perçoivent l’objet<br />
invariable (⇒donnée membre mutable).<br />
Les membres déclarés mutables peuvent être modifiés par<br />
toute fonction membre, constante ou non.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
TP n o 3<br />
une classe <strong>de</strong> stockage <strong>de</strong> réels<br />
Objectifs :<br />
Concevoir une classe <strong>de</strong> ≪ bas niveau ≫pour représenter<br />
<strong>de</strong>s tableaux <strong>de</strong> réels à 1,2 ou 3 dimensions, avec l’espace<br />
mémoire alloué <strong>de</strong> manière dynamique.<br />
Cette classe pourra ensuite être utilisée pour stocker les<br />
coordonnées <strong>de</strong>s points <strong>de</strong>s grilles numériques, les valeurs<br />
<strong>de</strong>s champs physiques en ces points, ...<br />
Elle fera les vérifications pour en lecture/écriture, afin<br />
d’éviter les dépassements <strong>de</strong> tableaux ;<br />
Elle possé<strong>de</strong>ra une arithmétiques complète et sera définie<br />
pour la plupart <strong>de</strong>s fonctions mathématiques usuelles (sin,<br />
exp, √ , ...
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Programme principal<br />
#inclu<strong>de</strong> <br />
#inclu<strong>de</strong> <br />
#inclu<strong>de</strong> <br />
#inclu<strong>de</strong> "tab.h"<br />
int main() {<br />
Tab tab3d(2, 3, 4) ;<br />
tab3d = M_PI ;<br />
cout
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Héritage et polymorphisme<br />
1 Héritage simple<br />
2 Héritage multiple<br />
3 Polymorphisme<br />
4 Exemples : les classes Etoile et Eos<br />
5 TP n o 4 : une classe <strong>de</strong> matrices
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Héritage simple<br />
L’héritage permet d’utiliser les propriétés (données et fonctions<br />
membres) d’une classe existante en les enrichissant pour faire<br />
une nouvelle classe.<br />
class A ;<br />
class B : public A { ... } ;<br />
B (classe dérivée) est une sorte <strong>de</strong> A (classe <strong>de</strong> base).<br />
Les constructeurs, constructeur par copie, opérateurs<br />
d’affectation (tous) et <strong>de</strong>structeurs ne sont pas hérités. Il faut<br />
créer un constructeur avec une liste d’initialisation (en-tête) :<br />
B::B(...):A(...), données membres <strong>de</strong> B(...),...<br />
{ ... } ;
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Héritage simple<br />
L’héritage permet d’utiliser les propriétés (données et fonctions<br />
membres) d’une classe existante en les enrichissant pour faire<br />
une nouvelle classe.<br />
class A ;<br />
class B : public A { ... } ;<br />
B (classe dérivée) est une sorte <strong>de</strong> A (classe <strong>de</strong> base).<br />
Les constructeurs, constructeur par copie, opérateurs<br />
d’affectation (tous) et <strong>de</strong>structeurs ne sont pas hérités. Il faut<br />
créer un constructeur avec une liste d’initialisation (en-tête) :<br />
B::B(...):A(...), données membres <strong>de</strong> B(...),...<br />
{ ... } ;
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Compatibilité implicite<br />
Par un héritage publique, une classe B dérivée <strong>de</strong> A offre les<br />
mêmes ≪ services ≫que A. Un objet <strong>de</strong> type B peut<br />
remplacer un objet <strong>de</strong> type A.<br />
Cela peut être utilisé avec <strong>de</strong>s pointeurs ou <strong>de</strong>s références :<br />
A a, *pa ;<br />
B b, *pb ;<br />
pa = &b ; // mais pas pb =&a ! !<br />
Le type statique <strong>de</strong> pa est A *, le type<br />
dynamique <strong>de</strong> pa est B *.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Compatibilité implicite<br />
Par un héritage publique, une classe B dérivée <strong>de</strong> A offre les<br />
mêmes ≪ services ≫que A. Un objet <strong>de</strong> type B peut<br />
remplacer un objet <strong>de</strong> type A.<br />
Cela peut être utilisé avec <strong>de</strong>s pointeurs ou <strong>de</strong>s références :<br />
A a, *pa ;<br />
B b, *pb ;<br />
pa = &b ; // mais pas pb =&a ! !<br />
Le type statique <strong>de</strong> pa est A *, le type<br />
dynamique <strong>de</strong> pa est B *.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Types d’héritage<br />
Dans l’exemple précé<strong>de</strong>nt, B hérite <strong>de</strong> façon publique <strong>de</strong> la<br />
classe A. Il est possible <strong>de</strong> déci<strong>de</strong>r du type d’héritage à<br />
l’ai<strong>de</strong> <strong>de</strong> l’un <strong>de</strong>s mots-clés :<br />
public : les membres hérités gar<strong>de</strong>nt les mêmes<br />
restrictions d’accès que dans la classe <strong>de</strong> base,<br />
protected : les membres hérités sont en accès<br />
protected,<br />
private : les membres hérités sont en accès private.<br />
SAUF les membres privés <strong>de</strong> la classe <strong>de</strong> base qui ne sont<br />
jamais accessibles dans les classes dérivées (mêmes pas par<br />
les fonctions membres !).
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Ajustement d’accès<br />
Lors d’un héritage protégé ou privé on peut déci<strong>de</strong>r que<br />
certains membres <strong>de</strong> la classe <strong>de</strong> base conservent leur type<br />
d’accès dans la classe dérivée.<br />
On ne peut en aucun cas augmenter ou diminuer les droits<br />
d’accès à un membre <strong>de</strong> la classe <strong>de</strong> base.<br />
class X {<br />
public: void f1() ; void f2() ;<br />
protected: void f3() ; void f4() ; };<br />
class Y : private X {<br />
public: X::f1 ; //mais pas f3!<br />
protected: X::f4 ; //f2 et f3 sont privés dans<br />
Y<br />
};
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Classes et fonctions amies<br />
Les classes amies <strong>de</strong> la classes <strong>de</strong> base restent<br />
amies <strong>de</strong>s membres hérités, mais pas <strong>de</strong>s<br />
nouveaux membres <strong>de</strong>s classes dérivées.<br />
Les fonctions amies <strong>de</strong> la classe <strong>de</strong> base ne le<br />
sont plus du tout (même pas pour les<br />
membres hérités) pour la classe dérivée ; il<br />
faut redéfinir les relations d’amitié avec les<br />
fonctions.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Héritage multiple<br />
Il permet <strong>de</strong> créer <strong>de</strong>s classes dérivées utilisant<br />
plusieurs classes <strong>de</strong> bases.<br />
class A ;<br />
class B ;<br />
class C: public B, protected A { ... } ;<br />
Les constructeurs sont appelés dans l’ordre <strong>de</strong><br />
déclaration <strong>de</strong> l’héritage (celui <strong>de</strong> B, puis <strong>de</strong> A, puis <strong>de</strong><br />
la classe dérivée).<br />
Les <strong>de</strong>structeurs sont appelés dans l’ordre inverse <strong>de</strong><br />
celui <strong>de</strong>s constructeurs.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Héritage virtuel<br />
class A { ...} ;<br />
class B: public A { ...} ;<br />
class C: public A { ... } ;<br />
class D: public B, public C { ... } ;<br />
D contiendra <strong>de</strong>ux fois les données héritées <strong>de</strong> A...<br />
Pour lever l’ambiguïté, il faut utiliser l’héritage virtuel :<br />
class B: virtual public A { ... } ;<br />
class C: virtual public A { ... } ;<br />
class D: public B, public C { ... } ;<br />
Cet héritage ≪ virtual ≫ne doit pas être confondu avec les<br />
membres virtuels du polymorphisme.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Héritage virtuel<br />
class A { ...} ;<br />
class B: public A { ...} ;<br />
class C: public A { ... } ;<br />
class D: public B, public C { ... } ;<br />
D contiendra <strong>de</strong>ux fois les données héritées <strong>de</strong> A...<br />
Pour lever l’ambiguïté, il faut utiliser l’héritage virtuel :<br />
class B: virtual public A { ... } ;<br />
class C: virtual public A { ... } ;<br />
class D: public B, public C { ... } ;<br />
Cet héritage ≪ virtual ≫ne doit pas être confondu avec les<br />
membres virtuels du polymorphisme.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Polymorphisme<br />
L’idée <strong>de</strong> l’héritage (surtout public) est que si B hérite <strong>de</strong> A, B<br />
est une sorte <strong>de</strong> A. Il se peut néanmoins, que l’on ait envie <strong>de</strong><br />
redéfinir (ou surcharger) dans B certains membres <strong>de</strong> A.<br />
B::affiche() ;<br />
A::affiche() ; différente<br />
B b ;<br />
A *ptr=&b ;<br />
ptr->affiche(); ? ? Au moment <strong>de</strong> la compilation, il est<br />
impossible <strong>de</strong> savoir quelle fonction appeler.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Liaison dynamique<br />
La liaison avec la ≪ bonne ≫fonction membre se fait au<br />
moment <strong>de</strong> l’exécution. Ce mécanisme se met en place dans la<br />
classe <strong>de</strong> base : class A {<br />
public:<br />
virtual void affiche() { ... } ;<br />
...}<br />
puis, dans la classe dérivée, il faut déclarer la même fonction<br />
membre, avec les mêmes arguments :<br />
class B: public A {<br />
public: virtual void affiche() { ... } ;<br />
...} .
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Fonctions membres virtuelles pures<br />
Certaines fonctions virtuelles sont trop générales pour pouvoir<br />
être définies (par exemple, dans la classe Eos). Mais elles sont<br />
quand même nécessaires...<br />
On peut définir ces fonctions pour qu’elles renvoient<br />
simplement un message d’erreur. Une meilleure solution est <strong>de</strong><br />
les déclarer virtuelles pures :<br />
class A {<br />
public:<br />
virtual void affiche()=0 ; }<br />
Cela signifie que la définition <strong>de</strong> affiche() est différée et<br />
déléguée aux classes dérivées.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Classes abstraites<br />
Une classe abstraite est une classe qui ne peut pas être<br />
instanciée.<br />
C’est en général une classe dont l’implémentation est<br />
insuffisante pour représenter complètement un objet réel. Le<br />
rôle <strong>de</strong> la classe est <strong>de</strong> servir <strong>de</strong> ≪ moule ≫pour dériver d’autres<br />
classes.<br />
On peut avoir <strong>de</strong>s classes abstraites<br />
si tous les constructeurs sont protégés ou privés,<br />
si la classe déclare au moins une fonction virtuelle pure,<br />
si la classe hérite d’une fonction virtuelle pure qu’elle ne<br />
définit pas.<br />
Si A est une classe abstraite,<br />
A a ; est illégal<br />
A *pta ; est permis.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Classes abstraites<br />
Une classe abstraite est une classe qui ne peut pas être<br />
instanciée.<br />
C’est en général une classe dont l’implémentation est<br />
insuffisante pour représenter complètement un objet réel. Le<br />
rôle <strong>de</strong> la classe est <strong>de</strong> servir <strong>de</strong> ≪ moule ≫pour dériver d’autres<br />
classes.<br />
On peut avoir <strong>de</strong>s classes abstraites<br />
si tous les constructeurs sont protégés ou privés,<br />
si la classe déclare au moins une fonction virtuelle pure,<br />
si la classe hérite d’une fonction virtuelle pure qu’elle ne<br />
définit pas.<br />
Si A est une classe abstraite,<br />
A a ; est illégal<br />
A *pta ; est permis.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Exemples :<br />
les classes Etoile et Eos<br />
Etoile −→ Etoile rot −→ Et rot bifluid<br />
Eos(classe abstraite) −→ Eos poly, Eos tabul,<br />
...
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
TP n o 4 :<br />
<strong>de</strong>s matrices héritées <strong>de</strong> la classe <strong>de</strong> tableaux<br />
Objectifs :<br />
Concevoir une classe <strong>de</strong> matrices carrées héritant <strong>de</strong> la<br />
classe <strong>de</strong> tableaux (Tab) du TP n o 3.<br />
Cette classe pourra ensuite être utilisée pour décrire <strong>de</strong>s<br />
opérateurs différentiels ou autres ...<br />
Elle aura <strong>de</strong>s métho<strong>de</strong>s <strong>de</strong>terminant(), Tab<br />
resout(const Tab&) et Matrice inverse()<br />
éventuellement virtuelles (possibilité <strong>de</strong> classes dérivées <strong>de</strong><br />
Matrice (matrices triangulaires, à ban<strong>de</strong>s, ...) qui seront<br />
définies plus tard<br />
Elle <strong>de</strong>vra possé<strong>de</strong>r un produit matriciel s’écrivant m1 *<br />
m2 ou mat * vec avec vec un Tab à une dimension<br />
Note : les métho<strong>de</strong>s Mat::resout(...),<br />
Mat::inverse(...), Mat::<strong>de</strong>terminant(...) ne seront<br />
définies qu’après le cours sur le liens avec le fortran.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Programme principal<br />
#inclu<strong>de</strong> <br />
#inclu<strong>de</strong> <br />
#inclu<strong>de</strong> "matrice.h"<br />
int main() {<br />
Tab rhs("memb_droite.dat") ;<br />
Matrice mat("matrice.dat") ;<br />
double max_rhs = max(abs(rhs)) ;<br />
cout
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Quelques conseils pratiques ...<br />
1 Utilisation <strong>de</strong>s références<br />
2 Entrées / sorties avec les fichiers<br />
3 Le mot-clef const<br />
4 Conception <strong>de</strong> classes
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Utilisation <strong>de</strong>s références<br />
Rappel : Une valeur <strong>de</strong> type référence (type &) est une<br />
adresse, MAIS les modifications sur cette adresse touchent<br />
l’objet référencé et non l’adresse (qui ne peut être modifiée).<br />
De plus :<br />
le type void & n’est pas vali<strong>de</strong>.<br />
il est impossible <strong>de</strong> créer un pointeur sur une référence<br />
(mais une référence sur un pointeur, si !),<br />
<strong>de</strong> créer une référence sur une référence,<br />
<strong>de</strong> créer un tableau <strong>de</strong> références.<br />
une référence doit toujours être définie (initialisée).
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Valeur, adresse, ou référence ?<br />
int a est un argument <strong>de</strong> fonction void f(...).<br />
Si la valeur <strong>de</strong> a doit aussi être retournée par f (<strong>de</strong> la<br />
fonction appelée à la fonction appelante), il faut passer a<br />
par adresse (pointeur ou référence) :<br />
void f(int *a) ; ou<br />
void f(int &a) ;.<br />
Sinon, et si la taille <strong>de</strong> a n’est pas plus gran<strong>de</strong> que celle<br />
d’un entier, on peut passer a par valeur : void f(int<br />
a) ;.<br />
Ce second point vaut éventuellement pour les valeurs <strong>de</strong> retour<br />
<strong>de</strong> fonctions : si le type est ≪ petit ≫(recopie aussi rapi<strong>de</strong><br />
qu’une adresse) il vaut mieux retourner une valeur. Si, au<br />
contraire, il est ≪ gros ≫il vaut mieux retourner son adresse,<br />
mais attention aux référence !
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Piège <strong>de</strong>s renvois <strong>de</strong> références<br />
Ne jamais renvoyer une référence sur un objet détruit à la fin<br />
<strong>de</strong> la fonction appelée :<br />
Tab &operator+(Tab &t1, Tab &t2) {<br />
Tab resu(t1) ;<br />
...<br />
return resu ; }// ! ! !<br />
Ne pas modifier l’objet référencé tant que la référence est<br />
utilisée :<br />
class pile {<br />
public: int &Top() ;// consulte/modifie le sommet<br />
int Pop() ;} ; // renvoie la valeur au sommet <strong>de</strong> la pile et<br />
l’enlève <strong>de</strong> la pile. Le problème apparaît pour :<br />
pile p;<br />
p.Top() = p.Pop()+1 ;
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Entrées / Sorties<br />
Rappel : les fonctions du C marchent aussi en C++ ! !<br />
(printf, scanf...).<br />
Il existe 4 flux pré-définis, déclarés dans :<br />
cin, qui correspond à l’entrée standard (stdin en C),<br />
cout, qui correspond à la sortie standard (stdout en C),<br />
cerr, qui correspond à la sortie d’erreur (st<strong>de</strong>rr en C),<br />
clog, qui est le flux <strong>de</strong> sortie d’≪ erreur tamponnée ≫.<br />
cout y ;<br />
cout
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Flux associés aux fichiers<br />
Il y a <strong>de</strong>ux classes pré-définies dans pour gérer les<br />
entrées/sorties avec les fichiers :<br />
class ifstream pour les entrées,<br />
class ofstream pour les sorties.<br />
Exemple :<br />
ifstream f("entree.dat") ;<br />
ofstream g("sortie.dat") ;<br />
int n ;<br />
f >> n ;<br />
g
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Métho<strong>de</strong>s communes aux flux<br />
Ces métho<strong>de</strong>s peuvent être utilisées pour les<br />
entrées/sorties standards, comme pour les fichiers :<br />
>, qui sont surchargés pour les types standards,<br />
put(char c) et write(const char *s, int n) en<br />
écriture,<br />
get(char c), read(char *s, int n),<br />
getline(char *s, int, char <strong>de</strong>lim=’\n’) et<br />
ignore(int n=1, int <strong>de</strong>lim=EOF) en lecture.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Manipulateurs<br />
Ils sont équivalents aux fonctions membres <strong>de</strong>s flux pour le<br />
formattage <strong>de</strong> l’information, mais leur appel est plus simple :<br />
<strong>de</strong>c, hex,... et setbase(int n) (sortie),<br />
endl, ends et flush (sortie),<br />
setfill(char c), setw(int n), setprecision(int<br />
n), fixed, scientific, left, right,<br />
uppercase,... (sortie),<br />
skipws, noskipws, ws (entrée),<br />
tab, <strong>de</strong>cin<strong>de</strong>nt, incin<strong>de</strong>nt... (sortie).
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Manipulateurs<br />
exemple d’utilisation<br />
Comparez :<br />
cout.width(10) ;<br />
cout.fill(’*’) ;<br />
cout.setf(ios::hex, ios::basefield);<br />
cout
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
La classe string<br />
En C++, il existe une classe string, pour manipuler les<br />
chaînes <strong>de</strong> caractères (#inclu<strong>de</strong>).<br />
constructeurs : string chaine ; string suite =<br />
"bonjour" ;<br />
accès : chaine.size() ; chaine.length() ;<br />
suite[i] ; ...<br />
manipulation : chaine += suite ; string total =<br />
chaine + suite ; ...<br />
comparaison : chaine.compare(suite) ;<br />
récupération du char* : chaine.c str() ;<br />
chaine.data() ; (sans le ’\0’)<br />
autres : find, copy, ...<br />
Certaines <strong>de</strong> ces fonctions sont surchargées, avec <strong>de</strong>s<br />
arguments supplémentaires permettant <strong>de</strong> travailler sur une<br />
partie <strong>de</strong> la chaîne <strong>de</strong> caractères.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Flux d’entrée/sortie<br />
un exemple complet<br />
#inclu<strong>de</strong><br />
#inclu<strong>de</strong><br />
#inclu<strong>de</strong><br />
#inclu<strong>de</strong><br />
#inclu<strong>de</strong> <br />
using namespace std ;<br />
int main() {<br />
double mass_b = -1 ;<br />
double e1, e2, om1, om2, press, ener, mg, mb1, mb2 ;<br />
for (int i=1; i om2 >> press >> ener >> mg >> mb1 >> mb2 ;<br />
}<br />
}<br />
return EXIT_SUCCESS ;<br />
}
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Utilisation <strong>de</strong> const<br />
Quand faut-il déclarer un argument <strong>de</strong> fonction constant ?<br />
Dès que la fonction n’a besoin que <strong>de</strong> ≪ lire ≫la valeur <strong>de</strong><br />
cet argument (elle ne le retourne pas...) ⇒sans objet pour<br />
les valeurs.<br />
Si une classe n’a aucune fonction membre prenant <strong>de</strong>s<br />
constantes, il sera difficile d’instancier <strong>de</strong>s objets constants<br />
<strong>de</strong> cette classe.<br />
⇒Le constructeur par recopie et l’opérateur d’affectation<br />
doivent prendre <strong>de</strong>s arguments const.<br />
Quand une fonction prends <strong>de</strong>s objets const, elle peut aussi<br />
prendre <strong>de</strong>s non-const !
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Utilisation <strong>de</strong> const<br />
Quand faut-il déclarer un argument <strong>de</strong> fonction constant ?<br />
Dès que la fonction n’a besoin que <strong>de</strong> ≪ lire ≫la valeur <strong>de</strong><br />
cet argument (elle ne le retourne pas...) ⇒sans objet pour<br />
les valeurs.<br />
Si une classe n’a aucune fonction membre prenant <strong>de</strong>s<br />
constantes, il sera difficile d’instancier <strong>de</strong>s objets constants<br />
<strong>de</strong> cette classe.<br />
⇒Le constructeur par recopie et l’opérateur d’affectation<br />
doivent prendre <strong>de</strong>s arguments const.<br />
Quand une fonction prends <strong>de</strong>s objets const, elle peut aussi<br />
prendre <strong>de</strong>s non-const !
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Utilisation <strong>de</strong> const<br />
Quand une fonction membre doit-elle être constante ?<br />
Les fonctions membres constantes ne modifient pas les<br />
données <strong>de</strong> la classe sur laquelle elles sont appelées.<br />
Il faut faire appel au maximum à celles-ci, en faisant<br />
attention qu’elles soient vraiment ≪ constantes ≫.<br />
Éventuellement, on peut déclarer <strong>de</strong>s données mutable.<br />
Renvoi <strong>de</strong> constante par une fonction membre ?<br />
Dès que la fonction membre renvoie une référence<br />
(attention !) ou un pointeur sur une donnée membre<br />
constante !
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Utilisation <strong>de</strong> const<br />
Quand une fonction membre doit-elle être constante ?<br />
Les fonctions membres constantes ne modifient pas les<br />
données <strong>de</strong> la classe sur laquelle elles sont appelées.<br />
Il faut faire appel au maximum à celles-ci, en faisant<br />
attention qu’elles soient vraiment ≪ constantes ≫.<br />
Éventuellement, on peut déclarer <strong>de</strong>s données mutable.<br />
Renvoi <strong>de</strong> constante par une fonction membre ?<br />
Dès que la fonction membre renvoie une référence<br />
(attention !) ou un pointeur sur une donnée membre<br />
constante !
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Conception <strong>de</strong> classes<br />
Optique <strong>de</strong> la programmation par objets<br />
encapsulation : regrouper dans une même classe les<br />
structures <strong>de</strong> données (les données membres) et les<br />
fonctions qui les manipulent.<br />
abstraction <strong>de</strong> données : Bien séparer une partie privée<br />
et une partie publique. La partie privée contient les<br />
structures <strong>de</strong> données et les fonctions à usage interne. La<br />
partie publique contient les fonctions et variables offertes<br />
aux utilisateurs <strong>de</strong> la classe.<br />
On appelle interface <strong>de</strong> la classe ce qui est accessible par tout le<br />
mon<strong>de</strong> et implémentation ce qui ne l’est que par le concepteur.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Conception <strong>de</strong> classes<br />
Les constructeurs<br />
Pour tous les constructeurs (y compris les constructeurs<br />
par recopie), privilégier la liste d’initialisation à la recopie<br />
dans le corps <strong>de</strong> la métho<strong>de</strong>.<br />
Définir un constructeur pour les classes dérivées : en effet,<br />
si la classe <strong>de</strong> base a un constructeur déclaré, la classe<br />
dérivée n’a pas <strong>de</strong> constructeur par défaut (synthétisé).<br />
Si, parmi les données membres <strong>de</strong> la classe, il y a une<br />
constante ou une référence, il n’y a pas <strong>de</strong> constructeur<br />
par défaut synthétisé par le compilateur.<br />
⇒toujours déclarer au moins un constructeur, même s’il ne fait<br />
rien !
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Conception <strong>de</strong> classes<br />
operator=, constructeur par recopie et <strong>de</strong>structeur<br />
Un <strong>de</strong>structeur ne fait rien, sauf si la classe contient <strong>de</strong>s<br />
objets alloués dynamiquement.<br />
Il peut être utile <strong>de</strong> déclarer le <strong>de</strong>structeur virtual, que<br />
la classe fasse appel à l’héritage ou non.<br />
nécessité du constructeur par recopie<br />
A chaque appel d’une fonction ayant pour argument un<br />
membre <strong>de</strong> la classe, il y a duplication <strong>de</strong> cet argument.<br />
Le constructeur par recopie ≪ synthétisé ≫ne copie pas les<br />
tableaux dynamiques, ni les objets externes à la classe (par<br />
ex : les FILE *).<br />
opérateur d’affectation<br />
Il ne crée pas l’objet, mais ne fait que copier ses membres.<br />
Comme l’objet existe déjà, il doit le ≪ nettoyer ≫ou vérifier<br />
qu’il est compatible ...
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Conception <strong>de</strong> classes<br />
operator=, constructeur par recopie et <strong>de</strong>structeur<br />
Un <strong>de</strong>structeur ne fait rien, sauf si la classe contient <strong>de</strong>s<br />
objets alloués dynamiquement.<br />
Il peut être utile <strong>de</strong> déclarer le <strong>de</strong>structeur virtual, que<br />
la classe fasse appel à l’héritage ou non.<br />
nécessité du constructeur par recopie<br />
A chaque appel d’une fonction ayant pour argument un<br />
membre <strong>de</strong> la classe, il y a duplication <strong>de</strong> cet argument.<br />
Le constructeur par recopie ≪ synthétisé ≫ne copie pas les<br />
tableaux dynamiques, ni les objets externes à la classe (par<br />
ex : les FILE *).<br />
opérateur d’affectation<br />
Il ne crée pas l’objet, mais ne fait que copier ses membres.<br />
Comme l’objet existe déjà, il doit le ≪ nettoyer ≫ou vérifier<br />
qu’il est compatible ...
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Conception <strong>de</strong> classes<br />
operator=, constructeur par recopie et <strong>de</strong>structeur<br />
Un <strong>de</strong>structeur ne fait rien, sauf si la classe contient <strong>de</strong>s<br />
objets alloués dynamiquement.<br />
Il peut être utile <strong>de</strong> déclarer le <strong>de</strong>structeur virtual, que<br />
la classe fasse appel à l’héritage ou non.<br />
nécessité du constructeur par recopie<br />
A chaque appel d’une fonction ayant pour argument un<br />
membre <strong>de</strong> la classe, il y a duplication <strong>de</strong> cet argument.<br />
Le constructeur par recopie ≪ synthétisé ≫ne copie pas les<br />
tableaux dynamiques, ni les objets externes à la classe (par<br />
ex : les FILE *).<br />
opérateur d’affectation<br />
Il ne crée pas l’objet, mais ne fait que copier ses membres.<br />
Comme l’objet existe déjà, il doit le ≪ nettoyer ≫ou vérifier<br />
qu’il est compatible ...
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Conception <strong>de</strong> classes<br />
Affichage<br />
Parmi les fonctions membres, en plus <strong>de</strong>s 4 fortement<br />
conseillées, il est souvent très commo<strong>de</strong> <strong>de</strong> définir un opérateur<br />
d’affichage :<br />
(friend) ostream& operator
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Pour aller plus loin<br />
1 C++ et fortran<br />
2 Espaces <strong>de</strong> noms<br />
3 Variables statiques<br />
4 Conversion <strong>de</strong> types<br />
5 Pointeurs <strong>de</strong> fonctions<br />
6 Modèles <strong>de</strong> fonctions et <strong>de</strong> classes<br />
7 Bibliothèques prédéfinies
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Mélanger C++ et fortran<br />
Appeler du fortran <strong>de</strong>puis le C++<br />
Il est possible d’appeler <strong>de</strong>s fonctions (ou sous-routines)<br />
fortran (66, 77, 95, 2003 ?) <strong>de</strong>puis un programme en C++ :<br />
Du côté C++, la fonction fortran doit être déclarée<br />
avec, éventuellement, un ou <strong>de</strong>ux ≪ ≫à la fin <strong>de</strong> son nom.<br />
Le fortran ne travaille qu’avec <strong>de</strong>s pointeurs, il faut<br />
donc passer toutes les variables par adresse.<br />
On ne peut passer que <strong>de</strong>s types simples (int, float,<br />
double et char), surtout pas <strong>de</strong> classe ! !<br />
Il faut compiler chaque fichier (.cpp ou .f) avec son<br />
compilateur et, pour le lien, utiliser le compilateur C++<br />
(le programme principal est en C++ !) avec la bonne<br />
bibliothèque ( ex : g++ -o prog cmain.o fonc.o<br />
-lg2c ou -lgfortran pour les compilateurs GNU)
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Programme principal C++<br />
#inclu<strong>de</strong> <br />
#inclu<strong>de</strong> <br />
#inclu<strong>de</strong> <br />
using namespace std ;<br />
extern "C" {<br />
void fonction_for_(double* , int* ) ;<br />
}<br />
int main() {<br />
cout n ;<br />
double* tab = new double[n] ;<br />
for (int i=0; i
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Fonction fortran<br />
subroutine fonction_for(tab, n)<br />
implicit none<br />
integer n, i<br />
double precision tab(n)<br />
do i=1, n<br />
write(*,*) ’tab[’,i,’]=’,tab(i)<br />
enddo<br />
return<br />
end
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Mélanger C++ et fortran<br />
Appeler du C++ <strong>de</strong>puis le fortran<br />
il faut faire une fonction ≪ chapeau ≫en C, déclarée<br />
comme externe, qui appelle la fonction C++<br />
comme pour le cas inverse, il ne faut passer que <strong>de</strong>s<br />
adresses <strong>de</strong> types simples<br />
dans la routine fortran, il faut faire appel à la fonction<br />
chapeau<br />
chaque fichier est compilé dans le langage idoine, le lien se<br />
faisant avec le compilateur fortran (programme<br />
principal !) en ajoutant la bibliothèque standard du C++ :<br />
par ex. pour les compilateurs GNU ≪ gfortran -o prog<br />
fmain.o fonc.o -lstdc++ ≫
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Programme principal fortran<br />
program ftest<br />
implicit none<br />
integer n, i<br />
parameter (n=10)<br />
double precision a(n)<br />
do i=1,n<br />
a(i)=sqrt(dble(3+i))<br />
enddo<br />
call fonction_c(a,n)<br />
end
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Fonction C++<br />
#inclu<strong>de</strong> <br />
using namespace std;<br />
void fonction_cpp (double* a, const int* n)<br />
{ for (int m=0; m
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
TP n o 5 :<br />
appels à la bibliothèque LAPACK pour les matrices<br />
bibliothèque numérique pour les problèmes d’algèbre<br />
linéaire, écrite en fortran (Cf.<br />
http://www.netlib.org/lapack )<br />
Utiliser les page man pour connaître les arguments <strong>de</strong>s<br />
routines dgetrf (factorisation LU), dgetrs (résolution <strong>de</strong><br />
système), dgetri (inversion <strong>de</strong> matrice) et dgeev (calcul<br />
<strong>de</strong> valeurs propres).<br />
implémenter l’appel aux routines <strong>de</strong> solutions d’équations<br />
linéaires, d’inversion et <strong>de</strong> calcul <strong>de</strong> valeurs propres (pour<br />
le déterminant) pour faire fonctionner la classe Matrice<br />
tester sur <strong>de</strong>s systèmes simples... et faire tourner le<br />
programme principal du TP n o 4.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Appel à LAPACK<br />
fonction <strong>de</strong> factorisation dgetrf<br />
DGETRF(l) ) DGETRF(l)<br />
NAME<br />
DGETRF - compute an LU factorization of a general M-by-N matrix A using partial<br />
pivoting with row interchanges<br />
SYNOPSIS<br />
SUBROUTINE DGETRF( M, N, A, LDA, IPIV, INFO )<br />
INTEGER INFO, LDA, M, N<br />
INTEGER IPIV( * )<br />
DOUBLE PRECISION A( LDA, * )<br />
PURPOSE<br />
DGETRF computes an LU factorization of a general M-by-N matrix A using partial<br />
pivoting with row interchanges. The factorization has the form<br />
A = P * L * U<br />
where P is a permutation matrix, L is lower triangular with unit diagonal elements<br />
(lower trapezoidal if m > n), and U is upper triangular (upper trapezoidal<br />
if m < n).<br />
This is the right-looking Level 3 BLAS version of the algorithm.<br />
LAPACK version 3.0 15 June 2000 DGETRF(l)
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Appel à LAPACK<br />
fonction <strong>de</strong> factorisation dgetrf<br />
ARGUMENTS<br />
M (input) INTEGER<br />
The number of rows of the matrix A. M >= 0.<br />
N (input) INTEGER<br />
The number of columns of the matrix A. N >= 0.<br />
A (input/output) DOUBLE PRECISION array, dimension (LDA,N)<br />
On entry, the M-by-N matrix to be factored. On exit, the factors L and<br />
U from the factorization A = P*L*U; the unit diagonal elements of L are<br />
not stored.<br />
LDA (input) INTEGER<br />
The leading dimension of the array A. LDA >= max(1,M).<br />
IPIV (output) INTEGER array, dimension (min(M,N))<br />
The pivot indices; for 1
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Espaces <strong>de</strong> noms<br />
Lors <strong>de</strong> l’utilisation combinée <strong>de</strong> bibliothèques <strong>de</strong> fonctions, il<br />
peut y avoir conflit entre <strong>de</strong>s noms (i<strong>de</strong>ntificateurs). Les<br />
espaces <strong>de</strong> noms permettent <strong>de</strong> régler ce type <strong>de</strong> problèmes.<br />
namespace N {<br />
int i,j ;<br />
void f() { ... }<br />
class C { ... } ; }<br />
L’appel dans le programme principal se fait alors avec :<br />
N::f() ; Les i<strong>de</strong>ntificateurs déclarés dans un espace <strong>de</strong> noms<br />
sont appelés membres <strong>de</strong> l’espace. Ce qui différencie les espaces<br />
<strong>de</strong> noms <strong>de</strong>s autres régions déclaratives (blocs, structures,<br />
classes) c’est leur possibilité d’être définis ≪ par morceaux ≫.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Espaces <strong>de</strong> noms<br />
l’instruction using<br />
La déclaration :<br />
using N::C ; introduit la classe N::C dans la région<br />
courante.<br />
using N::C ;<br />
C c ; //c’est-à-dire N::C<br />
La directive :<br />
using namespace N ; introduit tous les i<strong>de</strong>ntificateurs <strong>de</strong><br />
N dans la région courante. Tous les objets déclarés dans N<br />
peuvent alors être utilisés sans l’opérateur <strong>de</strong> résolution <strong>de</strong><br />
portée (::).<br />
Attention aux déclarations multiples <strong>de</strong> variables (non<br />
constantes), si l’espace <strong>de</strong> nom est inclus dans différents<br />
fichiers sources. ⇒utiliser le mot-clef ≪ extern ≫.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Variables statiques<br />
Une variable déclarée static est valable jusqu’à la fin <strong>de</strong><br />
l’exécution.<br />
Cela peut être une façon déguisée <strong>de</strong> passer <strong>de</strong>s arguments<br />
à une fonction,<br />
ou une ai<strong>de</strong> pour ne pas avoir à réévaluer certains objets<br />
ou allouer <strong>de</strong>s tableaux.<br />
Attention aux programmes parallélisés !<br />
Les variables statiques ≪ simples ≫sont en voie <strong>de</strong> disparition<br />
en C++. On peut utiliser à leur place les espaces <strong>de</strong> noms.<br />
Elles restent intéressantes comme membres <strong>de</strong> classe.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Variables statiques<br />
Une variable déclarée static est valable jusqu’à la fin <strong>de</strong><br />
l’exécution.<br />
Cela peut être une façon déguisée <strong>de</strong> passer <strong>de</strong>s arguments<br />
à une fonction,<br />
ou une ai<strong>de</strong> pour ne pas avoir à réévaluer certains objets<br />
ou allouer <strong>de</strong>s tableaux.<br />
Attention aux programmes parallélisés !<br />
Les variables statiques ≪ simples ≫sont en voie <strong>de</strong> disparition<br />
en C++. On peut utiliser à leur place les espaces <strong>de</strong> noms.<br />
Elles restent intéressantes comme membres <strong>de</strong> classe.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Espaces anonymes<br />
Il s’agit d’un espace <strong>de</strong> noms ... sans nom !<br />
namespace<br />
{<br />
int nombre d appels = 0 ;<br />
void affiche n appels() { cout ... }<br />
}<br />
Le nom est attribué par le compilateur et dépend du fichier. En<br />
plus, la directive using avec ce nom est insérée après sa<br />
définition.<br />
⇒C’est une façon alternative d’écrire :<br />
static int nombre d appels = 0 ; ...
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Espaces anonymes<br />
Il s’agit d’un espace <strong>de</strong> noms ... sans nom !<br />
namespace<br />
{<br />
int nombre d appels = 0 ;<br />
void affiche n appels() { cout ... }<br />
}<br />
Le nom est attribué par le compilateur et dépend du fichier. En<br />
plus, la directive using avec ce nom est insérée après sa<br />
définition.<br />
⇒C’est une façon alternative d’écrire :<br />
static int nombre d appels = 0 ; ...
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Membres statiques<br />
Données membres statiques :<br />
Les données membres statiques sont partagées par toutes les<br />
instances <strong>de</strong> la classe.<br />
class Alpha {<br />
static double se ;... } ;<br />
Puis, dans le programme principal (ou appelant), on peut<br />
définir sa valeur, avant toute instance :<br />
Alpha::se = 6.67<br />
Alpha a;<br />
double y = a.se/2. ;<br />
ou encore : double y = Alpha::se/2 ;<br />
Fonctions membres statiques :<br />
Elles ont les mêmes propriétés que les données membres. Les<br />
fonctions membres statiques publiques peuvent donc être<br />
utilisées indépendamment <strong>de</strong> tout objet.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Conversion <strong>de</strong> types<br />
Toute règle a besoin d’exception...<br />
Une conversion entre <strong>de</strong>ux types <strong>de</strong> variables peut se faire<br />
<strong>de</strong> manière implicite ou explicite :<br />
int i ;<br />
double x = i ; // c’est implicite<br />
double y = double(i) ; // c’est explicite<br />
double z = (double) i ; // aussi explicite, et ça<br />
marche avec les pointeurs...<br />
Quelle que soit la manière d’écrire la conversion, il faut que<br />
la fonction qui effectue la conversion existe quelque part !
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Conversion <strong>de</strong> types<br />
Constructeurs à un paramètre<br />
C’est un constructeur d’une classe qui peut être appelé<br />
avec un seul argument (il prend un seul argument ou<br />
un seul argument sans valeur par défaut).<br />
Sans mention contraire (explicit), il peut être utilisé<br />
pour faire une conversion implicite :<br />
explicit Tab(int size0) ;<br />
Sinon, c’est un constructeur <strong>de</strong> conversion, qui permet<br />
<strong>de</strong> passer du type int au type Tab. L’inverse est<br />
impossible avec un constructeur, il faut définir un<br />
opérateur <strong>de</strong> conversion.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Conversion <strong>de</strong> types<br />
Opérateurs <strong>de</strong> conversion <strong>de</strong> type<br />
Il est possible <strong>de</strong> définir une fonction membre :<br />
A::operator B()<br />
qui définit une conversion <strong>de</strong> A vers B.<br />
Cet opérateur peut être utilisé par le compilateur pour<br />
effectuer <strong>de</strong>s conversions implicites. Pour éviter cela, il faut<br />
utiliser le mot-clef explicit :<br />
class Z {<br />
public:<br />
explicit operator int() ;<br />
} ;
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Conversions <strong>de</strong> types<br />
Conversions implicites<br />
Lors d’une conversion implicite, le compilateur doit choisir une<br />
série <strong>de</strong> conversions parmi les ≪ standards ≫du langage et celles<br />
définies par l’utilisateur. Les standards sont :<br />
les changements entre const et non-const,<br />
les changements entre entiers (char, short, int,<br />
long, unsigned...) ou booléens,<br />
les changements entre float et double,<br />
les conversions entre entiers et réels,<br />
certaines conversions entre pointeurs (<strong>de</strong> type (type *)<br />
vers (void *), entre pointeurs sur la classe dérivée et sur<br />
la classe <strong>de</strong> base),<br />
entre tableaux et pointeurs d’un même type.<br />
Une séquence <strong>de</strong> conversions implicites ne peut contenir plus<br />
d’une conversion définie par l’utilisateur.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Conversions <strong>de</strong> types<br />
Conversions implicites<br />
Lors d’une conversion implicite, le compilateur doit choisir une<br />
série <strong>de</strong> conversions parmi les ≪ standards ≫du langage et celles<br />
définies par l’utilisateur. Les standards sont :<br />
les changements entre const et non-const,<br />
les changements entre entiers (char, short, int,<br />
long, unsigned...) ou booléens,<br />
les changements entre float et double,<br />
les conversions entre entiers et réels,<br />
certaines conversions entre pointeurs (<strong>de</strong> type (type *)<br />
vers (void *), entre pointeurs sur la classe dérivée et sur<br />
la classe <strong>de</strong> base),<br />
entre tableaux et pointeurs d’un même type.<br />
Une séquence <strong>de</strong> conversions implicites ne peut contenir plus<br />
d’une conversion définie par l’utilisateur.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Conversions <strong>de</strong> types<br />
Conversions implicites<br />
Lors d’une conversion implicite, le compilateur doit choisir une<br />
série <strong>de</strong> conversions parmi les ≪ standards ≫du langage et celles<br />
définies par l’utilisateur. Les standards sont :<br />
les changements entre const et non-const,<br />
les changements entre entiers (char, short, int,<br />
long, unsigned...) ou booléens,<br />
les changements entre float et double,<br />
les conversions entre entiers et réels,<br />
certaines conversions entre pointeurs (<strong>de</strong> type (type *)<br />
vers (void *), entre pointeurs sur la classe dérivée et sur<br />
la classe <strong>de</strong> base),<br />
entre tableaux et pointeurs d’un même type.<br />
Une séquence <strong>de</strong> conversions implicites ne peut contenir plus<br />
d’une conversion définie par l’utilisateur.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Conversions <strong>de</strong> types<br />
Résolution <strong>de</strong>s surcharges<br />
La résolution <strong>de</strong>s surcharges est un algorithme complexe, qui se<br />
déroule en trois phases :<br />
détermination <strong>de</strong>s fonctions candidates (nom),<br />
détermination <strong>de</strong>s fonctions viables (arguments),<br />
détermination <strong>de</strong> la meilleure fonction viable (le<br />
≪ moins ≫<strong>de</strong> conversions).<br />
La <strong>de</strong>uxième étape recherche les fonctions dont les arguments<br />
sont compatibles, après conversions implicites, avec la liste du<br />
programme.<br />
Le compilateur ne donne aucun avertissement sur les<br />
conversions qu’il a utilisées, ce qui peut donner <strong>de</strong>s résultats<br />
incompréhensibles ou <strong>de</strong>s ambiguïtés.<br />
⇒il faut définir un maximum <strong>de</strong> constructeurs et opérateurs <strong>de</strong><br />
conversion explicites.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Conversions <strong>de</strong> types<br />
Résolution <strong>de</strong>s surcharges<br />
La résolution <strong>de</strong>s surcharges est un algorithme complexe, qui se<br />
déroule en trois phases :<br />
détermination <strong>de</strong>s fonctions candidates (nom),<br />
détermination <strong>de</strong>s fonctions viables (arguments),<br />
détermination <strong>de</strong> la meilleure fonction viable (le<br />
≪ moins ≫<strong>de</strong> conversions).<br />
La <strong>de</strong>uxième étape recherche les fonctions dont les arguments<br />
sont compatibles, après conversions implicites, avec la liste du<br />
programme.<br />
Le compilateur ne donne aucun avertissement sur les<br />
conversions qu’il a utilisées, ce qui peut donner <strong>de</strong>s résultats<br />
incompréhensibles ou <strong>de</strong>s ambiguïtés.<br />
⇒il faut définir un maximum <strong>de</strong> constructeurs et opérateurs <strong>de</strong><br />
conversion explicites.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Conversions <strong>de</strong> types<br />
La famille <strong>de</strong> cast<br />
L’opération <strong>de</strong> cast marche en C++, mais est à éviter (aucun<br />
contrôle). Il existe 4 opérateurs <strong>de</strong> conversion plus explicites :<br />
reinterpret cast(type <strong>de</strong>part),<br />
pour les conversions mal définies (envoie une suite <strong>de</strong> bits<br />
sans interprétation).<br />
static cast(type <strong>de</strong>part), pour<br />
les conversions bien définies (mais pas <strong>de</strong>s const).<br />
const cast(type <strong>de</strong>part), pour<br />
enlever ou ajouter l’attribut const à un type.<br />
dynamic cast(p), T est un type pointeur et p un<br />
pointeur vers un type polymorphe. p est converti en T si le<br />
type dynamique <strong>de</strong> *p est T ou un type dont T est une<br />
classe <strong>de</strong> base. S’il y a échec le résultat est 0x0.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Pointeurs <strong>de</strong> fonctions<br />
On ne peut faire que <strong>de</strong>ux choses avec une fonction :<br />
l’appeler et prendre son adresse. Le pointeur obtenu en<br />
prenant l’adresse d’une fonction peut être ensuite utilisé<br />
pour appeler cette fonction :<br />
void error(char *p) { ... }<br />
void (*efct)(char*) ; //pointeur <strong>de</strong> fonction<br />
efct = &error ;//’efct’ pointe vers ’error’<br />
(*efct)("error") ;//appel<br />
Il peut aussi être utile d’avoir <strong>de</strong>s tableaux <strong>de</strong> pointeurs <strong>de</strong><br />
fonctions.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Pointeurs <strong>de</strong> fonctions<br />
On ne peut faire que <strong>de</strong>ux choses avec une fonction :<br />
l’appeler et prendre son adresse. Le pointeur obtenu en<br />
prenant l’adresse d’une fonction peut être ensuite utilisé<br />
pour appeler cette fonction :<br />
void error(char *p) { ... }<br />
void (*efct)(char*) ; //pointeur <strong>de</strong> fonction<br />
efct = &error ;//’efct’ pointe vers ’error’<br />
(*efct)("error") ;//appel<br />
Il peut aussi être utile d’avoir <strong>de</strong>s tableaux <strong>de</strong> pointeurs <strong>de</strong><br />
fonctions.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Modèles<br />
Fonctions<br />
D’une manière générale, ce sont <strong>de</strong>s canevas décrivant une<br />
famille <strong>de</strong> composants : famille <strong>de</strong> fonctions, famille <strong>de</strong> types,<br />
famille <strong>de</strong> membres, ...<br />
Ils sont définis à l’ai<strong>de</strong> du mot-clef template.<br />
Dans le cas <strong>de</strong>s fonctions, on déclare :<br />
template<br />
void f() {<br />
float tab[N] ;<br />
for (int i=0; i> tab[i] ; ...<br />
}<br />
Puis, dans le programme principal :<br />
const int n = 128 ;<br />
f() ;
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Modèles<br />
Fonctions<br />
D’une manière générale, ce sont <strong>de</strong>s canevas décrivant une<br />
famille <strong>de</strong> composants : famille <strong>de</strong> fonctions, famille <strong>de</strong> types,<br />
famille <strong>de</strong> membres, ...<br />
Ils sont définis à l’ai<strong>de</strong> du mot-clef template.<br />
Dans le cas <strong>de</strong>s fonctions, on déclare :<br />
template<br />
void f() {<br />
float tab[N] ;<br />
for (int i=0; i> tab[i] ; ...<br />
}<br />
Puis, dans le programme principal :<br />
const int n = 128 ;<br />
f() ;
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Modèles<br />
Classes<br />
template<br />
class Tab {<br />
double tab[B-A+1] ;<br />
public:<br />
double &operator[](int i) {<br />
assert(i>=A && i
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Modèles<br />
Paramètres-types<br />
En général, les paramètres <strong>de</strong> modèles sont <strong>de</strong> type<br />
arithmétiques (valeur, pointeur ou référence) et ne<br />
peuvent être modifiés.<br />
On peut néanmoins donner comme paramètre un type :<br />
template<br />
void swap(C &a, C &b) { ... }<br />
ou à l’ai<strong>de</strong> du mot-clef typename :<br />
template<br />
void swap(C &a, C &b) { ... }<br />
Puis, à l’appel :swap(i1,i2) ;<br />
ou swap(x1,x2);<br />
Cela s’applique <strong>de</strong> la même façon aux modèles <strong>de</strong> classes. Ces<br />
<strong>de</strong>ux genres <strong>de</strong> paramètres peuvent se combiner avec,<br />
éventuellement, <strong>de</strong>s valeurs par défaut.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Modèles<br />
Compilation <strong>de</strong>s modèles avec paramètres-types<br />
Un modèle (fonction ou classe) avec un<br />
paramètre-type ne peut pas être compilé si le<br />
type n’est pas spécifié.<br />
Il faut donc traiter les définitions comme <strong>de</strong>s<br />
déclarations et les inclure dans les<br />
programmes utilisant ces modèles (pas <strong>de</strong> lien<br />
par le compilateur).<br />
La compilation du modèle (classe ou<br />
fonction) se fera à chaque instance ou appel.
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Bibliothèques pré-définies<br />
Gestion <strong>de</strong>s entrées / sorties<br />
Les bibliothèques d’entrées/sorties et l’espace <strong>de</strong><br />
nom std (cela peut dépendre <strong>de</strong> l’âge du compilateur) :<br />
ios<br />
istream<br />
ostream<br />
iostream<br />
ifstream<br />
fstream<br />
fstreambase ofstream
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Bibliothèques pré-définies<br />
Mo<strong>de</strong>s d’ouverture <strong>de</strong>s flots<br />
La déclaration du constructeur <strong>de</strong> ofstream à partir d’un nom<br />
(<strong>de</strong> fichier) est, en fait, la suivante :<br />
explicit ofstream::ofstream(const char *name,<br />
ios base::openmo<strong>de</strong><br />
mo<strong>de</strong>=ios base::out|ios base::trunc) ;<br />
app : en mo<strong>de</strong> ajout à la fin<br />
ate : positionné à la fin<br />
in : en mo<strong>de</strong> lecture<br />
out : en mo<strong>de</strong> écriture<br />
binary : en mo<strong>de</strong> binaire<br />
trunc : efface le contenu à l’ouverture
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Bibliothèques pré-définies<br />
Gestion <strong>de</strong>s exceptions<br />
Une possibilité est d’utiliser les assert. Mais il existe une<br />
gestion très complète qui est, pour partie, définie dans<br />
et fait appel aux trois instructions<br />
throw/try/catch.<br />
void g(const char *name) {<br />
FILE *f ;<br />
f = fopen(name,"r") ;<br />
if (f==NULL) throw 1 ; } , et, dans une fonction<br />
appelante ∗ :<br />
try {<br />
g(name) ; }<br />
catch(int n) {<br />
if (n==1) cout
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Bibliothèques pré-définies<br />
Gestion <strong>de</strong>s exceptions<br />
S’il n’y a aucun catch avec le bon argument pour<br />
rattraper l’expression lancée par throw, alors le programme<br />
est arrêté.<br />
Un bloc try peut être suivi <strong>de</strong> plusieurs gestionnaires<br />
catch :<br />
catch(int) { ... }<br />
catch(char *msg) { ... }<br />
catch(...) { ... }<br />
return 0 ;<br />
Le premier qui a un argument compatible sera exécuté,<br />
puis le programme continuera après le <strong>de</strong>rnier catch.<br />
La présence d’une instruction throw; dans un gestionnaire<br />
indique que l’exception doit continuer à remonter à travers<br />
la pile <strong>de</strong>s appels (traitement partiel).
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Bibliothèques pré-définies<br />
Gestion <strong>de</strong>s exceptions<br />
Une fonction peut spécifier dans sa déclaration et sa définition<br />
les exceptions qu’elle est en mesure <strong>de</strong> lancer, directement ou<br />
par propagation :<br />
void g(int p) throw(char *) { ... }<br />
Lorsque rien n’est mentionné, la fonction peut lancer n’importe<br />
quel type d’exception. Si throw() est mentionné, aucune<br />
exception ne peut être lancée (attention à la remontée <strong>de</strong>s<br />
appels !).<br />
Les bibliothèques , et <br />
contiennent un certain nombre <strong>de</strong> classes utilisées par le<br />
système et lancées par les opérateurs du langage :<br />
bad exception, bad alloc, bad cast,<br />
invalid argument, overflow error, ...
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
Bibliothèques pré-définies<br />
Gestion <strong>de</strong>s exceptions<br />
Une fonction peut spécifier dans sa déclaration et sa définition<br />
les exceptions qu’elle est en mesure <strong>de</strong> lancer, directement ou<br />
par propagation :<br />
void g(int p) throw(char *) { ... }<br />
Lorsque rien n’est mentionné, la fonction peut lancer n’importe<br />
quel type d’exception. Si throw() est mentionné, aucune<br />
exception ne peut être lancée (attention à la remontée <strong>de</strong>s<br />
appels !).<br />
Les bibliothèques , et <br />
contiennent un certain nombre <strong>de</strong> classes utilisées par le<br />
système et lancées par les opérateurs du langage :<br />
bad exception, bad alloc, bad cast,<br />
invalid argument, overflow error, ...
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
La Standard Template Library (STL)<br />
C’est une bibliothèque (présente dans /usr/.../inclu<strong>de</strong>/g++/)<br />
qui permet d’utiliser <strong>de</strong>s modèles standard, fréquemment<br />
utilisés par un certain nombre <strong>de</strong> programmeurs en C++. Par<br />
exemple, le modèle <strong>de</strong> classes vector :<br />
template<br />
class vector ;<br />
c’est un conteneur, qui se rapproche le plus <strong>de</strong>s tableaux<br />
C++,<br />
il détecte quand on dépasse sa capacité et s’agrandit<br />
automatiquement,<br />
il dispose <strong>de</strong> fonctions membres size, erase, clear ou<br />
insert.<br />
Il est déclaré dans .
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
La Standard Template Library (STL)<br />
D’autres modèles existent :<br />
<strong>de</strong>s utilitaires (dans et ),<br />
d’autres conteneurs (dans et ),<br />
<strong>de</strong>s composants pour le calcul numérique (,<br />
),<br />
<strong>de</strong>s itérateurs, algorithmes, ...
Le C++<br />
Jérôme Novak<br />
Introduction<br />
Motivations<br />
Les cours<br />
Quelques bases<br />
Les classes<br />
Syntaxe<br />
Les types<br />
Les fonctions<br />
Les instructions<br />
Pointeurs<br />
Entrées/Sorties<br />
Constantes<br />
Les classes<br />
Les membres<br />
Accès<br />
Surcharges<br />
const<br />
Héritage<br />
Héritage simple<br />
Hér. multiple<br />
Polymorphisme<br />
≪ En<br />
pratique ≫<br />
Références<br />
C++0x<br />
Des nouveautés, pas <strong>de</strong> révolution, mais encore peu <strong>de</strong><br />
compilateurs la prennent en compte : par ex. g++ -std=c++0x<br />
Appel à un autre constructeur <strong>de</strong>puis un constructeur <strong>de</strong><br />
la meme classe<br />
boucles sur <strong>de</strong>s tableaux<br />
type ≪ auto ≫. . .et <strong>de</strong>cltype<br />
pointeur nul nullptr<br />
fonctions anonymes<br />
gestion du temps (bibliothèque )<br />
. . .