41 0 785KB
Introduction ¿ la Programmation Orient …e Objet
Cours de C++
Guillaume Caumon, Février 2007
Le C++ Introduction Du C au C++ Les Classes Lᾼh…ritage Programmation g…n…rique
Pourquoi ce cours ? Place importante de la modélisation en Geosciences : - validation d’une théorie - prédiction et calculs - évaluation des risques
Les phénomènes étudiés sont complexes La programmation orientée-objets peut faire gagner beaucoup de temps
Objectif du cours - Comprendre les concepts élémentaires de programmation orientée objet (POO) - Etre capable de lire et comprendre du code C++ - Analyser un problème et le décomposer pour mieux le traiter - Mettre en oeuvre les concepts de POO en langage C++ Connaissance
Temps
Agenda • • • • • • • •
Lundi pm : Du C au C++ Mardi am : exercices pratiques Mardi pm : Les classes Mercredi am : L’héritage Mercredi pm : quizz et exercices Jeudi am : exercices Vendredi am : Bibliothèque std + exercices Vendredi pm : colle (2h)
Bref historique L’algorithmique est une science ancienne (ex: algorithme d’ Euclide pour calculer le PGCD) pgcd(m, n) = pgcd(m − n, n) si m > n pgcd(m, n) = pgcd(m, n − m) si m < n Mais la programmation une science nouvelle (ou un art nouveau ? [Knuth, the Art of Computer programming]). - Métier à tisser de (1801): ancêtre des cartes perforées (Recencement 1890 - Brevet IBM 1930) - Développement de programmes assembleur à partir des 40’s
Bref historique Difficultés et erreurs Développement de langages pour rendre le codage plus intuitif: Fortran (1950), ALGOL Aujourd’hui: - langages procéduraux (Pascal, C,…). - langages fonctionnels (ML, CAML, …). - langages orientés-objet (ADA, SmallTalk, Eiffel, C++, Java, …).
Qualité d’un Programme ? 1 Validité
Le programme fonctionne
2 Extensibilité
Je peux le faire évoluer
3 Réutilisabilité
Je peux utiliser des composantes du programme pour d’autres applications
Comment s’y prendre ? Séparer le programme en modules réutilisables Unité fonctionelle autonome, possédant une interface (header.h) (impl.cpp) Independante de son implantation Par analyse fonctionnelle descendante Par analyse ascendante
On peut le faire en C… Modules = fonctions (déclaration / implementation) Communication entre modules = appels de fonctions Flexibilité et réutilisation par des pointeurs de fonctions MAIS: - Les données sont globales - Comprendre le programme équivaut à comprendre ce que fait chaque fonction
Exemple C / C++ Calcul de distance float hits[3][100] float x,y,z; int i = 0; float dist = 0; … for(i = 0; i < 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 < 100; i++ ){ float dist = points[i].distance(origin); }
Changer les coordonnées de l’origine ? Passer en référentiel sphérique ?
Différences C / C++ Langages compilés Analyse, mise en oeuvre et architecture des programmes Possibilités de vérifications en C++ lors de la compilation C++ offre des nouvelles possibilités
La conception par objets Cette méthode privilégie les données, et non les fonctions Trouver les objets (physiques) Décrire et classer les objets Opérations Liens Caractéristiques communes Implanter ces objets
Pourquoi concevoir des objets ? Un être humain peut facilement comprendre simultanément un seul aspect d’un problème “Diviser pour régner” Associer les données et les fonctionnalités Représenter des abstractions Recycler ces abstractions
Un langage orienté objet Permet: La définition d’objets, avec partie publique et privée La lisibilité (distinction interface / implémentation) La modularité (compilation séparée) La réutilisation (mise en facteur des fonctionalités) L’extension des objets (héritage) La définition d’objets abstraits
Exemple : les listes (code C) typedef struct LIST { NODE* p_first_node_ ; NODE* p_last_node_ ; int nb_items_ ; typedef struct NODE { } LIST ; struct NODE* next_ ; void* p_item_ ; } NODE ; LIST* LIST_Create() ; ()LIST* ; p_list ) ; void LIST_Destroy( ( ; BOOLEAN LIST_Owns_Item () LIST* p_list, PNTR* item … ) ; Plus explicite… Mais le compilateur C ne peut … pas vérifier les types
Exemple : les listes (code C) typedef struct DATA { int index_; char value_; } DATA;
BOOLEAN check_item( LIST* list, DATA* data ) { BOOLEAN found = LIST_Owns_Item( list, data ); if( found ) { printf( “Item %d , %c in List”, data->index_, data->value_ ); } return found; } Problème: Une fonction par type de donnée…
Exemple : les listes (code C++) class Node { … }; class List { public : List(); ~List(); bool owns_item( void* item ) const; private : Node* first_node_ ; Node* last_node_ ; int nb_items_ ; };
Exemple : les listes (code C++) class Data { public : Data( int index, char value ); void print() const; private : int ind_; char val_; }; bool check_item( List* list, Data* data ) { bool found = list->owns_item( data ); if( found ) { data->print(); } return found; }
Historique Créé par B. Stroustrup (Bell Labs. ) à partir de 1979 (“C with classes”). Initialement: code C++ précompilé → code C Devient public en 1985 sous le nom de C++. La version normalisée (ANSI) paraît en 1996.
C++ = C +
V…rifications de type + stricte Surcharge de fonctions Op…rateurs R…f…rences Gestion m…moire + facile Entr…es/sorties + facile Classes et h…ritage Programmation g…n…rique Ὴ
Un langage compilé… Langage = protocole de communication entre le programmeur et le processeur. Code C/C++ Code pr…-process… Librairies Fichier(s) Objet Programme
Le C++ Historique Du C au C++ Les Classes Lᾼh…ritage Programmation g…n…rique
Commentaires C
/* This is a multi-line C comment */
C++ /* This is just the same in C++, but… */ // … We also have single-line comments
Règles : • rester cohérent • appliquer une norme pour générer de la doc html automatiquement.
Prototypes de fonctions header.h // declaration in a header file. void function( int param1, int param2 = 10 ); impl.cpp // implementation file void function( int param1, int param2 ) { // print ‘param1’ and ‘param2’ to // the standard output. } client.cpp // main function int main( int argc, char** argv ) { function( 5, 3 ); function( 5 ); return 0; }
Surcharge
Surcharge de fonctions
int square( int value ); float square( float value ); double square( double value );
header.h
Surcharge d’opérateurs typedef struct Complex { float x_; float y_; }; Complex& operator+( Complex& lhs, const Complex& rhs );
complex.h
Utilisation de Complex comme d’un type standard
Surcharge • Les types des paramètres peuvent être utilisés pour la surchage, mais pas la valeur de retour. double square( double value ); float square( double value );
Erreur de compilation
Fonctions inlines // preprocessor macro #define MAX(x,y) (x > y) ? x : y;
// declaration inline bool max( int x, int y );
// implementation inline int max( int x, int y ) { return (x > y) ? x : y; }
header.h
Fonctions inlines client.cpp void client_function( int a, int b ) { inf c = 0; if( … ) c = MAX(a+=a, b+=b); // preproc macro else c = max(a+=a, b+=b); // inline function //… } Equivalent client.cpp void client_function( int a, int b ) { int c = 0; if( … ) c = (a+=a > b+=b) ? a+=a : b+=b; else { a += a; b += b; c = (a > b) ? a : b; //… }
Déclaration de variables C++ permet de déclarer des variables n’ importe où et de les initialiser. Règles: • toujours déclarer ses variables au dernier moment. • initialiser TOUTES les variables. • déclarer une variable par ligne.
Constance Pointeur variable vers une chaîne de caractères variable. const char* c2; Pointeur variable vers une chaîne de caractères constante. char* const c3; Pointeur constant vers une chaîne de caractères variable. const char* const c4; Pointeur constant vers une chaîne de caractères constante. char* c1;
Références Pointeurs
Références
int array[10]; int* pointer = &array[5]; int value = *pointer; *pointer = 100;
int array[10]; int& ref = array[5]; int value = ref; ref = 100;
Peut changer au cours du temps
Ne peut pas changer d’ objet
Peut être nul
Référence toujours une variable valide, définie lors de la déclaration de la référence
Références Pointeurs
Références
int a = 10; int* const p = &a;
int a = 10; int& r = &a;
Référence pointeur non nul qui indique toujours la meme adresse Conséquence : ne pas utiliser des T* const mais des T&, c’est plus élégant.
Allocation mémoire 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 typées.
Désallocation mémoire 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;
Entrées / Sorties (I) C #include
C++ #include #include #include
printf --> standard output cout --> standard output cerr --> standard error output scanf output file fscanf char*[N] sscanf