Le langage C++ Langage orienté objet Expérience des défauts/limites du C Sécurité de codage...

34
Le langage C++ Langage orienté objet Expérience des défauts/limites du C Sécurité de codage (compilateur)

Transcript of Le langage C++ Langage orienté objet Expérience des défauts/limites du C Sécurité de codage...

Page 1: Le langage C++ Langage orienté objet Expérience des défauts/limites du C Sécurité de codage (compilateur)

Le langage C++

Langage orienté objet

Expérience des défauts/limites du C

Sécurité de codage (compilateur)

Page 2: Le langage C++ Langage orienté objet Expérience des défauts/limites du C Sécurité de codage (compilateur)

C++ sur-ensemble du C

Coder « à la C » avec compilateur C++

g++

CC

Visual Studio

Page 3: Le langage C++ Langage orienté objet Expérience des défauts/limites du C Sécurité de codage (compilateur)

Les entrées/sorties

Flots d’E/S

cin (C: stdin)

cout (C: stdout)

cerr (C : stderr)

Page 4: Le langage C++ Langage orienté objet Expérience des défauts/limites du C Sécurité de codage (compilateur)

Entrées/sorties

Opérateurs d’E/S plutôt que fonctions printf() et scanf()

Exemple : affichage

Diriger les sorties vers le flot de sortie cout

cout << "bonjour" << endl;

endl remplace le ‘\n’ du C : passage à la ligne

Page 5: Le langage C++ Langage orienté objet Expérience des défauts/limites du C Sécurité de codage (compilateur)

Entrées/sorties

flot << données; (données vers flot)

flot >> données; (obtenir les données depuis le flot)

expression flot op données est de type flot

possibilité d’enchaîner les E/S

Page 6: Le langage C++ Langage orienté objet Expérience des défauts/limites du C Sécurité de codage (compilateur)

Entrées/sorties

en C :long a;printf("saisir a:");scanf("%ld",&a);printf("%ld au carre vaut %ld\n",a,a*a);

en C++ :long a;cout << "saisir a :";cin >> a; // et hop, plus de format ni de &cout << a << "au carre vaut " << a*a << endl;

Page 7: Le langage C++ Langage orienté objet Expérience des défauts/limites du C Sécurité de codage (compilateur)

Variables

définitions de variables à tout endroit du code

pas de retour au bloc de définition des variables

durée de vie de la variable adaptée à son rôle

Page 8: Le langage C++ Langage orienté objet Expérience des défauts/limites du C Sécurité de codage (compilateur)

Variables

exemple :

for (long cpt=0; cpt < nb; cpt++){

double val;instructions;

}

cpt et val n'existent que pour l'exécution de la boucle

Page 9: Le langage C++ Langage orienté objet Expérience des défauts/limites du C Sécurité de codage (compilateur)

Références

alternative à l'utilisation des pointeurs

créer un alias pour une variable

deux noms différents désignent la même variable (même adresse).

opérateur &

Page 10: Le langage C++ Langage orienté objet Expérience des défauts/limites du C Sécurité de codage (compilateur)

Références

syntaxe :type &nom_de_référence = variable;

int i;int &j = i;

pas de référence à une expression

référence = pointeur dont on ne manipule que le contenu

Page 11: Le langage C++ Langage orienté objet Expérience des défauts/limites du C Sécurité de codage (compilateur)

Référenceslong i;long k;

long &j;long &j=4;long &j=i+2;

long &j=i;j=k;

référence vers rien

référence vers une constante

référence vers une expression

Page 12: Le langage C++ Langage orienté objet Expérience des défauts/limites du C Sécurité de codage (compilateur)

Références

passage de paramètres

void f(long &a, long &b){

long tmp;

tmp=a;a=b;b=tmp;

return;}

l'échange est effectif !

Page 13: Le langage C++ Langage orienté objet Expérience des défauts/limites du C Sécurité de codage (compilateur)

Références

inconvénients : impossible de distinguer un passage de références à l'appel

long x, y;f(x,y); // par valeur ? par référence ?

les arguments doivent être des variables

Page 14: Le langage C++ Langage orienté objet Expérience des défauts/limites du C Sécurité de codage (compilateur)

Références

dangers : fonction retournant une référence

référence adresse

quelles précautions prendre ?

Page 15: Le langage C++ Langage orienté objet Expérience des défauts/limites du C Sécurité de codage (compilateur)

Référenceschar &f(void){

char let='x';return let;

}

char &f(char t){

return t;}

char &f(char &t){

return t;}

let créée iciet détruite ici…

t créée ici

et détruite ici…

t fait référence à une autre variable. ouf !

Page 16: Le langage C++ Langage orienté objet Expérience des défauts/limites du C Sécurité de codage (compilateur)

Arguments par défaut

initialiser des arguments au niveau du prototype :

valeurs prises si argument absent à l'appel

liste des valeurs à partir des derniers arguments

Page 17: Le langage C++ Langage orienté objet Expérience des défauts/limites du C Sécurité de codage (compilateur)

Arguments par défaut

prototype :void fonction(int, int=0, int=1);

utilisation :void main(){

int x,y;x=4;y=x+5;

fonction(y); // fonction(y,0,1);fonction(2,x); // fonction(2,x,1);fonction(x,y,x+y); // ok, 3 arguments

}

Page 18: Le langage C++ Langage orienté objet Expérience des défauts/limites du C Sécurité de codage (compilateur)

Arguments par défaut

définition :void fonction(int a, int b, int c){

cout << a << "," << b << "," << c;cout << endl;

return;}

Ne pas rappeler les valeurs par défaut.

Page 19: Le langage C++ Langage orienté objet Expérience des défauts/limites du C Sécurité de codage (compilateur)

Surcharge de fonctions

signature de fonction :

carte d'identité auprès du compilateur

en C : son nom

en C++ : son nom + types des paramètres

unicité de l'identité

Page 20: Le langage C++ Langage orienté objet Expérience des défauts/limites du C Sécurité de codage (compilateur)

Surcharge de fonctions

exemple

prototype signature

void f(int,int); f_int_intvoid f(int,double); f_int_doublevoid f(double,int); f_double_int

les 3 fonctions coexistent dans un programme

Page 21: Le langage C++ Langage orienté objet Expérience des défauts/limites du C Sécurité de codage (compilateur)

Surcharge de fonctions

erreur du compilateur si on ajoute :

int f(int,int);

le type de retour ne fait pas partie de la signature.

choix de la fonction à l'appel.

Page 22: Le langage C++ Langage orienté objet Expérience des défauts/limites du C Sécurité de codage (compilateur)

Surcharge et références

le compilateur accepte la surcharge…

void f(int&,int&); // connue comme f_int&_int&

mais on ne peut plus appeler f_int_int ni f_int&_int& !

Page 23: Le langage C++ Langage orienté objet Expérience des défauts/limites du C Sécurité de codage (compilateur)

Surcharge et référencesvoid main(){

int i,j;int &k=i;

f(i,j); // ambiguïté !}

Page 24: Le langage C++ Langage orienté objet Expérience des défauts/limites du C Sécurité de codage (compilateur)

Utiliser des fonctions du C

incompatibilité des signatures !

indiquer que le langage d'origine est le C :

extern "C" précédant le prototype.

généralisable à tout un fichier .h

Page 25: Le langage C++ Langage orienté objet Expérience des défauts/limites du C Sécurité de codage (compilateur)

Utiliser des fonctions du C

symbole de langage à définir pour la compilation

rappel : #ifdef / #ifndef / #define / #endif

définir les symboles en ligne de commande :

option –DsymboleZ:\> -DDEBUGg++ -c monprog.cpp

ouvrons le fichier complex.h de Dev

Page 26: Le langage C++ Langage orienté objet Expérience des défauts/limites du C Sécurité de codage (compilateur)

fonctions inline

mécanisme d'appel de fonction:

overhead (temps supplémentaire) car :calcul des argumentsplacement sur la pileplacement de l'@ de retour de la fonctionsaut à la fonction

la fonction est exécutéeplacement de la valeur de retour sur la pilesaut à l'@ de retour

Page 27: Le langage C++ Langage orienté objet Expérience des défauts/limites du C Sécurité de codage (compilateur)

fonctions inline

désavantageux si :

code de la fonction court

appels nombreux

supprimer cet overhead en transformant l'appel de fonction en : expansion de code

Page 28: Le langage C++ Langage orienté objet Expérience des défauts/limites du C Sécurité de codage (compilateur)

fonctions inline

expansion : remplace l'appel par le code de la fonction : programme plus volumineux

similaire aux macros du C, mais vérifications faites par le compilateur

sécurité accrue !

Page 29: Le langage C++ Langage orienté objet Expérience des défauts/limites du C Sécurité de codage (compilateur)

fonctions inline

en C :#define CARRE(x) x*xint main(){

long a=CARRE(2+4);printf("%ld",a);

}

affiche : 14 car calcul de 2+4*2+4

Page 30: Le langage C++ Langage orienté objet Expérience des défauts/limites du C Sécurité de codage (compilateur)

fonctions inlineen C++ :inline long carre(long);

int main(){

cout << carre(2+4) << endl;}

long carre(long t){

return t*t;}

affiche 36

Page 31: Le langage C++ Langage orienté objet Expérience des défauts/limites du C Sécurité de codage (compilateur)

Allocation dynamiquemalloc() et calloc() remplacées

informations fournies redondantes :

int *p;long nb;

nb=12;p=(int *)malloc(nb*sizeof(int));

ah, ca on le saura que c'est un int !

tout-à-fait, Thierry !

Page 32: Le langage C++ Langage orienté objet Expérience des défauts/limites du C Sécurité de codage (compilateur)

Opérateurs new et deletenew : indiquer le type et le nombre de données à réserver.

pour une seule valeur :double *p_doub;

p_doub = new double; // allocation

libérer la mémoire avec :delete p_doub; // libération

Page 33: Le langage C++ Langage orienté objet Expérience des défauts/limites du C Sécurité de codage (compilateur)

Opérateurs new[] et delete[]tableaux dynamiques :

char *txt;long taille;

taille=42;txt = new char[42]; // allocation de 42 char

// libération avec l'opérateur delete[]

delete []txt;

Page 34: Le langage C++ Langage orienté objet Expérience des défauts/limites du C Sécurité de codage (compilateur)

mais encore…C++ utilise des instructions du C

les tests

les boucles

mais apporte beaucoup pour :

les fonctions

sans les changer

les structures