Академический Документы
Профессиональный Документы
Культура Документы
Chapitre 2 - du C au C++
ENSI
AU : 2014-2015
Plan
2
Historique du C++
Commentaires
Types de donnes Conversions de types
Dclarations Constantes
Nouvelles possibilits dE/S
Allocation de mmoire
Fonctions Paramtres Surcharge Fonctions inline
Rfrences passage de paramtres par rfrence
Espaces de noms
ENSI
AU : 2014-2015
Historique C++
3
ENSI
AU : 2014-2015
Historique C++
4
ENSI
C++ versus C
5
ENSI
AU : 2014-2015
Commentaires
6
....
/* je suis un super commentaire en C
et je mtends sur plusieurs lignes*/
....
ENSI
AU : 2014-2015
Types de donnes
7
ENSI
AU : 2014-2015
Types de donnes
8
point p;
ENSI
AU : 2014-2015
Conversions de types
9
mme expression.
Ncessit de convertir toutes les donnes dans un type commun avant
dvaluer lexpression.
Il existe deux types de conversions :
ENSI
AU : 2014-2015
Conversions implicites
10
droite, est converti dans le type de la variable gauche. Dans ce cas, il peut
y avoir perte de prcision si le type de destination est plus faible que celui
de la source : conversion dgradante.
float X = 12.3;
int N;
N = X; //la valeur de X est convertie en int (12)
ENSI
AU : 2014-2015
Conversions explicites
11
AU : 2014-2015
Conversions explicites
12
Exemples :
int A = 3, B = 4;
float C;
C = float (A)/B;
ENSI
AU : 2014-2015
Exercice
13
ENSI
AU : 2014-2015
ENSI
AU : 2014-2015
C
int i=5, itmp;
int j=2;
...
for (itmp=0; itmp<10; itmp++)
{
j+=itmp;
}
C++
int i=5;
...
int j=2;
for (int itmp=0; itmp<10; itmp++)
{
j+=itmp;
}
ENSI
AU : 2014-2015
C++
int i=5;
...
int j=2;
for (int i=0; i<10; i++)
{
j+=i; //on est sur le i local
}
//i vaut 5
//j vaut 47
ENSI
AU : 2014-2015
Les constantes
17
int tab[MAX];
ENSI
*/
AU : 2014-2015
Les constantes
18
*p=c;
q=&r ;
q=&r ;
*q=t;
ENSI
AU : 2014-2015
ENSI
AU : 2014-2015
Cout
cout << "BONJOUR";
// quivalent
int n = 25;
cout << "Valeur: ";
cout << n;
puts("BONJOUR");
// quivalent puts("Valeur");
// quivalent printf("%d",n);
char c = a;
cout << c;
ENSI
AU : 2014-2015
Cin
int n;
cout<<"Saisir un entier:
cin >> n;
";
// quivalent scanf("%d",&n);
int a, b;
cin >> a >> b;
// saisie de 2 entiers spars par un Retour Charriot
ENSI
AU : 2014-2015
Allocation de mmoire
22
ENSI
AU : 2014-2015
Allocation de mmoire
23
int *ad; // dclaration dun pointeur sur un entier
ad = new int;
// rservation de place en mmoire pour un entier
On aurait pu dclarer directement int *ad = new int;
char *adc;
adc = new char[100]; // rservation de place en mmoire pour 100 caractres
On aurait pu dclarer directement char *adc = new char[100];
int *adi;
adi = new int[40]; // rservation de place en mmoire pour 40 entiers
On aurait pu dclarer directement int *adi = new int[40];
delete ad;
delete [] adc;
delete [] adi;
// libration de place
ENSI
AU : 2014-2015
Allocation de mmoire
24
T *ptr;
ptr=new T;
/*permet d'allouer l'espace mmoire ncessaire pour un
lment de type T et d'affecter ptr l'adresse
correspondante.*/
//on pouvait obtenir le mme rsultat en crivant en C :
ptr= malloc(sizeof(T));
ENSI
AU : 2014-2015
Allocation de mmoire
25
T *ptr;
ptr= new T[N];
/* alloue l'emplacement ncessaire pour un tableau de N
lments de type T et place l'adresse (de dbut) dans ptr.
En C, on obtenait le mme rsultat en crivant :*/
ptr=malloc(sizeof(T)*N);
ENSI
AU : 2014-2015
Allocation de mmoire
26
T *ptr;
ptr=new T[N];
delete[]ptr;
ENSI
AU : 2014-2015
Pile/Tas (Stack/Heap)
Mmoire alloue de
manire statique (Pile)
Variables globales
Arguments
Valeurs de retour
27
Mmoire Alloue
Dynamiquement (Tas)
Pointeurs
ENSI
AU : 2014-2015
ENSI
AU : 2014-2015
29
ENSI
AU : 2014-2015
ENSI
AU : 2014-2015
Lors dun appel de fonction, le compilateur C++ compare les types des arguments effectifs
avec ceux des arguments muets.
Dans le cas de non-conformit, le compilateur effectue les conversions ncessaires pour que la
fonction reoive des arguments dont les types sont conformes la dclaration.
Les conversions possibles, dans ce cadre, ne sont pas limites aux conversions non
dgradantes ; elles couvrent toutes les conversions autorises lors dune affectation.
Exemple:
double ma_fonction(int u, float f);
void main()
{
char c; int i, j; float r; double r1, r2, r3, r4;
r1 = ma_fonction( i, r );
// appel standard
r2 = ma_fonction( c, r);
// appel correct, c est
r3 = ma_fonction( i, j);
// appel correct, j est
r4 = ma_fonction( r, j);
// appel correct, r est
// et j est converti en
}
ENSI
converti en int
converti en float
converti en int
float
AU : 2014-2015
Remarques :
La surdfinition peut se rvler particulirement intressante lorsqu'on souhaite viter des
conversions de types indsirables lors du passage des paramtres.
ENSI
AU : 2014-2015
Exemples :
void essai (int, double) ; // essai I
void essai (double, int) ; // essai II
int n, p ;
.....
essai(n,z)
essai(c,z)
essai(n,p)
double z ; char c ;
; // appelle essai I
; // appelle essai I, aprs conversion de c en int
; // erreur de compilation,
ENSI
AU : 2014-2015
ENSI
AU : 2014-2015
La surdfinition suivante provoque une erreur de compilation car C++ n'a pas
prvu de distinguer int de const int.
void f(int) ; // fI
void f(const int) ; // fII
ENSI
AU : 2014-2015
AU : 2014-2015
C++ procure la facilit de fournir une valeur par dfaut aux paramtres.
Il existe cependant une restriction importante dans la mise en uvre des
ENSI
AU : 2014-2015
f2(i,r);
f2(i)
f2();
f3(a, i, r);
f3(a, i);
f3(a);
ENSI
//
//
//
valeurs
AU : 2014-2015
Paramtres anonymes
39
ENSI
AU : 2014-2015
Rfrence (alias)
40
On peut dsormais dfinir des variables rfrence, c'est--dire des variables que l'on
peut identifier d'autres variables.
int n,m ;
int& i=n ;
i=m;
// Signifie n=m et non que i devient une rfrence sur m !
ENSI
AU : 2014-2015
Rfrence (alias)
41
Exemple 1 :
int n;
int &p = n; // p est une rfrence sur n
// p occupe le mme emplacement mmoire que
n
n = 3;
cout<< p;
// laffichage donnera 3
ENSI
AU : 2014-2015
L'un des dfauts les plus irritants en C rside dans l'impossibilit de raliser un
version C++
ENSI
AU : 2014-2015
Absence de conversion
Ds lors quune fonction prvoit un passage de paramtres par rfrence, les
conversions de type lappel ne sont plus autorises : le type du paramtre
effectif doit correspondre exactement au type du paramtre formel.
void f(int& n) ; // f reoit un entier par rfrence
float x ;
...
f(x) ; // appel illgal
Cette rgle ne sapplique pas dans le cas o les paramtres formels sont constants
ENSI
AU : 2014-2015
Cette rgle ne sapplique pas dans le cas o les paramtres formels sont constants
ENSI
AU : 2014-2015
AU : 2014-2015
Macros et fonctions
46
ENSI
AU : 2014-2015
Macros et fonctions
47
Exemple de macro :
lorsqu'elles sont mal dfinies. D'autre part, il n'y a aucun contrle sur
le type des arguments.
Exp :
Une macro dfinie par : carre(x) x * x
et appele par :
Carre(++a)
gnrera les instructions :
++a * ++a
ENSI
AU : 2014-2015
Macros et fonctions
48
Macro
Fonction
des donnes ;
Risque davoir des rsultats
inattendus.
donnes
Pas de risques deffet de
bord
Perte de temps dexcution
d au mcanisme dappel
ENSI
AU : 2014-2015
Fonctions en ligne
49
aux macros.
le compilateur se charge de la conversion en macro
#define MAX(a,b) (((a)>=(b))? (a) : (b))
AU : 2014-2015
Fonctions en ligne
50
AU : 2014-2015
Fonctions en ligne
51
/* exemple dutilisation
main()
{ double v1[3], v2[3] ;
int i ;
for (i=0 ; i<3 ; i++)
{ v1[i] = i ; v2[i] =
}
cout << "norme de v1 : "
cout << "norme de v2 : "
}
*/
2*i-1 ;
<< norme(v1) << "\n" ;
<< norme(v2) << "\n" ;
ENSI
AU : 2014-2015
Fonctions en ligne
52
AU : 2014-2015
Fonctions en ligne
53
Fonction en ligne
Contrle de type des donnes
Gain de temps dexcution
Perte despace mmoire
ENSI
AU : 2014-2015
ENSI
AU : 2014-2015
C tait la suivante :
#include <stdio.h>
#include <math.h>
#include <string.h>
En C++, il n'est plus ncessaire de spcifier l'extension sur les fichiers
ENSI
AU : 2014-2015
Espaces de noms
56
structure de donnes.
Pour viter le conflit de noms, on tait oblig de modifier les noms de
chaque structure
C++ propose un moyen simple de rsoudre ce problme : les espaces de
noms.
Les espaces de noms permettent de dfinir une unit cohrente dans laquelle
ENSI
AU : 2014-2015
Espaces de noms
57
ENSI
AU : 2014-2015
Espaces de noms
58
Remarque :
Tous les identificateurs des fichiers en-tte standard sont dfinis dans lespace
de noms std ;
Il est donc ncessaire de recourir systmatiquement linstruction :
using namespace std ; /* utilisation des fichiers
en-tte standard */
ENSI
AU : 2014-2015