C++

publicité
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
Téléchargement