Historique C++ C++ : extension objet du langage C Bjarne Stroustrup, années 80 Java Inspiré de la partie objet du C++ Années 90 par SUN Vision discutable : Le C++ est un mélange de Java et de C Normalisé vers 97-98 et constamment actualisé 1/25
Le besoin Données structurées algorithmes Programme 2/25
Approche structurée Début init application répéter L fin jusqu'à fin terminer l'application Complétez cet algorithme de premier niveau quant aux traitements des données incluant la lecture/modification de celles-ci 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? 4/25
Approche objet Principe de conception Interface limitée Communication limitée Protection des données : encapsulation Aucune variable globale Nombre réduit d'éléments publics Nombre réduit de méthodes publiques Les attributs sont privés 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++ Possibilité de créer une application non objet 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 -> programmes inutilement complexes, "usines à gaz" 7/25
C++ Un programme C++ est constitué : de classes réparties dans plusieurs fichiers Éviter la déclaration de plusieurs classes dans le même fichier (éventuellement) de fonctions et variables globales (à la C) A éviter Pas de packages mais des namespaces 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? 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 10/25
C++ les variables Types de variables Tous les types en C plus le type bool {true, false}; Déclaration 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? 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? 12/25
C++ : constantes et pointeurs Cas où le pointeur est constant : char *const str = "salut à vous tous"; // str est un pointeur constant str ++ ; //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é 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 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? 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? 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 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 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 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? 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 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 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 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 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 25/25