3. Plan du Chapitre
Introduction
Ecarts de C++ par rapport à C ANSI
Apports de C++
LST INFO, FSTF 3
4. Introduction
C++ est le C enrichie par les possibilités de la POO
Evolution de C (C++ signifie incrémentation du C)
C++ est un langage hybride
Classique (procédural)
Orienté Objet
LST INFO, FSTF 4
5. Introduction
C++ = C – E + S +P
C : Norme ANSI de C
E : Ecarts par rapport à la norme de C
S : Spécificités non objet de C++
P : Possibilités objets de C++ C
E
S
P
C++
LST INFO, FSTF 5
6. Historique de C++
C++ a été développé dans les labos AT&T BELL au début
des années 1980 par Bjarne STROUSTRUP
1979 développement de « C with classes »
1983/1984 langage C++
1987 version 1.2 de C++ (début d’une large diffusion)
1998 norme ISO : standard du C++
LST INFO, FSTF 6
7. Ecarts/C norme ANSI
Définitions des fonctions
Prototypes des fonctions
Arguments et valeurs de retour
Constantes
LST INFO, FSTF 7
8. Ecarts / C norme ANSI —Définitions des fonctions
En C, il y a deux manières pour définir une fonction :
En C++ seule la deuxième forme est retenue
Forme 2
int fonct(int u,int v)
{
…
}
Forme1
int fonct(u,v)
int u;
int v;
{
…
}
LST INFO, FSTF 8
9. Le prototype (squelette) est la déclaration d’une fonction qui
sera invoquée avant sa définition
En C, le prototype d’une fonction peut :
Être Omis (cas d’une fonction qui retourne un entier)
Se restreindre au nom de la fonction et au type de retour :
float fonct();
Être complet : float fonct(int, double, float);
Ecarts /C norme ANSI— Prototypes de fonctions
LST INFO, FSTF 9
10. #include<stdio.h>
void main()
{
void saisie_produit();
/* le prototype de la fonction
produit est omis car elle retourne
un entier*/
int a,b,r;
printf("saisir deux entiers:");
scanf("%d%d",&a,&b);
r= produit(a,b);
printf("n résultat = %d",r);
saisie_produit();
}
int produit(a,b)
int a; int b;
{
int r;
r=a*b;
return(r);
}
void saisie_produit()
{
int a,b,r;
printf("saisir deux entiers:");
scanf("%d%d",&a,&b);
r=a*b;
printf("n résultat = %d",r);
}
Ecarts /C norme ANSI— Prototypes de fonctions
Exemple en C
LST INFO, FSTF 10
11. En C++
Le prototype est obligatoire
Le prototype de la fonction doit préciser:
le nom de la fonction
le type de retour
le type de chaque paramètre
Ecarts / C norme ANSI —Prototypes de fonctions
LST INFO, FSTF 11
12. Exemple en C++
#include<stdio.h>
void saisie_produit();
int produit(int,int);
int main() {
int a,b,r;
printf("nsaisir deux entiers:");
scanf("%d%d",&a,&b);
r= produit(a,b);
printf("n résultat = %d",r);
saisie_produit();
}
int produit(int a,int b){
int r;
r=a*b;
return(r);
}
void saisie_produit(){
int a,b,r;
printf("nsaisir deux entiers:");
scanf("%d%d",&a,&b);
r=a*b;
printf("n résultat = %d",r);
}
Ecarts / C norme ANSI —Prototypes de fonctions
LST INFO, FSTF 12
13. Fonctions sans arguments
En C, deux manières :
float fonct(void);
float fonct();
En C++
float fonct();
Ecarts/C norme ANSI — Arguments et valeurs de retour
LST INFO, FSTF 13
14. Fonctions sans valeur de retour
En C, deux manières :
void fonct(int, char);
fonct(int, char);
En C++
void fonct(int, char);
Ecarts/C norme ANSI —Prototypes de fonctions en C++
LST INFO, FSTF 14
15. Constantes locales
Pas de différence entre C et C++
La porté est locale au bloc ou à la fonction
Ecarts / C norme ANSI —Porté des constantes
LST INFO, FSTF 15
16. Constantes globales en C
La porté de la constante n’est pas limitée au fichier qui
la contient
Définir la constante dans un fichier const c =10 ;
Référencer la constante dans les autres fichiers par extern
const c ;
Ecarts / C norme ANSI — Porté des constantes
LST INFO, FSTF 16
17. Constantes globales en C: Exemple
#include<stdio.h>
#include<stdlib.h>
#include "constglob.h"
int main()
{
int a=10,b=20;
extern c;
printf(" le résultat est %d",a+b+c);
}
/* Fichier constglob.h */
const c= 100;
Ecarts / C norme ANSI — Porté des constantes
LST INFO, FSTF 17
18. Constantes globales en C++
La porté d’une constante est limitée au fichier source
qui la contient
Exemple
Ecarts / C norme ANSI — Porté des constantes
#include<stdio.h>
#include<stdlib.h>
#include "constglob.h"
int main()
{
int a=10,b=20;
extern c; //Erreur
printf(" le résultat est %d",a+b+c);
}
LST INFO, FSTF 18
19. Commentaire
Primitives d’Entrée/Sortie cin, cout
Déclaration des variables
Références
Surdéfinition des fonctions
Arguments par défaut
Fonctions en ligne
Déclaration des structures
Nouveaux opérateurs new, delete
Gestion des exceptions
Apports de C++
LST INFO, FSTF 19
20. Commentaire de C
/* commentaire classique de C
qui s’étend sur plusieurs lignes */
Commentaire introduit par C++
// commentaire de ligne
Apports de C++ — Commentaire —
LST INFO, FSTF 20
21. En plus des primitives d’E/S définies dans C, C++ offre
deux nouvelles primitives
cin : flot d’entrée
cout : flot de sortie
Caractéristiques
Simplicité: Pas besoin d’indiquer le format des variables
Extensibilité à d’autres types
Apports de C++ — Entrées/Sorties
LST INFO, FSTF 21
22. Cout
Permet d’afficher une chaine, la valeur d’une variable ou la
valeur d’une expression
cout << ’’ une chaine ’’;
cout << code ; // code est une variable
cout << 3.14 * r * r ; // Surface d’un cercle
Permet d’afficher plusieurs objets avec une seule instruction:
cout << ’’ surface = ’’ << 3.14 * r * r ;
endl : mot réservé qui permet le retour à la ligne
cout << ’’ surface = ’’ << 3.14 * r * r << endl;
Apports de C++ — Entrées/Sorties
LST INFO, FSTF 22
23. Cout Exemple
Instructions Affichage
int x=3; double y =4.5;
cout <<“ valeur de x=“<<x;
cout<<“; y=“<<y<<endl;
cout <<“x+y”<<x+y;
valeur de x=3; y=4.5
x+y=7.5
int x=3; double y =4.5;
cout <<“x = “<<x<<“n”;
cout<<“y=“<<y;
cout <<“nx+y”<<x+y;
x = 3
y=4.5
x+y=7.5
Apports de C++ — Entrées/Sorties
LST INFO, FSTF 23
24. Cin
Permet de saisir la valeur d’une ou plusieurs variables
cin >> var1 >> var2>> … >> varn;
Exemple
#include<iostream>
Using namespace std;
int main()
{
int n; float x; char c;
cout << ’’entrer un entier, un réel ensuite un caractère’’;
cin >> n >> x >> c;
return 0;
}
Apports de C++
— Entrées/Sorties—
LST INFO, FSTF 24
25. Plus de liberté sur l’endroit de déclaration
Déclaration n’importe où dans le programme
Pas forcément au début (cas du langage C)
Déclaration à l’intérieur des structures de contrôle
for(int i=0;…), if(int i = random(100)) , while(), switch()
Portée limitée au bloc où la variable a été définie
Apports de C++ — Déclaration des variables
LST INFO, FSTF 25
26. Plus de liberté sur l’endroit de déclaration — Exemple
#include <iostream>
using namespace std;
int main()
{
int a, b;
cout << "nsaisir deux entiers:";
cin >> a >> b;
int r,f; // autorisé
r = a + b; f = 1;
for(int i=1;i<r;i++) // autorisé
f=f*i;
cout << "nfact = " << f;
return 0;
}
Apports de C++ — Déclaration des variables
LST INFO, FSTF 26
27. C’est quoi une référence ?
Un type qui permet une manipulation plus facile des
adresses
Une variable de type référence permet de designer un
espace mémoire existant
Apports de C++ — Références
LST INFO, FSTF 27
28. Déclaration
Une référence doit être toujours initialisée lors de sa
création.
type &ref = var;
Objet référencé
Type de l’objet
référencé
Variable
référence
int a, b;
int &refa =a;
int &ref ; // erreur
Apports de C++ — Références
LST INFO, FSTF 28
29. Utilité : Une variable de type référence est utilisée pour
désigner une variable existante (alias, synonyme)
designer un objet existant en mémoire et qui n’a pas
de nom
int a =5; int t[10];
int &refa =a;
int &premier =t[0];
int &dernier =t[9];
refa et a représentent
le même espace
Attribue un nom
au premier
élément de t
Attribue un nom
au dernier
élément de t
Apports de C++ — Références
LST INFO, FSTF 29
30. Opérations sur les références
Toute opération effectuée sur l’objet référencé se répercute sur
la référence et vice versa (même espace mémoire)
int a = 5;
int &refa =a;
a++;
cout << ’’refa = ’’ << refa;
refa= 0;
cout << ’’a = ’’ << a;
refa = 6
a = 0;
Apports de C++ — Références
LST INFO, FSTF 30
31. Opérations
Une fois initialisée, une référence ne peut être changée
int a;
Int b ;
int &refa =a;
&refa = y; // erreur
& refa = &y; // erreur
Apports de C++ — Références
LST INFO, FSTF 31
32. Passage des paramètres
En C, un seul mode de passage de paramètres: passage par
valeur
En C++, deux modes : par valeur et par référence
Apports de C++ — Références
LST INFO, FSTF 32
33. Passage des paramètres par référence
Le changement d’un paramètre est conservé après la
terminaison de la fonction
Évite la gestion complexe des pointeurs
Offre une meilleure lisibilité
Apports de C++ — Références
LST INFO, FSTF 33
34. Passage des paramètres par référence
Syntaxe de déclaration
type fonct (type & param,…)
Appel de la fonction
fonct(param,…);
Apports de C++ — Références
LST INFO, FSTF 34
35. Passage des paramètres par référence: Exemple
void swap(int &i, int &j)
{
int k = i;<
i = j;
j = k;
}
int main()
{
int a=1;
Int b = 2;
cout << ’’avant ’’;
cout << ’’a = ’’ << a << ’’b = ’’
<< b;
swap(a, b);
cout << ’’avant<<<<<<< ’’;
cout << ’’a = ’’ << a << ’’b = ’’
<< b;
}<
Apports de C++ — Références
LST INFO, FSTF 35
36. Plusieurs fonctions portent le même nom
Plus de lisibilité : pas besoin de chercher plusieurs identificateurs pour
la même action
Les fonctions différent dans le contenu selon le type et/ou le
nombre de paramètres
Sémantiquement les fonctions font la même action (ex
afficher)
Le compilateur choisit la fonction à invoquer selon les
paramètres effectifs
Apports de C++ — Surdéfinition de fonctions
LST INFO, FSTF 36
37. Exemple
#include<stdio.h>
int produit(int a,int b)
{ int r;
r=a*b;
return(r);
}
int produit(int a,int b, int c)
{ int r;
r=a*b*c;
return(r);
}
float produit(float a,float b)
{ float r;
r=a*b;
return(r);
}
int main()
{
int a,b;
cout << "nsaisir deux entiers:";
cin >> a >> b;
int r,f;
r=produit(a,b);
cout << "n résultat = " << r;
r=produit(a,b,r);
cout << "n résultat = " << r;
float x=2.4,y=3.5,z;
z=produit(x,y);
cout << "n résultat = " << z;
return 0;
}
Apports de C++ — Surdéfinition de fonctions
LST INFO, FSTF 37
38. Possibilité de donner des valeurs par défaut à certains paramètres
omis lors de l’appel d’une fonction
prix_ttc(float prixht, float tva=0.2)
prix_ttc(300) // taux de tva par défaut
prix_ttc(300,0.1) // taux spécial de la tva
float fonct( int a=10,int b,int c=5) // faux
Apports de C++ — Arguments par défaut
Seuls les derniers paramètres à droite peuvent avoir des valeurs
par défaut
LST INFO, FSTF 38
39. Exemple
#include<stdio.h>
#include<stdlib.h>
using namespace std;
float prix_ttc(float pht, float tva=0.2)
{ float pttc;
pttc = pht*(1+tva);
return(pttc);
}
int main()
{
float p1,p2;
p1=prix_ttc(300); // taux de tva par défaut
p2=prix_ttc(300,0.1); // taux spécial de la tva
cout << "n" << p1 << "t"<< p2;
}
Apports de C++ — Arguments par défaut
LST INFO, FSTF 39
41. Alternative aux macros du préprocesseur
Moins complexe et évite les sources d’erreur des macros
#define carre(n) n*n
Comment seront interprétés les appels : carre(a+b)
carre(++a) ?
Vérification et contrôle des types
Apports de C++ —Fonctions en ligne
LST INFO, FSTF 41
42. Syntaxe : Précéder la définition de la fonction par le mot
clé inline
Exemple
#include <iostream>
using namespace std;
inline int carre(int n) { return(n*n); }
int main()
{
int a=2,b=3,r;
r=carre(a);
cout << "n résultat = " << r;
r = carre(++a);
cout << "n résultat = " << r << " et a= " << a << endl;
return 0;
}
Apports de C++ —Fonctions en ligne
LST INFO, FSTF 42
43. Les fonctions en ligne sont insérées dans le code par le
compilateur à l’endroit de leur appel
Evitent les opérations d’appel et de terminaison des fonctions
Sont plus rapides
Consomment plus d’espace mémoire
Doivent être, normalement, de petite taille
Apports de C++ —Fonctions en ligne
LST INFO, FSTF 43
44. Pas besoin de précéder le nom de la structure par le mot clé
struct après sa définition
Exemple
Apports de C++ —Déclaration des structures
struct etudiant {
int CNE;
char nom[20];
char prenom[20];
};
int main()
{
Etudiant e1;
…
}
LST INFO, FSTF 44
45. En plus des primitives de gestion de la mémoire du langage
C (malloc,free,…), C++ offre deux primitives new et delete
new : permet d’allouer de la mémoire pour des objets
dynamiques
delete : permet de libérer l’espace mémoire alloué par new
Apports de C++ —Opérateurs new, delete
LST INFO, FSTF 45
46. Opérateur new
Syntaxe
Exemple
Apports de C++ —Opérateurs new, delete
adresse = new type;
ou
adresse = new type[taille];
int *pi, *pti;
pi = new int; // réservation de l’
espace pour un entier
pit = new int[10]; // réservation de
l’espace pour un
tableau d’entiers
LST INFO, FSTF 46
47. Opérateur delete
Syntaxe
Exemple
Apports de C++ —Opérateurs new, delete
delete adresse
int *pi;
pi = new int; // réservation de l’
espace pour un entier
delete pi // libération de l’espace
occupé par pi
LST INFO, FSTF 47