Eléments de Langage C++: Pierre Puiseux Université de Pau Et Des Pays de L'adour Département de Mathématiques
Eléments de Langage C++: Pierre Puiseux Université de Pau Et Des Pays de L'adour Département de Mathématiques
Eléments de Langage C++: Pierre Puiseux Université de Pau Et Des Pays de L'adour Département de Mathématiques
Pierre Puiseux
Universit de Pau et des Pays de l'Adour
Dpartement de mathmatiques
Contents
1 Historique
2 Notions de base
2.1
2.2
Premires instructions
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3
Compilation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.4
Compilation spare
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.5
2.6
Variables
2.7
Mots rservs
2.8
Constantes chiffres
2.9
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12
. . . . . . . . . . . . . . . . . . . . . . . . . .
13
2.10 Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
15
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
16
17
18
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
19
19
2.17 Tableaux
20
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3 Les oprateurs
21
3.1
Oprateurs arithmtiques
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2
22
. . . . . . . . . . . . . . . . . . . . . .
23
3.3
24
3.4
Oprateur conditionnel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
25
3.5
Oprateurs d'affectation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
26
if()...else . . . . .
Structure switch . . . . . . . .
Strucrures while et for
. . . .
Structure do ...while . . . . .
Instructions break et continue
Instructions goto etiquette . .
Structure
27
. . . . . . . . . . . . . . . . . . . . . . . . . . .
28
. . . . . . . . . . . . . . . . . . . . . . . . . . .
29
. . . . . . . . . . . . . . . . . . . . . . . . . . .
30
. . . . . . . . . . . . . . . . . . . . . . . . . . .
31
. . . . . . . . . . . . . . . . . . . . . . . . . . .
32
. . . . . . . . . . . . . . . . . . . . . . . . . . .
33
5 Les fonctions
34
5.1
Gnralits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
35
5.2
. . . . . . . . . . . . . . . .
36
5.3
37
5.4
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
38
5.5
Rcursivit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
5.6
Surcharge de fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
41
6.1
Gnralits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
42
6.2
flots standards
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
43
6.3
44
6.4
45
6.5
. . . . . . . . . . . . . . . . . . . . . .
46
6.6
47
6.7
. . . . . . . . . . . . . . . . . . . . .
48
6.8
48
6.9
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
48
49
. . . . . . . . . . . . . . . . . . . . .
50
. . . . . . . . . . . . . . . . . . . . . .
51
52
7.1
Dfinitions
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
53
7.2
Pointeurs et tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
54
7.3
Chanes de caractres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
55
7.4
56
7.5
57
7.6
Pointeurs de fonctions
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
58
7.7
. . . . . . . . . . . . . . . . . . . . . . . .
59
60
8.1
Les classes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
61
8.2
Les objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
62
8.3
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
62
8.4
Attributs de membres
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
63
8.5
64
8.6
Hritage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
65
8.7
66
8.8
Constructeur et hritage
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
66
8.9
Hritage multiple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
66
67
9 La classe string
67
68
9.1
Constructeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
69
9.2
Mthodes de la classe
. . . . . . . . . . . . . . . . . . . . . . . . . . .
70
string
10 La bibliothque standard
71
72
73
74
74
75
76
77
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
77
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
78
13 Le prprocesseur
84
86
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
86
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
86
87
88
14.2 Gnralits
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
91
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
91
1 Historique
1969
1970
1972
dnition du C
1973
1975
1978
UNIX V7
1981
1983
UNIX SYSTEM V (AT T) et UNIX 4.2 BSD (Berkeley). Premier compilateur C++
par B.Stroustrup
1988
Mise en place d'une norme C par l'ANSI, premiers compilateurs C++ pour PC
1991
1995
2 Notions de base
2.1
Le langage C++ contient le langage C : tout programme crit en C la norme ANSI doit pouvoir
tre compil par un compilateur C++.
C++
Allo
et
allo
sont distinctes
C++ on ne parle pas de type mais de classe (la classe int, la classe char...)
C++ on ne parle pas de variables mais d'objets ou d'instances (int i=0; dclare ou instancie
objet de classe int)
En
En
un
Dans la pratique, sourtout pour les classes de base, on utilisera souvent la terminologie variable
de type xx au lieu de objet (ou instance ) de classe xx
Programme C++ = ensemble de fonctions comprenant une seule fonction
main()
(point
d'entre).
2.2
Premires instructions
Une instruction = la plus petite unit indpendante de C++, dlimite par un ; (point virgule)
une phrase du langage naturel.
#include <stdlib.h>
#include <iostream>
int main(void)
{
int age = 21; //reservation memoire pour age
float x[5]={1.0,0,0,2,-1.5};
2.3
/* Autre commentaire */
char Nom[25]="Etudiant", prenom[20] = "Lambda";
float note_partiel, note_exam, note_finale;
note_partiel = note_exam = note_finale = 0.0;
//C'est l'initialisation !
cout < < endl < < "entrer notes part et exam";
cin > > note_partiel > > note_exam;
note_finale = 0.3*note_partiel + 0.7*note_exam;//affectation
cout < < note_finale;
Compilation
>
g++ -c gourette.cxx
1. Appelle
tmp.c
Production
Production
>
gourette.o
artouste
Excution
> artouste
2.4
Compilation spare
Ces fonctions peuvent (doivent) tre rparties dans plusieurs chiers ; par exemple
chier main.cxx
#include <stdlib.h>
#include util.h
int main()
{
int i=doubler(3);
double x = tripler(0.0);//etc...
}
#include util.h
//ici des utilitaires et
//fonctions utiliss par main()
void tripler(int y)
{
cout< <endl< <3*y;
y=3*y;
};
double doubler(float x)
{
x*=2;
};
chier util.h
#ifndef UTIL_H
#define UTIL_H
void doubler(int);
void tripler(float);
#endif
chier util.cxx
Compilation
2.5
distinctes
Identicateurs : noms et types de variables, noms de fonctions, nom des constantes, nom
des macros-instructions
Constantes :
Oprateurs :
Sparateurs :
+,*,-,/,%
etc...
sparation d'lments
()
[]
2.6
Variables
caractrises par :
.
un nom
un type
le nom :
.
10
2.7
Mots rservs
Types :
Classe de stockage :
Instructions :
Oprateurs :
Etiquette :
mots rservs C++ : asm, friend, virtual, class, catch, delete, inline, new,
operator, private, protected, public, template, this, throw, try.
if, else, while, do, for, switch, break, continue, goto, return
sizeof
case, default
11
2.8
Constantes chiffres
type
exemple
entier dcimal
125
entier octal
016
entier hexadcimal
0xFFA33
entier long
1450L
1.25
1.2E+3
1.78L
12
2.9
`a'
`\n'
newline
tabulation
`\t'
backspace
`\b'
.
.
antislash
NULL
`\\'
`\0'
3. chane de caractres : squence de caractres dlimite par des guillemets (double cote) ex :
2.10
.
Types
types de base :
.
.
char
int
entier
float
rel, ottant
double
double prcision
modicateurs :
gcc
et oat.h )
Type
Taille (bits/octets)
valeurs
0. . . 255
unsigned char
char
short int
int/long
unsigned int/long
float
double
long double
L'usage du modicateur
unsigned
-128. . . 127
16
-32768. . . 32767
32
-2147483648. . . 2147483647
32
0. . . 4294967295
32/4
1.18e-38. . . 3.40e+38
68
2.23e-308. . . 1.80e+308
?
Exemple :
#include <iostream>
using namespace std;
int main(void)
{
unsigned int ui=0;
cout < <endl< <--ui;
int i=0;
13
14
2.11
Conversions de type
conversions automatiques
.
rgle de base : aprs valuation, le type du rsultat est celui de l'oprande de type le plus
lev.
exemple :
int i;
double x;
x = x+i; //i est converti (promu) en double.
char,short > int > unsigned > long > double > long double < float
syntaxe :
exemple :
(type) expression
15
2.12
Dclarations de variables
syntaxe :
exemple :
int i(12);
extern double x ;
long double vect [] = {1.0L, 1.0L, 2.1L, 0.0L};
16
2.13
la porte d'une variable est la rgion du programme o elle est connue. Elle dpend du mode et
du lieu de sa dclaration :
et le dbut du bloc des instructions. Ce sont les arguments de la fonction. Par exemple :
int max
porte fonction :
la fonction.
17
2.14
extern
ou
static.
extern.
mmoire alloue l'entre dans un bloc ou une fonction, dsalloue la sortie du bloc ou de
la fonction.
.
.
auto
ou
register
(registre
auto.
new()
et
delete()
18
malloc()la
destruction par
free())
2.15
extern
extern
porte
chier
autres chiers
chier
instant d'allocation
compilation
aucune
compilation
classe de stockage
2.16
static
zone mmoire
donnes
donnes
dure de vie
le programme
le programme
initialisation
autorise
interdite
autorise
extern
static
auto
register
bloc
bloc
bloc
bloc
aucune
compilation
zone mmoire
donnes
pile
un registre
dure de vie
le programme
bloc
bloc
autorise,
autorise
0 par dfaut
sauf tableaux
initialisation
interdite
19
autorise
2.17
Tableaux
dclaration :
exemple :
Pour un tableau multidimensionnel, seule la dernire dimension n'a pas besoin d'tre prcise.
pas de contrle eectu par le compilateur sur les rfrences hors limites.
.
.
size)
double x [100]; x
de la bibliothque standard
<stdlib.h>
20
void *malloc(size_t
(dconseill)
double.
malloc)
de 10
3 Les oprateurs
21
3.1
Oprateurs arithmtiques
. +
addition :
. -
soustraction :
. *
multiplication :
. /
division :
12/4.0
. %
modulo :
a%b
a+b
x-y
2*s
par
b.
12%5
vaut 2.
* / %
donc
a*b+c
vaut
puis
(a*b)+c.
22
+ -
12%3
3.2
Relationnels :
. >strictement
. >=
. <
suprieur
suprieur ou gal
strictement infrieur
. <=
infrieur ou gal
. ==
gal
. !=
dirent
Le rsultat est
par exemple
1>2
(vrai) ou
vaut
(faux)
0; 0==0
vaut
1.
Logiques :
!
ngation
&&
et
||
ou
if (expression!=0).
23
3.3
notation postxe :
i++, i--
++
et
--
sa valeur a t utilise.
if (i++ != 0)
Exemple :
notation prxe :
Remarque :
i++
++i
test l'galit de
incrmente d'abord
avant de l'utiliser.
est quivalent
i = i+1;
24
0,
puis incrmente
i.
3.4
Oprateur conditionnel
expression0 ?
syntaxe :
expression1 :
expression2
if (expression0)
expression1
else
expression2;
.
a :
25
3.5
.
Oprateurs d'affectation
l'aectation est symbolise par
.
expression1=expression2
exemples :
le rsultat de l'expression
.
syntaxe :
=,
exemples :
"expression1=expression2"
i = j = 0;
s'value comme
i = (j = 0);
si
exemples :
i += 2;
incrmente
de
2.
26
est la valeur de
et met
et
expression2.
j
la valeur
27
4.1
.
Structure
if()...else
syntaxe :
if (expression)
instruction1;
else
instruction2;
.
instruction simple :
if (n>0) x = a;
if (n>0)
x = a ;
else
x = b ;
.
if (n>0)
{
x = a;
i++;
}
else
{x = b ;}//accolades facultatives
.
if (n>0)
{
x = a;
i++;
}
else if (truc)
{
x = b ;
}
else
printf(i = %d,i);
28
4.2
Structure
switch
switch
{
case
case
case
(expression_entiere)
'0' : /*rien*/;
'1' : /*rien*/;
'4' :
nb++;
break;
case :
/*rien*/;
case '\n' : /*rien*/;
case '\t' :
nblancs++;
break;
default :
autres++;
break;
. expression_entiere
.
chaque
case
Lorsque
break
l'instruction suivante.
. default est
default.
case
29
label
4.3
Strucrures
while et for
syntaxe de while :
while (condition)
instruction;
.
correspond :
exemples
syntaxe de for :
for (e1 ; e2 ; e3) instruction
.
correspond :
for(;;);
30
4.4
.
Structure
do ...while
syntaxe
do
instruction;
while (condition)
.
rpter
instruction
jusqu' (non condition) (ou tant que (condition))
.
31
4.5
Instructions
. break
.
break et continue
for, while,
ou
do. . . while,
exemple :
exemple :
32
inconditionnellement.
4.6
Instructions
goto etiquette
syntaxe :
goto etiquette ;
instructions
....
...
etiquette : instruction ;
.
exemple
33
5 Les fonctions
34
5.1
Gnralits
Ne pas confondre
. prototype
. dnition
usuellement, on dclare la fonction (f) dans un chier entte (util.h, qui sera inclus dans
les chiers utilisant
f)
float f(float x)
{
int f1(int i)
{/*....*/}
//implmentation illgale
//instructions f1
}
35
5.2
syntaxe :
type nom_fonction (type param1, type param2, ...)
param1, param2
types
sont obligatoires
exemple1 :
//Deux critures quivalentes
int Ind_Max (double x [] ; int n)
double
Ind_Max
double
int
int.
exemple 2 :
double Integrale (double (*f) (), double a, double b)
indique que
fonction de type
exemple 3 :
extern
ou
par defaut
36
5.3
syntaxe :
type nom_fonction (type param1, type param2, ...)
instructions;
return var ;
//o var est du type retourne par la fonction
}
exemples fonction qui renvoit un objet :
double Max_Abs (double* x
, int n)
};
.
Aucun contrle sur le type et le nombre des arguments n'est eectu par le compilateur.
Pas de return
37
5.4
Transmission par
rfrence
f.
& x)
f(type
qui est
x.
exemple :
float y=0.0;
f(y);
Transmission par
la fonction appele
La fonction
f.
valeur :
f(type x)
x.
exemple :
void f(float x)
{x=2.0;}
Dans le programme appelant, la squence d'instructions
float y=0.0;
f(y);
2.0
38
0.0
5.5
Rcursivit
la rcurrence est humaine, la rcursivit est d'essence divine
version rcursive
long Factorielle (short n)
{
(n == 1) ? return 1 : return (n*Factorielle(n-1));
};
version rcurrente
long Factorielle (short n)
{
long temp = 1;
short i ;
for (i = 2 ; i <= n ; i++)
temp *= i ;
return temp ;
};
5.6
Surcharge de fonctions
complex u,v;
double x,y;
int i,j;
39
swap(u,v);
40
41
6.1
.
Gnralits
les fonctions d'entre/sortie n'appartiennent pas au langage C++ mais la bibliothque
standard
<iostream.h> ou <iostream>
<fstream.h> ou <fstream>
et dans
42
EOF.
6.2
.
flots standards
4 ots sont automatiquement ouverts par le systme au dbut du programme et referms
la n :
. cin,
ostream
. clog,
ostream
. cerr,
ostream
43
6.3
par exemple
ofstream fichier_sortie;//dclaration
fichier_sortie.open(toto.out);//ouverture
.
ofstream fichier_sortie(toto.out);
.
Pour ouvrir un ot en ecriture, en mode append . S'il existe dj, les nouvelles critures
sont faites la n du ot.
ofstream fichier_sortie(toto.out,ios::app);
.
l'ouverture d'un ot renvoie 0 si tout c'est bien pass, un entier non nul si une condition
d'erreur existe.
if (!fichier_sortie)
{
cerr< <impossible d'ouvrir fichier_sortie;
exit(-1);
}
.
close()
44
fichier_entree.close();
6.4
.
par exemple
ifstream fichier_entree;
fichier_entree.open(toto.in); // ouvre le flot existant en lecture.
.
ifstream fichier_entree(toto.in);
.
l'ouverture d'un ot renvoie 0 si tout c'est bien pass, un entier non nul si une condition
d'erreur existe.
if (!fichier_entree)
{
cerr< <impossible d'ouvrir fichier_entree ;
exit(-1);
}
.
close()
fichier_entree.close();
45
6.5
L'oprateur
<<
fstream fout(toto.out,ios::out);
fout< <hello< <endl;
.
. endl
.
l'oprateur
'\n')
Exemple
ligne;
<<
46
write()
et
put().
6.6
unsetf()).
Modica-
setf(ios::showbase)
setf(ios::showpoint)
setf(ios::dec)
setf(ios::scientific)
. unsetf(long)
.
hex
en hexadcimal)
exemple
cout< <10.0;//affiche 10
cout.setf(ios::showpoint);
cout< <10.0;//affiche 10.0
cout< <5.0;//affiche 5.0
Manipulateurs
Inclure le chier
<iomanip.h>
. setw(int w);
<iomanip>
. setfill(char c);
. setprecision(int p);
.
ou
exemple
47
6.7
istream fin(toto.in,ios::in);
char car;
fin> >car;//met le premier caractre de fin dans la variable car
.
l'oprateur
fin> >car
operator> >
et
sont quivalentes
Le caractre spcial
6.8
EOF
ifstream
. read(const char* str,int length)est une mthode de ifstream qui permet d'extraire
length caractres de la chane str du ot d'entre. Exemple char[20] str; cin.read(str,11)
;
Exemple
. getline (char * buf,int limit,char delim='\n') permet de lire et aecter buf une
ligne entire, jusqu'au caratre '\n' (par dfaut) lorsque l'on ne veut pas sauter de blancs.
getline() extrait au plus limit-1 caractres et ajoute un caractre NULL la n.
.
L'oprateur d'extraction
. peek()
>>
read()
EOF,
et
get()
et
getline()
. gcount(), tellg()...
6.9
. int eof()
. bad()
ifstream
: n de chier trouve
. fail()
. good()
. clear()
le curseur de
good()
48
pos
c.
limit
6.10
49
6.11
50
6.12
51
52
7.1
Dfinitions
2
i
ou (*p)
.
dclaration :
exemple :
type
(type, adresse)
de l'objet point.
*identificateur;
contenant un entier.
int *p;
p
Si
exemple
Type
*p
float *p;
*p=2.0;
.
Type
.
Type,
alors
exemple
float x;
float *px;
px = &x;
.
si
de
x est
x.
un
float,
alors
float &xalias = x
exemple
float x;
float &y = x; // initialisation obligatoire
53
xalias
est un alias
7.2
Pointeurs et tableaux
2
i
ou (*p)
.
int T[5] ;
int *p ;
.
l'instruction
&T[0];
. p
p = T
. p+i
pointe sur le
ime
lment suivant;
*(p+i)
est gal
T[i].
Le nom d'un tableau est un pointeur constant sur le premier lment du tableau.
Type *a;
a = new Type[n];
delete[]a;
.
Type
//allocation memoire
//liberation memoire
si l'allocation russit,
sinon il retourne
p =
54
7.3
Chanes de caractres
Certaines fonctions sont disponibles. Ces fonctions sur chanes de caractres sont dclares
<string.h>.
string.
dans
Sous UNIX, une aide en ligne est disponible via la commande man
NULL
(ou
'\0'),
insr par le
compilateur.
on accde aux constantes de type chane de caractres au moyen d'un pointeur de type
pointant sur le premier lment de la chane, par exemple
lors de l'instruction
mais
char *s;
char,
. char *strcpy(char *dest, const char *src); recopie src dans dest (la place mmoire
de dest doit avoir t rserve)
. char *strcat(char *dest, const char *src);
mmoire de dest doit avoir t rserve)
. size_t strlen(const char *s);
La classe
recopie
src
la n de
dest
(la place
string permet une manipulation plus intuitive et ecace des chaines de caractres.
exemple :
# include <iostream>
# include <string>
using namespace std;
int main(void) {
string S("Puiseux");
cout < < endl < < S +" Pierre"< < flush;
return 0;
}
55
Par
7.4
dclaration :
exemple :
n*n
double **a;
//allocation
a = new (double *)[n];
for (i=0;i<n;i++) a[i] = new double[n];
//liberation
for (i=0;i<n;i++) delete []a[i];
delete[]a;
.
si l'allocation russit,
sinon il retourne
56
7.5
.
. a[i]
.
*(a+i)
dans le cas de transmission de tableau en paramtre d'une fonction, seule l'adresse du premier
lment est transmise.
La valeur
NULL
(en fait 0) pour un pointeur est caractristique d'un pointeur mal initialis
ou mal dclar.
p++
(ou
p--)
de
sizeof(p)
octets.
. Int T[10][5][2];
lignes, 2 colonnes.
57
7.6
Pointeurs de fonctions
une fonction n'est pas une variable. Nanmoins, elle a une adresse en mmoire. On peut donc
dnir une variable qui pointe sur une fonction.
Dclaration :
. g
double.
int
et un
float
en arguments et dont le
est un pointeur sur une fonction sans arguments dont le rsultat est de type
double *f();
int.
double.
A distinguer de
Peut s'utiliser lorsque la fonction utiliser peut varier, par exemple pour une mthode de
58
7.7
.
new
et
delete
exemple :
malloc
(langage C):
void *malloc(size_t size) ; aloue un bloc de mmoire de size octets dans la zone
de mmoire appele tas (heap).
NB : l'instruction
calloc(n,s)
Si l'allocation russit,
malloc
est quivalente
malloc(n*s).
Si l'argument
size
vaut
0,
alors
malloc
renvoie
NULL.
n*n
[7.2] et [7.4]):
59
60
8.1
.
Les classes
Dnition : une classe est un type dni par l'utilisateur (au mme titre qu'un
un
int).
class
class Nom_de_Classe
{
public :
dclaration_donnees_publiques ;
declarations_methodes_publiques ;
protected :
dclaration_donnees_protegees ;
declarations_methodes_protegees ;
private :
dclaration_donnees_privees ;
declarations_methodes_privees ;
};
.
Exemple :
class Etudiant
{
private :
char nom_[20];
int age_;
float note_exam_,note_partiel_,note_finale_;
public : //methodes et donnes publiques
float rien;
//calcul note finale, implement ailleurs
float Set_Note_Finale(void);
};
61
float
ou
8.2
.
Les objets
Un objet est une instance d'une classe, c'est dire un emplacement mmoire adressable dont
le type est celui de la classe. De mme que
dclare un objet de type
int,
int
int i;
Exemple :
Pour les types dnis par l'utilisateur, on parle de classe et d'instances (ou objets ).
On peut crer dynamiquement des instances de classe en faisant appel au ( un des) constructeur(s) de la classe (cf : 8.7). Le compilateur gnre un constructeur par dfaut
Etudiant *a;
a = new Etudiant();
...
delete() a;
8.3
exemples :
&
et
->
et
Etudiant e, *pe ;
pe = &e ;//pe prend pour valeur l'adresse de e
e.rien = 0.0 ; //e.rien accde au champ rien de e
*pe.rien = 1.0 ;
pe->rien = 19.00;
// pe->rien et *pe.rien identiques
float x = e.Get_Note_Finale();
x = pe->Get_Note_Finale();
62
8.4
.
Attributs de membres
les dirents membres d'une classe peuvent tre accs protg, priv ou public
private
les membres privs ne peuvent tre utiliss (modis pour les donnes, appels
protected
les membres protgs ne peuvent tre utiliss que par les mthodes de la classe
public
.
private
nom_
.
public.
ou
private
protected,
ou
protected
Soit
63
de compilation car
age_
8.5
Usuellement :
toto
Une classe
dans le chier
toto.cxx,
exemple
chier
toto.h
class toto
{
private : float x;
public : void FaireQuelqueChose(void);
};
toto.cxx
de rsolution de porte ::
toto.h
chier toto.cxx
#include toto.h
void toto::FaireQuelqueChose(void)
{
cout< <endl
< <justement, je ne fais rien!!;
}
64
toto
8.6
Hritage
Une classe
dclaration :
class B : public A
{/*...*/}
Dans cet exemple, le mode de drivation de la classe
est
public.
Mode de drivation
public
protected
private
public
public
protected
protected
private
inaccessible
public
protected
protected
protected
private
inaccessible
public
private
protected
private
private
private
65
8.7
.
Exemple :
class Vecteur
{
private :
float * v_;
int n_;
public :
void Vecteur(int );
//constructeur1
void Vecteur(istream&); //constructeur2
void Vecteur();
//constructeur3
/* ici, d'autres methodes */
~Vecteur;
//destructeur
}
.
Vecteur::Vecteur(int n)
{n_=n; v_=new float[n_];}
Vecteur::Vecteur(istream& filin)
{/*lecture et initialisation sur le flot filin*/}
Vecteur::Vecteur()
{//vecteur vide}
.
8.8
Constructeur et hritage
class b : public a
{
b(...);//constructeur
};
La syntaxe d'appel au constructeur de la classe de base est :
8.9
.
Hritage multiple
Une classe peut hriter de plusieurs classes.
66
le constructeur de
//a hrite de b et de c
et
a::a(liste_arguments_a) : b(liste_arguments_b)
: c(liste_arguments_c);
.
Si
et
variable
de
et celle de
b.
8.10
Mthodes virtuelles
8.11
Fonctions amies
(friend)
67
b::x
et
9 La classe string
68
9.1
Constructeurs
La classe
string
string
se trouvent dans
<string.h>
69
9.2
.
Mthodes de la classe
string
concatnation :
string ch1(bon);
string ch2(jour);
string ch3 = ch1 + ch2; //ch3 contient bonjour
.
Les oprateurs d'insertion (< <) et d'extraction (> >) sont surchargs de manire naturelle
pour la classe
La fonction
string.
find
string s(bonjour);
string ch(onj);
int i = s.find(ch); // i=1
i = s.find(ur); //i=5
.
'\n'
Un
#include <string>
#include <iostream>
#include <fstream>
int main()
{
ifstream in("FillString.cpp");
string s, line;
while(getline(in, line))
s += line + "\n";
cout < < s;
}
70
ou
'\0'
string
ou autre.
10 La bibliothque standard
71
10.1
Fichier
Description
assert.h
ctype.h
errno.h
float.h
limits.h
locale.h
math.h
signal.h
stdarg.h
Macros pour lire la liste d'arguments des fonctions prvues avec un nombre d'arguments
variable
stddef.h
stdio.h
stdlib.h
string.h
time.h
72
10.2
Fichier
Description
alloc.h
bios.h
complex.h
conio.h
dir.h
direct.h
dos.h
errno.h
mem.h
memory.h
Gestion mmoire
search.h
Recherches et tris
values.h
73
Permet de dnir des classes et des fonctions dans lesquelles la classe est variable
inline
inline
inline
inline
etc...
sera remplac par
Max() avec n'importe quelle paire de variables de meme classe (pourvu qu'il
T an que a>b ait un sens dans ***).
i
x
c
w
=
=
=
=
Max(1, 5);
Max(5.6, 4.2)
Max('a', '\t')
Max (3.1, 4);
74
11.2
Bureaucratique :
1. lister toutes les erreurs possibles
2. prvoir le traitement appropri
Autoritaire : exit(-1);
throw
catch
traite l'erreur
try
try{
/*instructions parmi lesquelles peuvent
etre jetes (throw) des exceptions
de classes diverses*/
classe1 Y; throw Y;
}
catch(classe1 x)
{/*...*/}
catch(classe2 x)
{/*...*/}
75
catch
11.3
Exceptions : exemple
#include <iostream.h>
int main()
{
try{
/*...*/
if (toto)
throw (ca va pas du tout);
throw 17;
cout < < "cette instruction ne sera jamais executee"
}
catch (int i){
cout < < "\nL'erreur numero
< <i
< < " vient de me parvenir ; que faire ?";
}
catch (char * message){
cout < < endl < < message;
}
}
Si
toto
Si
toto
ca va pas du tout
Il est possible d'crire un programme, des classes, fonctions...
Le
traitement des exceptions peut tre rajouter par la suite, avec un nombre minimum de modications.
76
permet de manipuler les structures de donnes standards et les algorithmes s'y rattachant.
cout
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <vector>
#include <iterator>
#include <algorithm>
int main(void)
{ typedef vector<int> vector_int;
ifstream source("input.txt");
vector<int> v;
istream_iterator<int> start(source);
istream_iterator<int> end;
back_insert_iterator<vector_int> dest(v);
copy(start,end,dest);
sort(v.begin(),v.end());
copy(v.begin(),v.end(),ostream_iterator<int>(cout,"-"));
cout < < endl < < "Fin du test !" < < endl;
return 0;
}
12.1
.
Organisation de la STL
les conteneurs : permettent de contenir des lments
.
tableaux (classes
vector
et
deque)
listes (list)
piles (stack)
les (queue)
ensembles (set)
ensembles multiples (multiset)
cartes (map)
multicartes (multimap)
Les itrateurs : permettent aux algorithmes de manipuler les conteneurs. Un itrateur peut
tre vu comme un pointeur sur un lment d'un conteneur.
Les algorithmes : permettent de manipuler les donnes d'un conteneur. (tri, ...)
77
12.2
Le conteneur vector
#include <vector>.
Un
vector
connait 2 valeurs:
#include <vector>
#include <iostream>
using namespace std;
int main(void)
{
vector<int> v;
v.push_back(3); // le tableau vaut [3], de taille 1
v.push_front(4); // le tableau vaut [4,3], taille 2
cout< <v[0]; // renvoie 4
v[1] = 5;
cout< <v[1]; // renvoie 5
return 0;
}
#include <vector>
#include <iostream>
#include <iterator>
#include <fstream>
int main(void)
{
ifstream file;
file.open("input.txt");
int nb;
file> >nb> >ws;
vector<int> x;
datas.reserve(nb);
for (;nb>0;--nb){
int d;
file> >d> >ws;
x.push_back(d);
}
copy(x.begin(),x.end(),ostream_iterator<int>(cout,"-"));
return 0;
}
Autres mthodes :
. T& back();
. void pop_back();
vide le conteneur
. bool empty();
78
Ouvrages de rfrence
References
[1] Comprendre et utiliser C++ pour programmer objet, G.Clavel, I.Trillaud, L.Veillon ed. Masson
1994.
[2] L'essentiel du C++, S.B. Lippman, ed. Addison-Wesley, seconde dition, 1992.
[3] Le langage C++, Bjarne Stroustrup, ed. Addison-Wesley, seconde dition, 1992.
[4] Programmer en langage C++, C.Delannoy, ed. Eyrolles, 1998.
[5] La bibliothque standard STL du C++, A.B. Fontaine, ed. InterEditions, Masson 1997.
79
Tutoriaux, documentation
References
[1]
http://gustavo.net/programming/c_tutorials.html
[2]
http://math.nist.gov/acmd/Staff/RPozo/
[3]
http://w3imagis.imag.fr/Membres/Xavier.Decoret/STL_TUTORIAL/sommaire.html
[4]
http://www.infini-fr.com/Sciences/Informatique/Langages/Imperatifs/CPlusPlus/STL
80
References
[1] algebre linaire :
LAPACK++
SparseLib++
IML++
Diffpack, deal-II
Math.h++
M++
tnt
(R. Pozo)
81
C++
fait
partie intgrante de la phase de programmation. Grosso-modo, on doit trouver autant de documentation que de code. Les chiers en-tte doivent tre particulirement bien documents, puisque
ce sont les seuls dlivrables lisibles en clair dans un projet industriel. Un utilitaire trs puissant,
doxygen, permet d'extraire du code et des chiers en-tte toute la documentation incluse, pourvu
qu'elle respecte une certaine syntaxe dont les lments essentiels sont donns ici.
Style JavaDoc :
/**
* ... text ...
*/
.
style Qt
/*!
* ... text ...
*/
.
Les caractres '@' et '\' ont un signication particulire pour doxygen. Il introduisent une
balise. Par exemple si vous placez la ligne
dans un com-
mentaire doxygen elle sera interprt comme la description d'un certain paramtre i et
prsente de manire adhoc dans la documentation.
@author,
(emphasis)...
etc... la documentation sera prsente suivant la description html que vous en faites.
latex.
Par exemple
doxygen.
Doxyfile
Un chier avec des valeurs par dfaut peut tre gnr par
doxygen
$ doxygen -g
Les ligne de documentation d'une fonction ou variable doivent se trouver avant la fonction ou
variable concerne.
Exemple :
1 pour
http://www.stack.nl/~dimitri/doxygen/
82
protected:
public :
/**Constructeur recopie.
*Pour une raison pas tres claire, si l'on supprime le present
*consructeur, en esperant que Matrice(const MatVirt&); sera appele,
*ca n'est pas le cas. Ainsi, si l'on ecrit une instruction du
*type <tt>Matrice A(n,n);Matrice B(A); </tt> c'est
*MatVirt::MatVirt(const MatVirt&) qui est appele.
*Et puis ca va pas !
*/
Matrice(const Matrice&);
doxygen
//operateurs methodes
.
/**
*@param k un indice, dans le vecteur v_ de stockage.
*@return w une structure IJ telle que :
*@li w.i est le numero de ligne de v_(k).
*@li w.j est le numero de colonne de v_(k).
*@li w.aij est la valeur v_(k).
*/
inline IJ WhoIs(const int k);
83
13 Le prprocesseur
traite les lignes commenant par
#include
#include <nom_fichier>
#include nom_fichier
syntaxe :
ou bien
nom_fichier
prsente.
. <nom_fichier>
nom_fichier
#define et #undef
.
syntaxe :
NOM
NOM
par
. #undef
.
stoppe la substitution.
#ifdef (13)
#define DEBUG 1
if (DEBUG)//DEBUG vaut 1
cout< <valeur de x =< <x;//x est imprim
#undef DEBUG
#define PI 3.14159
#undef PI
#ifndef et #ifdef
.
syntaxe :
#ifdef NOM
...
#endif
...
#endif
NOM
#ifndef NOM
ou bien
renvoie faux.
84
foo.h,
on aura typiquement
#ifndef FOO_H
#define FOO_H
....
#endif
de sorte que si le chier
foo.h
85
Contents
14 Premiers pas en Linux
14.1
LINUX est un systme d'exploitation cr en 1991 par un tudiant nlandais, Linus Torvalds.
Depuis, il a t dvelopp et amlior par des centaines de spcialistes dans le monde. La particularit de ce systme c'est qu'il est librement disponible avec son code source sur Internet. Il
existe des socits commerciales qui le distribuent et ils facturent alors soit le prix du support (CD
ROM) et de la documentation sur papier, soit ils facturent le service de maintenance et de support
tlphonique. En 1998, Linux et les logiciels libres ont acquis une notorit et une conscration
comme le montre la chronologie suivante:
* Avril 1998, Netscape le numro 1 mondial des navigateurs Internet annonce qu'elle transforme son logiciel Communicator en logiciel libre * Mai 1998, Corel Computer annonce la sortie de Netwinder, Un NC fonctionnant sous Linux * Juin 1998, IBM l'ex numro 1 mondial de
l'informatique abandonne son propre logiciel serveur Web et commence distribuer et supporter
le logiciel APACHE qui est un logiciel libre serveur Web * Juillet 1998 Informix et surtout Oracle,
le numro 1 mondial des SGBD annoncent le portage de leurs SGBD vers Linux * Septembre 1998,
Intel le numro 1 mondial des microprocsseurs entre dans le capital de RedHat un distributeur
commercial de Linux
on supposera dans toute cette partie que l'utilisateur se nomme
groupe
14.2
recherche.
puiseux,
et appartient au
Gnralits
LINUX est un systme d'exploitation (au mme titre que DOS,Windows, MacOS) qui satisfait
la norme UNIX et qui permet de "dialoguer" avec l'ordinateur. Ceci se fait dans une fentre
xterm (on dit aussi en mode console ) via un langage : le shell. Il existe, sous UNIX, 3 principaux
shell : le Bourne shell (sh) qui est le plus ancien, le C shell (csh) et le Korn shell (ksh) qui est
un peu un mlange des deux autres. Il existe aussi des versions un peu plus conviviales : ce sont
par exemple le
tcsh
(csh amlior) et le
bash
86
Dans ces
Par exemple /home/puiseux/sources/zorro.c (chemin absolu) sigzorro.c se trouve dans le rpertoire sources qui se trouve lui mme dans
le rpertoire puiseux, qui se trouve lui mme dans... Supposons maintenant que le rpertoire
courant est /home/puiseux/sources (chemin absolu). Alors le rpertoire /home/puiseux/lib,
peut tre galement dsign par ../lib (chemin relatif ). Lors de la connexion, chaque utilisateur
est connect dans son rpertoire personnel (ou rpertoire home ), en gnral /home/puiseux. Le
rpertoire personnel d'un utilisateur est aussi dsign par ~, ou $HOME.
'.' (point) dsigne le rpertoire courant, '..' dsigne le rpertoire parent du rpertoire
courant.
Cette partie vous explique les principales commandes de UNIX qu'il faut connatre : les commandes de gestion des chiers, les commandes concernant l'environnement, les commandes pour
l'dition ou pour la compilation des programmes que vous crirez.
Pour interrompre une commande, utiliser les touches :
14.3
Ctrl c
(d'aprs Premiers pas sous Linux Auteur : Armand Delcros) Voici l'arborescence d'un systme
UNIX classique :
est le rpertoire racine, tous les autres rpertoires en dpendent. Par exemple le rpertoire o
est "mont" mon CD-ROM est sur
/mnt/cdrom.
/bin
contient les binaires fondamentaux la gestion de Linux. On y retrouve par exemple les
commandes tudies plus loin.
/dev
/dev/hda1
tition de mon disque dur IDE, si mon disque dur est un SCSI, son nom sera
dernire exemple :
/etc
/dev/fd0
/etc/passwd,
/sbin
/dev/sda1.
Un
87
shutdown
qui
/home
/lost+found
/tmp
est un rpertoire accessible par tous les utilisateurs du systme, il permet de ne pas encombrer
son rpertoire personnel par des chiers que l'on souhaite de toute manire rapidemment
dtruire ou modier.
/var/spool
/usr
contient grosso modo tout ce qui concerne les binaires utiles tous les utilisateurs et quelques
commandes d'administration. On y trouve cependant d'autres choses :
/usr/bin
contient donc les binaires disponibles pour les utilisateurs et les scripts.
/usr/X11R6
Xfree86
mentation).
/usr/include
languages.
/usr/lib
/usr/local
ou
C++
ou
tcl/tk).
on y met ce qu'on veut, mais surtout les chiers d'usage local et des logiciels
14.4
Commandes fondamentales
En gnral, les noms des commandes sont des abbrviations de mots anglais.
Par exemple
cd
signie Change Directory. A vous de faire marcher votre imagination pour dterminer le ou les
mots l'origine d'une commande.
$ info ls
$ apropos float
$ man cd
cd
$ cd /home/puiseux/sources
$ cd ~/sources
$ cd ..
$ cd
pwd
ls
(chemin relatif )
est quivalent
cd ~
O suis-je ?
$ ls -l
88
total 40
-rwxrwxr-x
-rw-rw-r--rw-rw-r--rw-rw-r-.
option
-a
1
1
1
1
puiseux
puiseux
puiseux
puiseux
puiseux
puiseux
puiseux
puiseux
pour lister aussi les chiers cachs (ceux dont le nom commence par un point).
Par exemple
$ ls -a
./
chmod
../
pour changer les droits d'un chier ou d'un rpertoire en lecture, criture ou excution.
Syntaxe
.
Exemples
: change le chier
a.out
less
$ less toto.cxx
emacs
cp
vi, nedit
...)
$ cp toto.cxx sauvegarde/toto.cxx.bak
$ cp toto.cxx sauvegarde
sauvegarde,
sous le mme
nom)
rm
$ rm toto.cxx.bak
(avec conrmation)
$ rm -f toto.cxx.bak
$ rm -r sauvegarde/
$ rm -rf sauvegarde/
mkdir
(sans conrmation)
Crer un rpertoire :
$ mkdir toto
mv
$ mv toto.cxx toto.cxx.bak
89
danger )
$ mv toto.cxx ..
locate
Retrouver un chier
$ locate toto :
casse.
which et whereis
$ which ls
/bin/ls
grep
.
reg_exp
o :
$ man perlretut
sans acher la
ligne correspondante.
Exemple :
Crer des liens entre chiers. (L'quivalent des raccourcis de windows). Syntaxe
[dest]
ou bien
ln -s source...
$ ln -s toto.cxx toto.cc
gzip
repertoire.
toto.cxx
et
toto.cc
ln -s source
Exemple.
Archivage de donnes.
version compacte.
$ tar -czvf rep.tgz rep cre une archive compacte au format gzip de tout le rpertoire
rep et la place dans le chier rep.tgz
$ tar -xzvf rep.tgz pour dtarer, i.e. extraire les chiers de l'archive et reconstituer le
rpertoire.
df du
$ df-h
Filesystem Size
/dev/sda2 99M
/dev/sdb2 8.2G
/dev/scd0 72M
ps et kill
Mounted on
/
/home
/mnt/cdrom
La gestion des processus. Si un processus (ou job) bloque ou ralentit la machine (par
exemple
mozilla
90
$ ps -u puiseux
PID TTY
TIME
16457 pts/4 00:00:00
27547 pts/4 02:19:10
30904 pts/4 00:00:00
31146 pts/4 00:00:00
$ kill -9 30904
CMD
bash
vmware
mozilla-bin
ps
14.5
|
Les pipes : pour chaner plusieurs commandes, la sortie de l'une tant l'entre de la suivante
$ ls | less
$ cat toto | sort
> >>
$ ls > list.txt
: le chier
list.txt
df
la suite du chier
ls.
list.txt
$ toto&
14.6
toto
TP1
(ls)
essai.
(ls)
.bashrc (less)
ls)
fic1, fic2
et
fic3 (touch)
8. Revenir dans le rpertoire principal. Vriez que vous y tes. Crer un rpertoire
contenant 4 chiers vides
9. Revenir dans votre home directory. Taper les commandes ls, puis
et enn
ls *.
liste1. (>)
liste1
2 Si
ls
liste1
en chier
liste2.
exemple
ls exemple, ls exemple/fic*
liste1.
Visualiser le contenu
copie. (cp)
Vrier avec la commande
ls.
l'cran graphique est gel, il est possible de passer en mode non graphique : Ctl+Alt+F1. Puis se connecter
91
liste2
liste2
dans le rpertoire
liste2
exemple.
dans le rpertoire
du rpertoire
Vrier.
exemple
essai
. Vrier le rsultat.
dans
essai. (touch)
exemple
essai.
exemple
et son contenu.
bin, lib
et
include.
suite et vous permettront de mettre des excutables (bin), vos librairies (lib) ou des chiers
include (include).
20. Trouver un chier dans votre home directory contenant le mot 'alias'. (grep)
21. Trouver tous les chiers de votre ordinateur dont le nom contient la chaine de caractre
'include'. (locate)
emacs,
ouvrez le chier
emacs,
copie.
emacs.(ctl c)
en background. (&)
emacs.(ps et kill)
/usr/bin.
ls /usr/bin | less
essai sous le nom essai.tgz, comparer la taille de essai/
tar, du, ls)
essai.tgz
(commandes
man ls)
? (whereis)
ls
Bibliographie
.
Ouvrages de rfrence
Le Systme Linux, Matt Welsh & Lar Kaufman, ed. O'Reilly&Associate, inc.,1999.
Linux in a nutshell, Manuel de rfrence, J.P.Hekman et l'quipe de O'Reilly&Associates,
1997.
http://linux.uhp-nancy.fr/gs-french-2.1.1/gs2/html/gs.html
http://www.linux-kheops.com/doc/bien-debuter/html/gs.html
http://www.ee.surrey.ac.uk/Teaching/Unix/index.html
92