Cours de C++ Guillaume Caumon, Février 2007 Introduction à la Programmation Orientée Objet

  • Published on
    03-Apr-2015

  • View
    104

  • Download
    2

Embed Size (px)

Transcript

<ul><li> Page 1 </li> <li> Cours de C++ Guillaume Caumon, Fvrier 2007 Introduction la Programmation Oriente Objet </li> <li> Page 2 </li> <li> Le C++ Introduction Du C au C++ Les Classes Lhritage Programmation gnrique </li> <li> Page 3 </li> <li> Pourquoi ce cours ? Place importante de la modlisation en Geosciences : - validation dune thorie - prdiction et calculs - valuation des risques Les phnomnes tudis sont complexes La programmation oriente-objets peut faire gagner beaucoup de temps </li> <li> Page 4 </li> <li> Objectif du cours Connaissance Temps - Comprendre les concepts lmentaires de programmation oriente objet (POO) - Etre capable de lire et comprendre du code C++ - Analyser un problme et le dcomposer pour mieux le traiter - Mettre en oeuvre les concepts de POO en langage C++ </li> <li> Page 5 </li> <li> Agenda Lundi pm : Du C au C++ Mardi am : exercices pratiques Mardi pm : Les classes Mercredi am : Lhritage Mercredi pm : quizz et exercices Jeudi am : exercices Vendredi am : Bibliothque std + exercices Vendredi pm : colle (2h) </li> <li> Page 6 </li> <li> Bref historique Lalgorithmique est une science ancienne (ex: algorithme dEuclide pour calculer le PGCD) Mais la programmation une science nouvelle (ou un art nouveau ? [Knuth, the Art of Computer programming] ). - Mtier tisser de (1801): anctre des cartes perfores (Recencement 1890 - Brevet IBM 1930) - Dveloppement de programmes assembleur partir des 40s pgcd(m, n) = pgcd(m n, n) si m &gt; n pgcd(m, n) = pgcd(m, n m) si m &lt; n </li> <li> Page 7 </li> <li> Bref historique Difficults et erreurs Dveloppement de langages pour rendre le codage plus intuitif: Fortran (1950), ALGOL Aujourdhui: - langages procduraux (Pascal, C,). - langages fonctionnels (ML, CAML, ). - langages orients-objet (ADA, SmallTalk, Eiffel, C++, Java, ). </li> <li> Page 8 </li> <li> Qualit dun Programme ? 1 Validit Le programme fonctionne 2 Extensibilit Je peux le faire voluer 3 Rutilisabilit Je peux utiliser des composantes du programme pour dautres applications </li> <li> Page 9 </li> <li> Comment sy prendre ? Sparer le programme en modules rutilisables Par analyse fonctionnelle descendante Par analyse ascendante Unit fonctionelle autonome, possdant une interface Independante de son implantation (header.h) (impl.cpp) </li> <li> Page 10 </li> <li> On peut le faire en C Modules = fonctions (dclaration / implementation) Communication entre modules = appels de fonctions Flexibilit et rutilisation par des pointeurs de fonctions MAIS: - Les donnes sont globales - Comprendre le programme quivaut comprendre ce que fait chaque fonction </li> <li> Page 11 </li> <li> Exemple C / C++ Calcul de distance float hits[3][100] float x,y,z; int i = 0; float dist = 0; for(i = 0; i &lt; 100; i++ ){ x = hits[i][0]; y = hits[i][1]; z = hits[i][2]; dist = sqrt(x*x + y*y + z* z); } Point points[100]; Point orig(0, 0, 0); for( i = 0; i &lt; 100; i++ ){ float dist = points[i].distance(origin); } Changer les coordonnes de lorigine ? Passer en rfrentiel sphrique ? </li> <li> Page 12 </li> <li> Diffrences C / C++ Langages compils Analyse, mise en oeuvre et architecture des programmes Possibilits de vrifications en C++ lors de la compilation C++ offre des nouvelles possibilits </li> <li> Page 13 </li> <li> La conception par objets Cette mthode privilgie les donnes, et non les fonctions Trouver les objets (physiques) Dcrire et classer les objets Implanter ces objets OprationsLiens Caractristiques communes </li> <li> Page 14 </li> <li> Pourquoi concevoir des objets ? Un tre humain peut facilement comprendre simultanment un seul aspect dun problme Diviser pour rgner Associer les donnes et les fonctionnalits Reprsenter des abstractions Recycler ces abstractions </li> <li> Page 15 </li> <li> Un langage orient objet Permet: La dfinition dobjets, avec partie publique et prive La modularit (compilation spare) La rutilisation (mise en facteur des fonctionalits) Lextension des objets (hritage) La lisibilit (distinction interface / implmentation) La dfinition dobjets abstraits </li> <li> Page 16 </li> <li> Exemple : les listes (code C) typedef struct LIST { NODE* p_first_node_ ; NODE* p_first_node_ ; NODE* p_last_node_ ; NODE* p_last_node_ ; int nb_items_ ; int nb_items_ ; } LIST ; LIST* LIST_Create() ; void LIST_Destroy BOOLEAN LIST_Owns_Item typedef struct NODE { struct NODE* next_ ; struct NODE* next_ ; void* p_item_ ; void* p_item_ ; } NODE ; () ; ( LIST* p_list ) ; ( LIST* p_list, PNTR* item ) ; Plus explicite Mais le compilateur C ne peut pas vrifier les types </li> <li> Page 17 </li> <li> Exemple : les listes (code C) typedef struct DATA { int index_; int index_; char value_; char value_; } DATA; BOOLEAN check_item( LIST* list, DATA* data ) { BOOLEAN found = LIST_Owns_Item( list, data ); BOOLEAN found = LIST_Owns_Item( list, data ); if( found ) { if( found ) { printf( printf( Item %d, %c in List, Item %d, %c in List, data-&gt;index_, data-&gt;value_ data-&gt;index_, data-&gt;value_ ); ); } return found; return found;} Problme: Une fonction par type de donne </li> <li> Page 18 </li> <li> Exemple : les listes (code C++) class Node { }; class List { public : List(); List(); ~List(); ~List(); bool owns_item( void* item ) const; bool owns_item( void* item ) const; private : Node* first_node_ ; Node* first_node_ ; Node* last_node_ ; Node* last_node_ ; int nb_items_ ; int nb_items_ ;}; </li> <li> Page 19 </li> <li> Exemple : les listes (code C++) class Data { public : Data( int index, char value ); Data( int index, char value ); void print() const; void print() const; private : int ind_; int ind_; char val_; char val_;}; bool check_item( List* list, Data* data ) { bool found = list-&gt;owns_item( data ); bool found = list-&gt;owns_item( data ); if( found ) { if( found ) { data-&gt;print(); data-&gt;print(); } return found; return found;} </li> <li> Page 20 </li> <li> Historique Cr par B. Stroustrup (Bell Labs. ) partir de 1979 (C with classes). Initialement: code C++ prcompil code C Devient public en 1985 sous le nom de C++. La version normalise (ANSI) parat en 1996. C++ = C + Vrifications de type + stricte Surcharge de fonctions OprateursRfrences Gestion mmoire + facile Entres/sorties + facile Classes et hritage Programmation gnrique </li> <li> Page 21 </li> <li> Un langage compil Langage = protocole de communication entre le programmeur et le processeur. Code C/C++ Code pr-process Programme Librairies Fichier(s) Objet </li> <li> Page 22 </li> <li> Le C++ Historique Du C au C++ Les Classes Lhritage Programmation gnrique </li> <li> Page 23 </li> <li> Commentaires C /* This is a multi-line C comment */ C++ /* This is just the same in C++, but */ // We also have single-line comments Rgles : rester cohrent appliquer une norme pour gnrer de la doc html automatiquement. </li> <li> Page 24 </li> <li> Prototypes de fonctions // declaration in a header file. void function( int param1, int param2 = 10 ); header.h // implementation file void function( int param1, int param2 ) { // print param1 and param2 to // the standard output. } impl.cpp // main function int main( int argc, char** argv ) { function( 5, 3 ); function( 5 ); return 0; } client.cpp </li> <li> Page 25 </li> <li> Surcharge Surcharge de fonctions int square( int value ); float square( float value ); double square( double value ); header.h Surcharge doprateurs typedef struct Complex { float x_; float y_; }; Complex&amp; operator+( Complex&amp; lhs, Complex&amp; lhs, const Complex&amp; rhs const Complex&amp; rhs); complex.h Utilisation de Complex comme dun type standard </li> <li> Page 26 </li> <li> Surcharge Les types des paramtres peuvent tre utiliss pour la surchage, mais pas la valeur de retour. double square( double value ); float square( double value ); Erreur de compilation </li> <li> Page 27 </li> <li> Fonctions inlines // declaration inline bool max( int x, int y ); // implementation inline int max( int x, int y ) { return (x &gt; y) ? x : y; } header.h // preprocessor macro #define MAX(x,y) (x &gt; y) ? x : y; </li> <li> Page 28 </li> <li> Fonctions inlines void client_function( int a, int b ) { inf c = 0; inf c = 0; if( ) c = MAX(a+=a, b+=b); // preproc macro if( ) c = MAX(a+=a, b+=b); // preproc macro else c = max(a+=a, b+=b); // inline function else c = max(a+=a, b+=b); // inline function // //} client.cpp void client_function( int a, int b ) { int c = 0; int c = 0; if( ) c = (a+=a &gt; b+=b) ? a+=a : b+=b; if( ) c = (a+=a &gt; b+=b) ? a+=a : b+=b; else { a += a; b += b; else { a += a; b += b; c = (a &gt; b) ? a : b; c = (a &gt; b) ? a : b; // //} Equivalent client.cpp </li> <li> Page 29 </li> <li> Dclaration de variables C++ permet de dclarer des variables nimporte o et de les initialiser. Rgles: toujours dclarer ses variables au dernier moment. toujours dclarer ses variables au dernier moment. initialiser TOUTES les variables. initialiser TOUTES les variables. dclarer une variable par ligne. dclarer une variable par ligne. </li> <li> Page 30 </li> <li> Constance char* c1; Pointeur variable vers une chane de caractres variable. const char* c2; Pointeur variable vers une chane de caractres constante. char* const c3; Pointeur constant vers une chane de caractres variable. const char* const c4; Pointeur constant vers une chane de caractres constante. </li> <li> Page 31 </li> <li> Rfrences PointeursRfrences int array[10]; int* pointer = &amp;array[5]; int value = *pointer; *pointer = 100; int array[10]; int&amp; ref = array[5]; int value = ref; ref = 100; Peut changer au cours du temps Ne peut pas changer dobjet Peut tre nulRfrence toujours une variable valide, dfinie lors de la dclaration de la rfrence </li> <li> Page 32 </li> <li> Rfrences PointeursRfrences int a = 10; int* const p = &amp;a; int a = 10; int&amp; r = &amp;a; Rfrence pointeur non nul qui indique toujours la meme adresse Consquence : ne pas utiliser des T* const mais des T&amp;, cest plus lgant. </li> <li> Page 33 </li> <li> Allocation mmoire C int value = 10; int* var = (int*)malloc(sizeof(int)); *var = value; int* array = (int*)malloc(n*sizeof(int)); C++ int value = 10; int* var = new int( value ); int* array = new int[10]; En C++, les allocations sont types. </li> <li> Page 34 </li> <li> Dsallocation mmoire C int* var = (int*)malloc(sizeof(int)); int* array = (int*)malloc(n*sizeof(int)); free( var ); free( array ); C++ int* var = new int(); int* array = new int[10]; delete var; delete [] array; </li> <li> Page 35 </li> <li> CC++ #include #include printf --&gt; standard output scanf FILE* fscanf char[N] sscanf FILE* fscanf char[N] sscanf standard output cerr --&gt; standard error output cin output file ifstream char*[N] istringstream standard output cerr --&gt; standard error output cin output file ifstream char*[N] istringstream Entres / Sorties (I) </li> <li> Page 36 </li> <li> Entres / Sorties (II) C #include int value = 10; printf( value = %d\n, value ); printf( New value = ??\n ); scanf( %d, &amp;value ); C++ #include using namespace std; int value = 10; cout </li></ul>