Programmation Objet en
Langage C++
Organisation• 3 séances de Cours Magistral
• Romain Pacanowski @ institutoptique.fr
• 13 séances de TP sur machines • Bertrand Simon @ institutoptique.fr
• 7 séances sur un projet de programmation • Séances non encadrées • En binôme • Sujets assignés aux binôme aléatoirement
2
Page du Cours et des TP
http://manao.inria.fr/perso/~pac/cpp.php • Notes de Cours • Sujets des TP • Sujets des Projets • Bibliographie
3
Évaluation• Travaux Pratiques
• Remise de code en fin de • Séance 5 • Séance 13
• Examen Final • Décembre 2017 13h30 (à confirmer) • Soutenance orale sur le projet
• 10 minutes • Passage par binôme • Evaluation individuelle
• Copier/Coller de code
4
Rappel sur le plagiatCopier-coller de code == Plagiat
Dans tout établissement d’enseignement supérieur: • Conséquences:
• Zéro à l’examen • Absence de rattrapage • Validation de l’année déterminée par le jury final
En entreprise: • Poursuite judiciaire • Sanction: blâme jusqu’au licenciement pour faute
• Discussions et échanges sont encouragés
5
Travail Personnel• Programmer == Pratiquer (Beaucoup !)
• Début: activité chronophage (C’est normal !) • Minimal:
• Faire les exercices de TP en séance Ne pas être passif !
• Refaire les exemples des slides du cours • Conseillé:
• Lire d’autres cours C++ • Suivre des tutoriaux:
https://openclassrooms.com/courses/programmez-avec-le-langage-c
6
L’activité de Programmer• Ecrire avec convention de codage
http://manao.inria.fr/perso/~pac/teaching/cpp/conventions-codage.pdf
• Compiler • Compilateur
• Corriger (e.g., erreur de syntaxe) • Executer • Corriger (e.g., segfault)
• Débogueur • Tester
• Automatique (e.g., Catch)
7
Déroulement des Cours• Cours 1
• Tour d'horizon rapide du C++ • Éléments de programmation impérative en C++ • De la Structure C à la Classe C++
• Cours 2
• Cours 3
8
Historique C, C++, Java et C#, Python
1963
1998
2002
1978
1967 1995
2011
2011
1973
Travaux pré. Ritchie & Thomson
@Bell LabsC Travaux de l'ANSI
GCC
C++
C99 C11
1999
Noyau Unix
C K&R C-Book
ISO C++11
1987
1983
Simula
1979
JavaPython
1994
C#
1983
Travaux pré C++
Stroustrup @Bell Labs
19851st
Release
2nd Releas
e
1989
1989/90
C89
C99
ISO C++98
2003ISO C++03
Standardisations/Normes du C++• C++98
• 1998 : ISO/IEC 14882:1998 • C++03
• 2003 : ISO/IEC 14882:2003 • C++TR1
• 2007 : ISO/IEC TR 19768:2007 • C++11 (avant C++0x)
• 2011 : ISO/IEC 14882:2011 • C++14 • C++17
10
Design du C++l Syntaxe épurée du C
→ Conserver le savoir-faire != compatibilité du code l Améliorer la productivité du programmeur
− Simplifier le langage à la place du compilateur l Portabilité et Efficacité similaire au C
− « Zero-overhead » principle l Liberté : responsabiliser le programmeur
− e.g., gestion de la mémoire
Design du C++
l Limitations historique du C − Assembleur de haut niveau != langage de prog. impératif
− L'absence l de typage des macros l de passage par adresse (par opposition à copie)
− La rarification des noms d'identificateurs
Caractéristiques générales du C++• Langage compilé • Syntaxe ala C
• Transition facilitée des développeurs • Typage statique (à la compilation) • C++
• N’est pas une extension objet du C • Un programme C ne compile pas forcément en C
++ • Même en appliquant la norme ISO.
13
6=
Caractéristiques générales du C++
• « Grande Comptabilité » avec le C • Conversion des librairies C pour utilisation depuis
C++
• Multiplateformes en appliquant la norme ISO • Window, Mac OS , Linux, *BSD (e.g., FreeBSD)
• Gestion des erreurs avec des exceptions
14
Caractéristiques générales du C++
• Paradigmes de programmation : • Impérative • Programmation par objet • Générique (templates) • Meta-templates....
→ Langage « hybride »
15
Objectifs du Cours et des TP• Maîtrise des Concepts clés C++
• Référence • Constness
• Concepts fondamentaux de POO • Classe, Objet, Héritage, Polymorphisme,
Composition, Agrégation
• Initiation et Utilisation • Standard Templates Library (STL)
16
Démo 1 sur le C++ impératif
17
Arbres de recherche 85
Premier exemple en C++
1: #include <iostream>
3: int main(int argc, char** argv ) { 4: std::cout << " HOWDY !!! " << std::endl; 5: return 0; }
Types de données en C++• Types primitifs (fondamentaux)
• Très proches du langage C • Types signés et non-signés (unsigned) • Compris intrinsèquement par le compilateur
• Types abstrait/objet • Classes créés par le programmeur • Appris à la « volée » par le compilateur
19
Types primitifs• Norme C++
• Ne spécifie pas le nombre de bits • Utilisation de → sizeof() • Valeurs minimales et maximales que le type
• #include <climits> • #include <cfloat> • Exemple
• std::numeric_limits<float>::min()
• 4 types de base • char, int, float, double
20
Types primitifs• 4 types de base
• char, int, float, double • bool
• Valeurs : true or false • Conversion du compilateur vers int • → mauvais usage (historique)
• Valeurs minimales et maximales du type #include <climits> #include <cfloat>
21
Modificateurs de types primitifs• 4 modificateurs
• long, short,unsigned, signed • Hiérarchie
• sur les entiers : short int, int, int, long int • sur les flottants : float, double, long double
• signed • Implicite sur tous les types sauf char
22
Exercice sur les types primitifs• Afficher la taille de tous les types
• en utilisant l'opérateur sizeof • avec et sans modificateurs
• Afficher la borne inf et sup • de chacun des types primitifs • utilisez
• std::numeric_limits<TYPE>::min() • std::numeric_limits<TYPE>::max()
23
Slides Complémentaires
Partie Programmation Impérative
24
Arbres de recherche 73
Inclusion des fichiers en-tête (1/2)// Header type <...> #include <iostream> // Header lib STL (C++) #include < iostream > // Ne marchera PAS
La syntaxe <...>
l Utiliser pour la librairie standard l Abstraction du système de fichier (nom, répertoire) de l'OS lLe préprocesseur se charge :
l De trouver quel fichier correspond au nom (iostream ici) l De remplacer la directive d'inclusion par le contenu du fichier
trouvé (copy & paste)
Arbres de recherche 74
Inclusion des fichiers en-tête (2/2)// Header type "…" #include "myvect.hpp" // Depuis dir. courant #include "math/myvect.hpp" // Chemin vers rep.
math La syntaxe "..."
l Le préprocesseur se charge :
l d'inclure le fichier spécifié à partir du répertoire courant d'appel du compilateur/pré-processeur
l De remplacer la directive d'inclusion par le contenu du fichier trouvé (copy & paste)
Pointeur
l Modèle de mémoire − adresses continues et croissantes
l Opérateur adresse − identique en C et C++ − Syntaxe : &
Adresses Mémoire... ...
000012 ...000008 ….000004 int b = 4000000 int a = 3
Pointeur : un premier exemple#include <iostream> using namespace std; int toto, tutu, titi, tata ; void f( int x ) { cout << "x vaut " << x << endl; } int main(int argc, char** argv) { int i, j, k ; cout << "f() @ " << (long) &f << endl ; cout << "toto @ " << (long) &toto << endl ; cout << "tutu @ " << (long) &tutu << endl ; cout << "titi @ " << (long) &titi << endl ; cout << "tata @ " << (long) &tata << endl ; cout << "i @ " << (long) &i << endl ; cout << "j @ " << (long) &j << endl ; cout << "k @ " << (long) &k << endl ; return 0 ; }
Pointeur : un premier exemple#include <iostream> using namespace std; int toto, tutu, titi, tata ; void f( int x ) { cout << "x vaut " << x << endl; } int main(int argc, char** argv) { int i, j, k ; cout << "f() @ " << (long) &f << endl ; cout << "toto @ " << (long) &toto << endl ; cout << "tutu @ " << (long) &tutu << endl ; cout << "titi @ " << (long) &titi << endl ; cout << "tata @ " << (long) &tata << endl ; cout << "i @ " << (long) &i << endl ; cout << "j @ " << (long) &j << endl ; cout << "k @ " << (long) &k << endl ; return 0 ; }
$ ./hello-ptr.exe
f() @ 4294970484
toto @ 4294971604 tutu @ 4294971608 titi @ 4294971612 tata @ 4294971616
i @ 140734799804652 j @ 140734799804648 k @ 140734799804644
Pointeur : opérateur de déférencement#include <iostream> using namespace std; int toto, tutu, titi, tata ; void f( int x ) { cout << "x vaut " << x << endl; } int main(int argc, char** argv) { int i = 5 ; int* p_i = &i ; cout << " @i = " << &i << endl << " p_i = " << p_i << endl << " @p_i = " << &p_i << endl; *p_i = 100 ; cout << " i = " << i << endl ;
return 0 ; }
Adresses
Mémoire... ...
000012 p_i000008 i000004 ...000000 ...
1:2:3:4:5:6:7:8:9:10:11:12:13:14:
Qu'afficherait ce programme ?
Introduction aux références• Références n'existent qu'en C++ • Forme plus sûre
• Passage par adresse à une fonction • Nécessité pour les classes et les objets
• Attention ! • Syntaxe identique à l'opérateur d'adressage (&)
• Définition Formelle: • Pointeur constant (sûreté) automatiquement
déférencé (facilité d’utilisation, pas de -> ) • Truc: Référence est à gauche du signe "="
31
Exemple d'utilisation de référence1: 2: 3: 4: 5: 6: 7: 8: 9: 10
: 11
: 12
: 13
: 14
: 15
: 16
:
#include <iostream> using namespace std;
void f( int & r ) { cout << "r vaut " << r << endl; cout << "@r vaut " << &r << endl; r = 5; cout << "r vaut " << r << endl;}int main(int argc, char** argv) { int x = 47 ; cout << " x = " << x << endl << " @x = " << &x << endl; f(x) ; cout << " x = " << x << endl; return 0 ;}
Exemple d'utilisation de référence1: 2: 3: 4: 5: 6: 7: 8: 9: 10
: 11
: 12
: 13
: 14
: 15
: 16
:
#include <iostream> using namespace std;
void f( int & r ) { cout << "r vaut " << r << endl; cout << "@r vaut " << &r << endl; r = 5; cout << "r vaut " << r << endl;}int main(int argc, char** argv) { int x = 47 ; cout << " x = " << x << endl << " @x = " << &x << endl; f(x) ; cout << " x = " << x << endl; return 0 ;}
Passage par référence de r !!!
Exemple d'utilisation de référence1: 2: 3: 4: 5: 6: 7: 8: 9: 10
: 11
: 12
: 13
: 14
: 15
: 16
:
#include <iostream> using namespace std;
void f( int & r ) { cout << "r vaut " << r << endl; cout << "@r vaut " << &r << endl; r = 5; cout << "r vaut " << r << endl;}int main(int argc, char** argv) { int x = 47 ; cout << " x = " << x << endl << " @x = " << &x << endl; f(x) ; cout << " x = " << x << endl; return 0 ;}
Passage par référence de r !!!
>$ ./hello-reference.exe x = 47
@x = 0x7fff5fbff8cc r vaut 47
@r vaut 0x7fff5fbff8cc r vaut 5 x = 5
Caractéristiques générales du C++
• Paradigmes de programmation : − Impérative − Programmation par objet − Générique (templates) − Meta-templates....
→ Langage « hybride »