C [PDF]

  • 0 0 0
  • Gefällt Ihnen dieses papier und der download? Sie können Ihre eigene PDF-Datei in wenigen Minuten kostenlos online veröffentlichen! Anmelden
Datei wird geladen, bitte warten...
Zitiervorschau

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