410 likes | 516 Views
Introduction au C++. ikariya@via.ecp.fr. Erratum C. Surcharge For( int x=0; …. Au menu. Introduction Prérequis Documentation Problématiques Nouveautés syntaxiques du C++ Avoir la classe Plus de classe (encore) Intro à la STL. Introduction. Langage TRES répandu Performances
E N D
Introduction au C++ ikariya@via.ecp.fr
Erratum C • Surcharge • For(int x=0; …
Au menu • Introduction • Prérequis • Documentation • Problématiques • Nouveautés syntaxiques du C++ • Avoir la classe • Plus de classe (encore) • Intro à la STL
Introduction • Langage TRES répandu • Performances • Portabilité • Rigueur • … • « Extension » du C • Ceci n’est qu’un rapide tour d’horizon Ca s’apprend par la pratique !
Prérequis • Introduction au C • Problématiques du C • Un peu de pratique (GCC, VC ou autre)
Sources de documentation - Bis • Internet • http://www.developpez.com/ • Google • … • Bouquins divers et variés(mais ca coûte cher et utilitévariable) • Cédricstilgar sur IRC
Problèmatiques • Besoin de performances • Language de haut niveau • Programmation orientée objet • Nouvelle philosophie de programmation • Encapsulation des données • Masquage de l’implémentation • Réutilisation (Capitalisation) • …
What’s new ? Nouveautés syntaxiques
Hello World des temps modernes #include <iostream> /* Commentaires Multi-lignes */ int main() { // Toujours le même prgm pour commencer std::cout << "Tagazok !" << std::endl; return 0; }
What’s new ? • bool • Surcharge de fonctions, d’opérateurs • Références • Namespaces • Fonction templates • Nouveaux headers
Surcharge • Plusieurs fonctions avec le même nom • Contraintes = Signature unique • Liste ordonnée des types d’arguments différents • Ne peuvent pas différer que par le type de retour • Attention aux ambiguités ! • Surcharge des opérateurs possible • règles strictes sur les paramètres
Surcharge - exemple intma_fonction(int a, int b); floatma_fonction(float a, float b); boolma_fonction(char a, float nom, int c); intma_fontion(float a); ERREUR : floatma_fonction(int a, int b); AMBIGUE : int main () { ma_fonction(1 , 3.0); return 0; }
Références • Passage de la variable et pas de la copie • Eviter la recopie de la variable (grosses structures) • Ne pas confondre avec les pointeurs (concepts assez proches)
Références - exemple int a = 50; voidplus_un(int x) { x += 1; } plus_un(a); // a==50 voidplus_un(int* x) { *x += 1; } plus_un(a); // a==51 voidplus_un(int& x) { x += 1; } plus_un(a); // a==51
Namespaces • Vive les espaces de nom ! • namespace {} • Résolution des conflits, opérateur :: • Espace de nom standard: std • Directive « using »
Templates • Ecrire du code générique • Dans les structures • Dans les fonctions • Rien de plus ici …
Une nécessité ! Avoir la classe
Les objets • Type qui regroupe des informations (membres) et des moyens de les traiter (méthodes) • Exemple: un magicienPoints de vie AttaqueReserve de Mana EngageEtat
Définition de l’objet class Wizard { public: void Attaque(Wizard &adv) { … } void Engage(int i) { mana += i; } int mana, vie; booletat; };
Erreurs courantes • Compilation • Syntaxe • Warning • Edition de liens • fonctions, variables non déclarées, non implémentées, non trouvées … • Exécution • segfault
Organisation des fichiers • Rappel compilation / édition de liens • Organisation des fichiers : Wizard.h(pp) class Wizard { public: void Attaque(Wizard &adv); void Engage(int i); int mana, vie; booletat; }; Wizard.cpp voidWizard::Attaque(Wizard &adv) { … } voidWizard::Engage(int i) { mana += i; }
Précompilation • A quoi ca sert ? • Dans notre cas : Wizard.h(pp) #ifndef WIZARD_H #define WIZARD_H class Wizard { … }; #endif Wizard.cpp #include "Wizard.h" voidWizard::Attaque(Wizard &adv) …
La pratique Wizardika; ika.etat = true; ika.vie = 20; ika.mana = 0; ika.Engage(10); Wizard *p_ika = &ika; p_ika ->vie--; ika->Engage(1);
Constructeur / Destructeur • Initialisation préalable des données avant toute utilisation de l’objet • mettre les PV à 20 • avoir un magicien vivant • Constructeur : appelé à la création de l’objet • Destructeur : appelé à la destruction
Constructeur / Destructeur class Wizard { public: Wizard() { etat = true; vie = 20; mana = 0; } ~Wizard() { } };
Allocation dynamique de mémoire • malloc et free non adaptés (besoin d’appel du contructeur) • p = new T; donne un pointeur vers une zone de la mémoire pour stocker un objet du type T • delete p; déclare la mémoire allouée comme inutile. A MANIER AVEC PRECAUTION 1 NEW = 1 DELETE
Membres privés / publiques • public / private / protected • Encapsulation : • cacher des membres à l’extérieur • s’assurer qu’ils ne seront pas modifiés • création d’une interface utilisateur de l’objet
Pour épater les voisins Plus de classe
Dérivation • Créer un objet plus spécifique à partir d’un objet de base. • Wizard > WhiteWizard ou BlackWizard • (Wizard&)Mon_WhiteWizardAMoi; • (WhiteWizard&)Mon_WizardAMoi;
Dérivation class WhiteWizard:Wizard { public: void Heal(); } Wizard w; WhiteWizardww; ww.Engage(1); ww.Attaque(w); w.Engage(2); w.Attaque(ww);
Dérivation Wizard *p_w = &ww; p_w->Engage(3); // OK p_w->Heal(); // NOK
Fonctions virtuelles • WhiteWizard, BlackWizard, MarieWizard ne se soignent pas de la même façon et on veux que tout Wizard puisse se soigner. • On utilise des fonctions qui peuvent être redéfinies dans les classes dérivées : les fonctions virtuelles
Fonctions virtuelles class Wizard { public: virtualvoid Heal() { vie++; } } class WhiteWizard { public: virtualvoid Heal() { SummonAura(); Wizard::Heal(); } };
Fonction virtuelle pure • la contrainte en plus ! class Wizard { public: virtualvoid Heal() = 0; }; • Rend la classe de base abstraite.
Surcharge (bis) • Surcharge des fonctions et des opérateurs possible • Friend (non explicité ici) • exemple : matrices
Comment éviter de refaire des choses déjà (bien) faites Intro à la STL
STL • Standard Template Library • Bibliothèque standard (dans la norme C++) offre des types et des fonctions utiles. • Dans le namespacestd:: • Conteneurs
En vrac … • string • vector • list • map • set • …
Notion d’itérateur • Permet de parcourir le conteneur • Syntaxe unifiée • Similaire aux pointeurs • Exemples
Pourquoi utiliser la STL ? • Réinventer la roue ??? • Eviter les bugs (fuites de mémoire principalement) • Simplicité d’utilisation • Efficacité • Ecriture du code • Code
Apres cette courte présentation …A vos compilateurs ! Des questions ?