Académique Documents
Professionnel Documents
Culture Documents
DU C À C++
• Introduction
• Historique de C++
• Types de données - définition / déclaration
• Les fonctions
• Structuration d’un programme C++
Introduction
3
Système
d’exploitation
Langage
Modèle physique
Bibliothèques
Historique C++
4
• ....
/* je suis un super commentaire en C
et je étends sur plusieurs lignes
printf("Gros commentaire"); */
....
// je suis un super commentaire C++ sur une ligne
....
• C
int i=5, itmp;
int j=2; i variable de
... parcours temporaire
for (itmp=0; itmp<10; itmp++)
{
j+=itmp;
} • 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 !
Délocalisation des déclarations
10
• C++
void main()
{
Int k=100;
for ( int i = 0;i<10;i++ )
{
int j; // les variables i et j ne sont
} connues que du bloc
cout<< i;
cout << j;
}
Nouvelles possibilités d’E/S
11
Cout
Cin
int n;
cout<<"Saisir un entier: ";
cin >> n; // équivalent à scanf("%d",&n);
int a, b;
cin >> a >> b; // saisie de 2 entiers séparés par un Retour
Charriot
Les conversions de type
14
int a,b;
The value of a is: 4
float x=3.2,y=1.9;
a = (int)x+y;
b = int(x+y); The value of b is: 5
Une conversion de type float --> int ou char est dite dégradante
Une conversion de type int ou char --> float est dite non dégradante
Les constantes
17
Remarques :
• La surcharge est une forme faible de polymorphisme.
• elle est surtout utilisée dans les classes, pour définir plusieurs variantes du
constructeur
• la surcharge peut se révéler particulièrement intéressante lorsqu'on souhaite
éviter des conversions de types indésirables lors du passage des
paramètres.
Les paramètres avec valeurs par
24
défaut
• C++ procure cette facilité en nous autorisant à fournir une
valeur par défaut aux paramètres.
• Il existe cependant une restriction importante dans la mise
en œuvre des paramètres par défaut:
o À partir du moment où un paramètre possède une valeur
par défaut, tous les paramètres suivants doivent également
en posséder une.
Les paramètres avec valeurs par
25
défaut
Exemple
void f1(int n = 3) // par défaut le paramètre n vaut 3
void f2(int n, float x = 2.35) // par défaut le paramètre x vaut 2.35
void f3(char c, int n = 3, float x = 2.35) // par défaut le paramètre n vaut 3
void main()
{
char a = 0; int i = 2; float r = 5.6;
f1(i); // l’argument n vaut 2, l’initialisation par défaut est ignorée
f1(); // l’argument n prend la valeur par défaut
f2(i,r); // les initialisations par défaut sont ignorées
f2(i) // le second paramètre prend la valeur par défaut
// f2(); interdit
f3(a, i, r); // les initialisations par défaut sont ignorées
f3(a, i); // le troisième paramètre prend la valeur par défaut
f3(a); // le deuxième et le troisième paramètres prennent
} // les valeurs par défaut
Les paramètres avec valeurs par
26
défaut
En effet, dans le cas contraire, cela pourrait
poser des problèmes pour le compilateur :
int f(int a=0, int b, int c=0);
....
i=f(1, 2, 3); // OK
j=f(4); // toujours OK ~ f(0, 4, 0)
k=f(5, 6);
// argh ! ~ f(5, 6, 0)
// ou f(0, 5, 6) ?
En revanche, l'exemple suivant est
// non respect de la contigüité valide :
void f(double x, double y=0.0, double z=0.0);
....
f(a); // OK ~ f(a, 0.0, 0.0)
f(a, b); // OK ~ f(a, b, 0.0)
f(a, b, c); // OK ~ f(a, b, c)
// respect de la contiguïté
Les paramètres anonymes
27
int main (int argc, char *argv[ ]) int main (int, char **)
{ {
.... ....
} }
version C (nommage obligatoire) version C++ (paramètres
anonymes)
Allocation de la mémoire
28
char *adc;
//réservation de place en mémoire pour 100 caractères
adc = new char[100];
// char *adc = new char[100];
Variables globales
Arguments Pointers
Valeurs de retour
variables.
int n,m ;
int& i=n ; // i variable référence sur n
Exemple:
int n;
int &p = n;
// p est une référence à n
// p occupe le même emplacement mémoire que n
n = 3;
cout<< p; // l’affichage donnera 3
Rappel : Passage de paramètres
35
Void main()
{
int k=7;
increment(k,3);
cout << k << endl; // affiche 7 mais pas 10 (i.e. 7+3)
}
Passage de paramètres par adresses
37 Remarque :
void increment(int *n, int z) { *n= *n + z; }
Int * k =new int (7);
Void main() { Increment(k,3);
int k=7; Cout << *k;
increment(&k,3);
cout << k << endl; // affiche 10 car c'est l'adresse qui a été passée.
}
Passage de paramètres par référence
38
Une référence est surtout utilisée comme paramètre formel d'une fonction.
A chaque appel de la fonction, elle est initialisée par le paramètre effectif
correspondant.
void increment(int& n, int z) { n= n + z; }
Void main()
{
int k=7;
increment(k,3);
cout << k << endl; // affiche 10
}
void Swap (int * a, int * b) void Swap (int & a, int & b)
{ {
int tmp=*a; int tmp=a;
*a=*b; a=b;
*b=tmp; b=tmp;
} }
.... ....
int i=2, j=4; int i=2, j=4;
Swap (i, j);
Swap (&i, &j); // i vaut 4 et j vaut 2
/* i vaut 4 et j vaut 2 */
Passages par références
40
Remarque:
Lorsqu’on doit transmettre en argument la référence d’un
pointeur : int * & adr;
définition/utilisation du namespace
différenciation par les namespaces
namespace A
namespace Version1 {
{ void f() { ... };
typedef unsigned int B; }
.... namespace Version2 {
} void f() { ... };
.... }
A::B i; ....
// une variable de type B void main () {
Version1::f();
Version2::f();
....
}