20.07.2013 Views

Cours - LUTH - Observatoire de Paris

Cours - LUTH - Observatoire de Paris

Cours - LUTH - Observatoire de Paris

SHOW MORE
SHOW LESS

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 />

. . .

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!