C++ Historique C++ : extension objet du langage C Bjarne Stroustrup, années 80 Java Vision discutable : Inspiré de la partie objet du C++ Années 90 par SUN Le C++ est un mélange de Java et de C Normalisé vers 97-98 et constamment actualisé Jean GUILLET Langage orienté objet C++ 1/25 Le besoin Données structurées algorithmes Programme Jean GUILLET Langage orienté objet C++ 2/25 Approche structurée Début init application répéter L jusqu'à fin terminer l'application fin Complétez cet algorithme de premier niveau quant aux traitements des données incluant la lecture/modification de celles-ci Jean GUILLET Langage orienté objet C++ 3/25 Approche objet voiture couleur : enuméré distanceTotaleParcourue : entier distanceAvantPlein : entier typeVehicule : enuméré demarrer() : void arreter() : void mettreEssence() : entier rouler(nbKm : entier) : void objet attributs opérations A quoi correspond l'état d'un objet ? Qu'est-ce qui définit le comportement d'un objet ? Jean GUILLET Langage orienté objet C++ 4/25 Approche objet Principe de conception Interface limitée Nombre réduit d'éléments publics Communication limitée Nombre réduit de méthodes publiques Protection des données : encapsulation Les attributs sont privés Aucune variable globale Jean GUILLET Langage orienté objet C++ 5/25 C++ proche du C même syntaxe de base code C "propre" directement compilable en C++ facilité d'intégration de fichiers C++ et C dans un même programme Principal inconvénient : compatibilité C/C++ Jean GUILLET Possibilité de créer une application non objet Langage orienté objet C++ 6/25 C++ C++ = langage objet ET procédural contrairement à Java (purement orienté objet) langage riche et (relativement) complexe C++ = meilleure ET pire des choses le meilleur : OO + efficacité du C le pire : richesse du langage souvent utilisée à mauvais escient Jean GUILLET -> programmes inutilement complexes, "usines à gaz" Langage orienté objet C++ 7/25 C++ Un programme C++ est constitué : de classes réparties dans plusieurs fichiers (éventuellement) de fonctions et variables globales (à la C) Éviter la déclaration de plusieurs classes dans le même fichier A éviter Pas de packages mais des namespaces Jean GUILLET Langage orienté objet C++ 8/25 Déclaration et définition Même distinction qu'en langage C : déclarations dans les fichiers d'interface (ou en tête) : xxx.h ou xxx sans extension définition dans fichiers d'implémentation : xxx.cpp à chaque xxx.cpp doit correspondre : un xxx.h : déclaration de l'API "publique" Dans quel fichier (h ou cpp) va-t-on déclarer une classe ? Jean GUILLET Langage orienté objet C++ 9/25 C++ programmation structurée Les commentaires Comme en c : /* * commentaire traditionnel pour les en tête de fonctions et de fichier * sur plusieurs lignes * valide en C et C++ */ Sur une ligne // variable locale récurrente Jean GUILLET Langage orienté objet C++ 10/25 C++ les variables Types de variables Déclaration Tous les types en C plus le type bool {true, false}; Au plus proche de l'utilisation Doit être initialisée avant leur utilisation Constantes typées Rappelez les types de variables en C Quel est le risque d'une non initialisation de variable ? Jean GUILLET Langage orienté objet C++ 11/25 C++ les constantes const devant un nom rend celui-ci non modifiable const int monEntier = 10 : Exemple // commentez les lignes suivantes et indiquez les erreurs const float PI = 3.1415 ; const MAXINT = (int)(uint)(~0); const int MAX_ELEMENT = 10 ; int TAB[2 * MAX_ELEMENT] ; // autorisé en C++ interdit en C int i; PI = 3.0; i = MAXINT++; Quel est la valeur de MAXINT ? En java, quel est le mot clé pour déclaré un objet constant ? Jean GUILLET Langage orienté objet C++ 12/25 C++ : constantes et pointeurs Cas où le pointeur est constant : char *const str = "salut à vous tous"; str ++ ; // str est un pointeur constant //erreur, message du compilateur cout << str; *str = ‘A’; // autorisé, seul le pointeur est constant str = " Aujourd’hui, c’est mardi "; // interdit car strcpy(str, "Aujourd’hui, c’est lundi") ; // autorisé car Complétez les messages Faites le plan mémoire associé Jean GUILLET Langage orienté objet C++ 13/25 C++ : constantes et pointeurs Cas où la donnée pointée est constante char *const str = "salut à vous tous"; // str est un pointeur constant const char *str2 = "bonjour à vous";// str2 pointe sur une chaîne constante str2++ ; // autorisé car *str2 = ‘A’ ; // erreur, message du compilateur str2 = str ; // autorisé car str = str2 ; // interdit car strcpy(str, str2); // par contre acceptée car const char * const str = « salut à vous » ; // ici, qui est constant ? Complétez les messages le modificateur const s'adresse à ce qui le suit immédiatement Jean GUILLET Langage orienté objet C++ 14/25 C++ et les fonctions Comme en C Les déclarations dans le fichier d'interface Les définitions dans le fichier d'implantation Paramètres typés ou Void pour indiquer qu'il n'y a pas de paramètre Void en retour pour indiquer que la fonction ne renvoie rien Pourquoi ne doit-on pas définir des fonctions dans le fichier d'interface ? Jean GUILLET Langage orienté objet C++ 15/25 C++ et les fonctions (2) Les derniers paramètres peuvent avoir des valeurs par défaut Les valeurs sont fournies dans la déclaration uniquement void print(long valeur, int base = 10); Ce sont les derniers paramètres La définition demeure habituelle void print(long valeur, int base){...} L'utilisation a plusieurs écritures possibles print(65536); // affiche 65536 ( en base 10) print(65536, 16); // affiche 10000 ( en base 16) Pourquoi les paramètres par défaut sont-ils les derniers ? Jean GUILLET Langage orienté objet C++ 16/25 C++ et les fonctions (3) La surcharge (overload) de fonctions Même nom de fonction et Le nombre de paramètres est différents Ou le type des paramètres est différent Attention : la valeur de retour ne permet pas de différentier des fonctions surchargées Faites les exercices 1 et 2 Pourquoi n'y a t il pas de saut de ligne entre les 2 réponses de Q1 Jean GUILLET Langage orienté objet C++ 17/25 C++ et les fonctions (4) Les fonctions inline Elles sont définies lors de leur déclaration Elles sont précédées du mot clé inline Gain de temps en exécution Accroissement de la taille mémoire pour le programme Faites les exercices 3 et 4 Jean GUILLET Langage orienté objet C++ 18/25 C++ et les fonctions (5) Passage de paramètre par référence Lors de l'appel, l'adresse est passée en paramètre S'utilise comme une variable simple Le paramètre formel est précédé du symbole & Le paramètre référence doit être déclaré const pour éviter la modification de la variable référencée Faites les exercices 6 à 8 et 9 Jean GUILLET Langage orienté objet C++ 19/25 C++ les variables références(2) Les variables références Variable qui est une adresse Est initialisée lors de sa déclaration et est précédé du symbole & S'emploie comme une variable Est un alias d'une variable N'est pas un pointeur S'utilise principalement pour les fonctions lors du passage de paramètre Y a t il une analogie avec java ? Jean GUILLET Langage orienté objet C++ 20/25 C++ : les références int main() { int i; int & ir = i; // ir est une référence à i int *ptr; int &autreRef ; // interdit car i=1; cout << "i= " << i << " ir= " << ir << endl; // affichage de : ir=2; cout << "i= " << i << " ir= " << ir << endl; // affichage de : i= 2 ir= 2 ptr = &ir ; // attention à l'usage *ptr = 3; cout << "i= " << i << " ir= " << ir << endl; // affichage de : i= 3 ir= 3 return 0 ; } Complétez les commentaires Faites le plan mémoire Jean GUILLET Langage orienté objet C++ 21/25 C++ autres particularités enum Crée une liste de valeurs successives La première vaut 0 Chacune peut recevoir une valeur constante Struct existe comme en c Quel est le type des éléments d'un enum ? Écrire une fonction afficheCouleur(COULEUR) qui affiche la couleur du paramètre énuméré. On se limitera à 5 couleurs Comparez une structure et une classe Jean GUILLET Langage orienté objet C++ 22/25 C++ new et delete Opérateur new et delete à la place de malloc et free Allocation d'une zone mémoire Initialisation de cette zone libère toute la zone allouée Déclarez deux pointeurs sur entier, allouez les pour un entier et un tableau de 10 entiers et initialisez les puis détruisez les Jean GUILLET Langage orienté objet C++ 23/25 C++ les tableaux gérés par pointeurs Cas particulier : les tableaux Faites les exercices 10, 11 et 12 Complétez le 10 en initialisant le tableau pTabInt et en détruisant le contenu Jean GUILLET Langage orienté objet C++ 24/25 Espace de noms et opérateur :: Opérateur de résolution de portée :: L'espace de noms : Équivalent de package sous java Regroupement sous un même nom d'un ensemble de Classes Fonctions variables Jean GUILLET Langage orienté objet C++ 25/25