Académique Documents
Professionnel Documents
Culture Documents
Matmeca 2014
Marc Duruflé
page 3 Aide-mémoire C++ par Marc Duruflé
1 Commentaires 5
2 Types prédéfinis 5
2.1 Types de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2 Qualificatifs additionnels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3 Pointeurs et références 7
4 Tableaux en C 8
4.1 Tableau statique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
4.2 Tableau dynamique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
4.3 Tableau à plusieurs entrées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
5 Structures, énumérations 9
6 Fonctions 10
6.1 Surcharge de fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
6.2 Passage par référence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
6.3 Passage par pointeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
6.4 Pointeurs et références de fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
6.5 La fonction main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
7 Variables 15
8 Structures de contrôle 17
8.1 Opérateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
8.2 Structure conditionnelle if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
8.3 Structure conditionnelle switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
8.4 Boucle for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
8.5 Boucle while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
8.6 Instructions break continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
11 Entrées-sorties 34
13 Exceptions en C++ 39
page 4 Aide-mémoire C++ par Marc Duruflé
14 Utilisation de la STL 40
14.1 Fonctions mathématiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
14.2 Chaînes de caractères (string) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
14.3 Vecteurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
14.4 Listes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
14.5 Piles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
page 5 Aide-mémoire C++ par Marc Duruflé
1. Commentaires
/∗
Ceci e s t un commentaires s u r
plusieurs lignes (C e t C++) ∗/
double x = 3 . 0 ; // q u i p e u t e t r e d i s p o s e a l a s u i t e d ’ une i n s t r u c t i o n
2. Types prédéfinis
Type Description
void type vide
bool booléen
int entier (sur 4 octets)
char caractère (1 octet)
float réel simple précision (4 octets)
double réel double précision (8 octets)
unsigned int entier positif
short entier court
long entier long
int64_t entier long (sur 8 octets)
// exemple de f u n c t i o n q u i ne r e n v o i e r i e n
void affiche_reel ( double x )
{
cout << " ␣x␣=␣ " << x << endl ;
}
// l a c a s s e e s t i m p o r t a n t e , a e t A s o n t d e s c a r a c t e r e s d i f f e r e n t s
char lettre = ’A ’ ;
// l a c o r r e s p o n d a n c e c a r a c t e r e <−> nombre e s t a s s u r e e par
// l a t a b l e a s c i i , par exemple ’ 0 ’ = 48
char zero = ’ 0 ’ , zero_bis = 4 8 ;
// i l y a a u s s i d e s c a r a c t e r e s s p e c i a u x
page 6 Aide-mémoire C++ par Marc Duruflé
// \ t ( t a b u l a t i o n ) , \n ( r e t o u r c h a r i o t ) , e t c
lettre = ’ \n ’ ;
// par d e f a u t un e n t i e r ( i c i 345) e s t e c r i t en b a s e d e c i m a l e
// on p e u t e n t r e r un l i t e r a l en b a s e h e x a d e c i m a l e
// en commencant par 0 x
n = 0 xA34E ; // n = A34E en h e x a d e c i m a l
Ce type représente des nombres réels entre 1e-38 et 1e38 avec une précision de 1e-7.
// pour d e c l a r e r un l i t e r a l s i m p l e p r e c i s i o n , a j o u t e r f :
float x = 1.23 f ;
// pour d e c l a r e r un l i t e r a l d o u b l e p r e c i s i o n :
double x = 1 . 2 3 , y = −5.04 e10 ;
// a i n c l u r e pour a v o i r l e t y p e i n t 6 4 _ t
#include<s t d i n t . h>
// Par d e f a u t l e s e n t i e r s s o n t s i g n e s , pour d e c l a r e r un e n t i e r p o s i t i f :
unsigned int i = 2 3 ;
// l ’ a v a n t a g e e s t a l o r s que i p e u t a l l e r de 0 a 4 m i l l i a r d s
// l e s c a r a c t e r e s non s i g n e s e x i s t e n t a u s s i ( a l l a n t de 0 a 256)
unsigned char c = 2 3 ;
3. Pointeurs et références
Un pointeur est une variable contenant l’adresse d’une autre variable. Le contenu du pointeur q est alors
accédé par ∗ q et l’adresse d’une variable x est accédée par & x :
double x = 1 . 0 ; // x v a u t 1 . 0
double y = 2 . 0 ; // y v a u t 2 . 0
double∗ q ; // on d e c l a r e un p o i n t e u r s u r un d o u b l e
q = NULL ; // on s p e c i f i e i c i que q ne p o i n t e v e r s r i e n
q = &x ; // q p o i n t e maintenant v e r s l a v a r i a b l e x
∗q = 3 . 0 ; // x v a u t 3 . 0
q = &y ; // q p o i n t e maintenant v e r s l a v a r i a b l e y
∗q = 4 . 0 ;
// y v a u t maintenant 4 . 0
x = ∗q ;
// x v a u t maintenant 4 . 0
q = &x ; // i c i c ’ e s t t r e s d a n g e r e u x
// c a r on per d l ’ a d r e s s e r e s e r v e e au−d e s s u s
// on a a l o r s ce qu ’ on a p p e l l e une f u i t e de memoire
// on p e u t a u s s i a l l o u e r p l u s i e u r s c a s e s ( pas une s e u l e )
q = new double [ 3 ] ; // 3 c a s e s i c i
// e t a c c e d e r aux a u t r e s c a s e s a v e c [ ]
page 8 Aide-mémoire C++ par Marc Duruflé
x = q[1];
// pour l i b e r e r l a memoire , d e l e t e [ ]
delete [ ] q ;
// l e s r e f e r e n c e s p e u v e n t a u s s i e t r e u t i l i s e e s
// pour d e f i n i r d e s a l i a s ( s a n s a v o i r a e c r i r e de ∗)
double& alias_x = x ;
// t o u t changement s u r a l i a s _ x s e r e p e r c u t e r a s u r x e t v i c e v e r s a
alias_x = −1.0; // x e t a l i a s _ x v a l e n t −1
4. Tableaux en C
// on u t i l i s e l ’ o p e r a t e u r [ ] pour a c c e d e r aux e l e m e n t s du t a b l e a u
// l e s i n d i c e s commencent a 0
y [ 0 ] = 3 . 0 3 ; y [ 1 ] = −2e10 ; y [ 2 ] = 5 . 5 4 e3 ; y [ 3 ] = 2 . 0 2 e −5;
// on p e u t i n i t i a l i s e r t o u t l e t a b l e a u a v e c l e s { } :
int n [ 4 ] = { −31 , 4 3 , 3 , 1 0 } ;
// on a l l o u e l e t a b l e a u a v e c l ’ o p e r a t e u r new
double∗ x ; // x p o i n t e u r v e r s l a p r e m i e r e c a s e du t a b l e a u
x = new double [ n ] ;
// on u t i l i s e l ’ o p e r a t e u r [ ] pour a c c e d e r aux e l e m e n t s du t a b l e a u
// l e s i n d i c e s commencent a 0
x [ 0 ] = 3 . 0 3 ; x [ 1 ] = −2e10 ; x [ 2 ] = 5 . 5 4 e3 ; x [ 6 ] = 2 . 0 2 e −5;
// on d e s a l l o u e l e t a b l e a u a v e c l ’ o p e r a t e u r d e l e t e [ ]
delete [ ] x ;
page 9 Aide-mémoire C++ par Marc Duruflé
// on a c c e d e aux e l e m e n t s en e c r i v a n t A[ i ] [ j ]
cout << " ␣A [ 1 ] [ 0 ] ␣ " << A [ 1 ] [ 0 ] << endl ;
// on p e u t e c r i r e un t a b l e a u a v e c un nombre a r b i t r a i r e d ’ i n d i c e s
// par exemple pour un t a b l e a u t r i d i m e n s i o n n e l
int B [ 5 ] [ 4 ] [ 3 ] ;
B [ 2 ] [ 0 ] [ 4 ] = 3.4;
En C++, il n’y a pas d’équivalent natif aux tableaux dynamiques multidimensionnels comme il existe en
Fortran90. Toutefois il est possible de construire des vecteurs de vecteurs, avec le désavantage que ce type
de structure ne stockera pas les éléments de manière contigüe. En voici un exemple :
// pour un v e c t e u r de v e c t e u r s , on met deux e t o i l e s
// on met a u t a n t d ’ e t o i l e s qu ’ i l y a d ’ i n d i c e s
double ∗∗ V ;
// on a l l o u e l a l i s t e d e s l i g n e s :
int m = 5 ;
V = new double ∗ [ m ] ;
// e n s u i t e on a l l o u e chaque l i g n e
// chaque l i g n e p e u t a v o i r une t a i l l e d i f f e r e n t e
// e t l e s e l e m e n t s de l a s e c o n d e l i g n e ne s e r o n t pas s t o c k e s
// p h y s i q u e m e n t j u s t e a p r e s ceux de l a p r e m i e r e l i g n e ( s t o c k a g e non c o n t i g u )
int n = 7 ;
f o r ( int i = 0 ; i < m ; i++)
V [ i ] = new double [ n ] ;
// e n s u i t e on m o d i f i e un e l e m e n t de V a v e c V[ i ] [ j ]
V [0][4] = 3.0;
// on d o i t d e s a l l o u e r chaque l i g n e separement
f o r ( int i = 0 ; i < m ; i++)
delete [ ] V [ i ] ;
// p u i s d e s a l l o u e r l e t o u t
delete [ ] V ;
5. Structures, énumérations
Une structure contient plusieurs champs, c’est l’équivalent des types composés Fortran.
struct NomStructure
{
// nombre d e s i n v i t e s
int nombre_invites ;
page 10 Aide-mémoire C++ par Marc Duruflé
// t a b l e a u c o n t e n a n t l a t a i l l e d e s i n v i t e s
double∗ taille_invites ;
// nom de l ’ evenement
char∗ nom ;
};
// on d e c l a r e une v a r i a b l e de t y p e NomStructure
NomStructure repas ;
// pour m o d i f i e r l e s membres de l a s t r u c t u r e , o p e r a t e u r .
repas . nombre_invites = 1 0 ;
// on p e u t a u s s i d e c l a r e r a l a v o l e e une s t r u c t u r e
// s a n s donner de nom :
struct { double x , y ; } var ;
// e t m o d i f i e r l e s membres de l a v a r i a b l e :
var . x = 3 . 0 ; var . y = −2.0;
// on p e u t a u s s i u t i l i s e r l e mot c l e t y p e d e f
typedef struct { int i ; double x ; } NomStruct ;
// p u i s d e c l a r e r l a v a r i a b l e de t y p e NomStruct
NomStruct x ;
Une énumération permet de définir des constantes entières dans un programme et de les nommer, ce qui
rend le code plus lisible.
// par exemple on enumere t o u t e s l e s c o n d i t i o n s aux l i m i t e s
// qu ’ on s a i t t r a i t e r a v e c l e code :
enum{ DIRICHLET , NEUMANN , IMPEDANCE } ;
// c e s c o n s t a n t e s s o n t d e s e n t i e r s , qu ’ on p e u t u t i l i s e r :
int condition = NEUMANN ;
// e n s u i t e , au l i e u de f a i r e un t e s t
// i f ( c o n d i t i o n == 1 ) , on met l e nom
i f ( condition == DIRICHLET )
{
// on f a i t l e t r a i t e m e n t de l a c o n d i t i o n de D i r i c h l e t
}
6. Fonctions
Syntaxe :
type_retour nom_fonction(arg1, arg2, arg_default = value_default) ;
// on p e u t s u r c h a r g e r c e t t e f o n c t i o n pour d e s arguments d i f f e r e n t s
int Add ( int x , int y )
{
return x + y ;
}
// on d e f i n i t une p r o c e d u r e en m e t t a n t v o i d comme t y p e de r e t o u r
void test_procedure ( double x , double y )
{
// r e t u r n s e r t i c i a q u i t t e r l a p r o c e d u r e
i f ( x == y )
return ;
// l e programme c o n t i n u e r a que s i x e s t d i f f e r e n t de y
cout << " 1 / ( x−y ) ␣=␣ " << 1 . 0 / ( x−y ) << endl ;
}
// on p e u t s p e c i f i e r d e s arguments o p t i o n n e l s a l a f i n d e s arguments
// on l e u r donne une v a l e u r par d e f a u t , i c i z e s t un argument o p t i o n n e l
// s ’ i l n ’ e s t pas r e m p l i , i l v a u t 1 . 0
double Mlt ( double x , double y , double z = 1 . 0 )
{
return x∗y∗z ;
}
int main ( )
{
// pour a p p e l e r une f o n c t i o n , on e c r i t son nom a v e c l e s arguments
double x = Add ( 1 . 3 , 1 . 4 ) ;
double y = Add ( x , 0 . 4 5 , 1 . 2 3 ) ;
test_procedure ( x , y ) ;
// on p e u t a p p e l e r Mlt a v e c t r o i s arguments
double z = Mlt ( x , y , 2 . 3 ) ;
// ou a v e c deux arguments , l e d e r n i e r p r e n a n t
// l a v a l e u r par d e f a u t ( 1 . 0 i c i )
z = Mlt ( x , y ) ;
return 0 ;
page 12 Aide-mémoire C++ par Marc Duruflé
int main ( )
{
double x = 3 . 2 , y = 2 . 3 ;
double z = Add ( x , y ) ;
// x e t y v a l e n t t o u j o u r s 3 . 2 e t 2 . 3
return 0 ;
}
Pour modifier les arguments, on utilise des références, afin de passer l’adresse des arguments. Ainsi on
évite la copie locale des arguments, qui peut etre coûteuse si certaines variables sont volumineuses.
// exemple d ’ une s t r u c t u r e v o l u m i n e u s e
struct BigArray
{
double A [ 1 0 0 0 ] ;
};
// on p a s s e x e t t a b par r e f e r e n c e , i l s p e u v e n t e t r e m o d i f i e s
// de p l u s aucune c o p i e l o c a l e de t a b n ’ e s t e f f e c t u e e
void modify_argument ( double& x , BigArray& tab )
{
f o r ( int i = 0 ; i < 1 0 0 0 ; i++)
tab . A [ i ] ∗= x ;
x += 1 . 0 ;
}
int main ( )
page 13 Aide-mémoire C++ par Marc Duruflé
{
double x = 2 . 0 ;
BigArray tab ;
f o r ( int i = 0 ; i < 1 0 0 0 ; i++)
tab . A [ i ] = double ( i ) ;
modify_argument ( x , tab ) ;
// x e t t a b ont e t e m o d i f i e s
return 0 ;
}
∗x += 1 . 0 ;
}
// l e p a s s a g e par p o i n t e u r e s t n a t u r e l pour un t a b l e a u
double sum ( double∗ x , int n )
{
// on r e n v o i e l a somme d e s e l e m e n t s du t a b l e a u x
double sum = 0 . 0 ;
f o r ( int i = 0 ; i < n ; i++)
sum += x [ i ] ;
return sum ;
}
int main ( )
{
double x = 2 . 0 ;
BigArray tab ;
// on p a s s e i c i l e s a d r e s s e s d e s o b j e t s
modify_argument(&x , &tab ) ;
double∗ vec ;
int n = 1 0 ;
vec = new double [ n ] ;
// pour un t a b l e a u , on l e p a s s e d i r e c t e m e n t
// p u i s q u e c ’ e s t d e j a un p o i n t e u r
x = sum ( vec , n ) ;
page 14 Aide-mémoire C++ par Marc Duruflé
delete [ ] vec ;
return 0 ;
}
// un p o i n t e u r de f o n c t i o n s ’ e c r i t s o u s l a forme
// t y p e _ r e t o u r (∗ nom_fct ) ( arguments )
return sum ;
}
// exemple de f o n c t i o n dont on v e u t c a l c u l e r l ’ i n t e g r a l e
double func ( double x )
{
return x∗x + sin ( 0 . 5 ∗ x ) ;
}
int main ( )
{
cout << " I n t e g r a l e ␣ de ␣ exp ␣=␣ " << integrate ( 0 . 0 , 1 . 0 , 2 0 , exp ) << endl ;
cout << " I n t e g r a l e ␣ de ␣ f u n c ␣=␣ " << integrate ( 0 . 0 , 1 . 0 , 2 0 , func ) << endl ;
// on d e c l a r e un nouveau t y p e f p t r q u i e s t un p o i n t e u r de f o n c t i o n
// r e n v o y a n t un d o u b l e a v e c un d o u b l e en parametre
typedef double ( ∗ fptr ) ( double ) ;
// on d e c l a r e un t a b l e a u c o n t e n a n t t r o i s f o n c t i o n s de ce t y p e
fptr tab_fct [ 3 ] ;
// on i n i t i a l i s e l e t a b l e a u
tab_fct [ 0 ] = &exp ;
page 15 Aide-mémoire C++ par Marc Duruflé
tab_fct [ 1 ] = &func ;
tab_fct [ 2 ] = &asin ;
return 0 ;
}
7. Variables
Les variables peuvent etre déclarées à n’importe quel endroit du programme (on dit qu’elles sont déclarées
à la volée). La variable est détruite lors de la fermeture de l’accolade. Les variables globales sont déclarées
à l’extérieur de toute fonction.
// par exemple on d e c l a r e une v a r i a b l e g l o b a l e
int Nglob = 1 0 ;
// e l l e s e r a connue dans t o u t e s l e s f o n c t i o n s q u i s u i v e n t
void f ( double x )
{
cout << " Nglob ␣=␣ " << Nglob << endl ;
}
void g ( double y )
{
page 16 Aide-mémoire C++ par Marc Duruflé
double z = 2 . 0 ∗ y ;
f o r ( int i = 0 ; i < Nglob ; i++)
z ∗= double ( i +1);
// on p e u t a u s s i d e c l a r e r d e s v a r i a b l e l o c a l e s a l a f o n c t i o n g
double w = −5.43 + z ;
// t o u t e s l e s v a r i a b l e s l o c a l e s ( i c i w e t z ) s o n t d e t r u i t e s a l a f e r m e t u r e
// de l ’ a c c o l a d e
}
// i c i w e t z ne s o n t pas connues
w = 3 . 0 ; // e r r e u r de c o m p i l a t i o n
// on p e u t a u s s i d e c l a r e r d e s v a r i a b l e s c o n s t a n t e s , dont on
// ne p e u t m o d i f i e r l a v a l e u r a p r e s i n i t i a l i s a t i o n
const double epsilon = 1e −10;
epsilon = 3 . 0 ; // e r r e u r de c o m p i l a t i o n
page 17 Aide-mémoire C++ par Marc Duruflé
8. Structures de contrôle
8.1. Opérateurs
() opérateur d’accès
[] opérateur d’accès
. membre d’un objet ou structure
-> raccourci pour (*pointeur).
! opérateur non
˜ non bit à bit
++ incrémentation (i + + est équivalent à i = i + 1)
−− décrémentation (i − − est équivalent à i = i − 1)
∗ cible d’un pointeur ou multiplication
& référence
/ division
− opposé d’un nombre ou soustraction
+ addition de deux nombres
% modulo (a%b équivaut à mod(a, b) en Fortran)
<< flux de sortie ou décalage de bit
>> flux d’entrée ou décalage de bit
< signe strictement inférieur
> signe strictement supérieur
<= signe inférieur ou égal
>= signe supérieur ou égal
== signe égal (pour la comparaison)
! = signe différent
& et bit à bit
ˆ ou exclusif bit à bit
| ou bit à bit
&& et logique
|| ou logique
?: structure if/else compacte
= affectation
∗ = a∗ = b équivaut à a = a ∗ b
+ = a+ = b équivaut à a = a + b
/ = a/ = b équivaut à a = a/b
% = a% = b équivaut à a = a%b
− = a− = b équivaut à a = a − b
ˆ= aˆ= b équivaut à a = aˆb
& = a& = b équivaut à a = a&b
| = a| = b équivaut à a = a|b
On notera qu’il n’y a pas d’opérateur puissance (comme ** en Fortran), il faut utiliser la fonction pow
(dans le package cmath). Voici un exemple d’utilisation de ces opérateurs.
// on s u p p o s e qu ’ un o b j e t m a t r i c e e s t c r e e a v e c une s u r c h a r g e de l ’ o p e r a t e u r ( )
// on p e u t u t i l i s e r A( i , j ) pour m o d i f i e r un e l e m e n t de l a m a t r i c e
Matrice A ;
A (0 , 3) = 2 . 3 ;
// l ’ o p e r a t e u r [ ] e s t u t i l i s e pour l e s t a b l e a u x , v e c t e u r s , e t c
vector<double> v ;
v [ 0 ] = 1 . 2 e10 ;
page 18 Aide-mémoire C++ par Marc Duruflé
// on p e u t d e c l a r e r un p o i n t e u r s u r une m a t r i c e
// on s u p p o s e que l ’ o b j e t M a t r i c e c o n t i e n t une f o n c t i o n GetM ( )
Matrice ∗ B ;
// on p e u t f a i r e p o i n t e r B s u r A
B = &A ;
// e t a p p e l e r GetM ( ) s o i t a v e c ∗ , s o i t a v e c −>
int n = ( ∗ B ) . GetM ( ) ;
n = B−>GetM ( ) ;
// && : e t l o g i q u e , | | : ou l o g i q u e
i f ( ( ( i==3) | | ( i == 7 ) ) && ( i <= 5 ) )
{
// i c i s e u l i = 3 d e v r a i t p a s s e r l a c o n d i t i o n
}
// != e s t l ’ o p e r a t e u r d i f f e r e n t
i f ( ( i != 3 ) && ( i >= 2 ) )
{
// i p e u t e t r e e g a l a 2 ou s u p e r i e u r ou e g a l a 4
}
// ++ a gauche s i g n i f i e qu ’ on i n c r e m e n t e a v a n t d ’ u t i l i s e r l e r e s u l t a t
// ++ a d r o i t e s i g n i f i e qu ’ on u t i l i s e d ’ abord l e r e s u l t a t a v a n t d ’ i n c r e m e n t e r
v[++i ] = 3 . 4 ; // e q u i v a u t a i = i +1; v [ i ] = 3 . 4 ;
v [ i++] = 3 . 4 ; // e q u i v a u t a v [ i ] = 3 . 4 ; i = i +1;
// idem pour l a d e c r e m e n t a t i o n −−
v [ i−−] = 3 . 4 ; // e q u i v a u t a v [ i ] = 3 . 4 ; i = i −1;
// on p e u t f a i r e l e s o p e r a t i o n s c l a s s i q u e s
// par exemple i c i y = ( x + 2 . 0 ) ∗ 3 . 0 − 1 . 0 / x ;
double x = 1 . 2 , y = 0 . 8 ;
y = (x + 2.0)∗3.0 − 1.0/ x ;
// ~ : non b i t a b i t
// par exemple ~(00000001011) = 1111110100 s o i t −12 en d e c i m a l
i = ~ 1 1 ; // d e v r a i t f a i r e i = −12
// & : e t b i t a b i t , e t | : ou b i t a b i t , ^ : ou e x c l u s i f
i = 6 | 1 2 ; // d e v r a i t f a i r e 0110 | 1100 = 1110 ( i =14)
i = 6 & 1 2 ; // d e v r a i t f a i r e 0110 & 1100 = 0100 ( i =4)
page 19 Aide-mémoire C++ par Marc Duruflé
// ? : pour un i f e l s e compact
x = ( i >= 3 ) ? 1 . 2 3 : 0 . 4 ;
// e q u i v a u t a i f ( i>= 3) { x = 1 . 2 3 ; } e l s e { x = 0 . 4 ; }
// s i n o n on met d e s a c c o l a d e s
double x ;
i f ( i == 3 )
{
x = 0.45;
cout << " i ␣ vaut ␣ 3 " << endl ;
}
e l s e i f ( i == 5 )
{
x = 0.52;
cout << " i ␣ vaut ␣ 5 " << endl ;
}
else
{
x = −0.2;
cout << " i ␣ e s t ␣ d i f f e r e n t ␣ de ␣3 ␣ e t ␣ de ␣ 5 " << endl ;
}
// m e t t r e b r e a k a l a f i n ( o b l i g a t o i r e )
break ;
case ’ b ’ :
case ’ c ’ :
case ’ d ’ :
// i c i l e t t r e v a u t b c ou d
cout << " ␣ l e t t r e ␣=␣b␣ c ␣ou␣d" << endl ;
break ;
default :
// l e s a u t r e s c a s non t r a i t e s
cout << " l e t t r e ␣ i n c o n n u e " << endl ;
}
// sum d e v r a i t e t r e e g a l e a 45
// l o r s q u ’ i l y a p l u s i e u r s i n s t r u c t i o n s , on met d e s a c c o l a d e s
// i c i on decremente i par pas de 2
f o r ( int i = 1 0 ; i >= 0 ; i −= 2 )
{
// on d o i t o b t e n i r i = 10 , 8 , 6 , 4 , 2 , 0
cout << " i ␣=␣ " << i << endl ;
sum −= i ;
}
Exemple :
// dans un p r e m i e r c a s on t e s t e l a c o n d i t i o n a v a n t
// d ’ e f f e c t u e r l ’ o p e r a t i o n
int i = 0 ;
while ( i < 1 0 )
i++;
page 21 Aide-mémoire C++ par Marc Duruflé
// t o u t e s l e s l i g n e s q u i s u i v e n t ne s e r o n t pas
// e x e c u t e e s pour i = 0 , mais l e s e r o n t pour i > 0
cout << " i ␣=␣ " << i << endl ;
}
// b r e a k s o r t de l a b o u c l e
f o r ( int i = 0 ; i < 1 0 ; i++)
{
i f ( i == 5 )
break ;
// i c i a c a u s e du break , on s o r t de l a b o u c l e
// pour i = 5 , l e s v a l e u r s 6 , 7 , 8 , 9 ne s e r o n t
// j a m a i s p a r c o u r u e s
}
protected :
// t o u s l e s membres p l a c e s a p r e s s o n t ‘ ‘ p r o t e g e s ’ ’
int jp ;
void CheckProtected ( )
{
cout << " c l a s s e ␣ ok " << endl ;
}
public :
// t o u s l e s membres p l a c e s a p r e s s o n t p u b l i c s
int kp ;
void CheckPublic ( )
{
cout << " c l a s s e ␣ ok " << endl ;
}
// on p e u t i n s e r e r a t o u t moment l e mot c l e
// p r i v a t e p u b l i c ou p r o t e c t e d pour s p e c i f i e r l e t y p e d e s membres q u i s u i v e n t
private :
int ip2 ;
};
int main ( )
{
// dans une f o n c t i o n e x t e r i e u r e a l a c l a s s e
// on n ’ a a c c e s qu ’ aux donnees p u b l i q u e s
NomClasse var ;
var . CheckPublic ( ) ; // OK
var . kp = 3 ; // OK
return 0 ;
}
9.2. Héritage
Trois types d’héritage (public, private, protected), voici comment les types de données des attributs de
la classe mère sont transformés après héritage :
Données héritage public héritage protected héritage private
public public protected private
protected protected protected private
private interdit interdit interdit
Exemple
page 23 Aide-mémoire C++ par Marc Duruflé
// c l a s s e mere
c l a s s Mother
{
// donnees p r i v e e s
private :
int i_private ;
// donnees p r o t e g e e s
protected :
int i_protected ;
// donnees p u b l i q u e s
public :
int i_public ;
};
// s a u f l e s donnees p r i v e e s
i_private = 0 ; // e r r e u r de c o m p i l a t i o n
}
};
// pour un h e r i t a g e p r o t e g e
c l a s s Fille : protected Mother
{
};
c l a s s Father
{
public :
int j_public ;
};
// on p e u t f a i r e a u s s i un h e r i t a g e m u l t i p l e
c l a s s Fils : public Mother , public Father
{
};
int ip ;
// f o n c t i o n amie
friend void affiche_ip ( const Mother &);
// c l a s s e amie
friend c l a s s Amie ;
};
// pour l e s c l a s s e s amies :
c l a s s Amie
{
public :
// l e s methodes ont a c c e s aux donnees p r i v e e s de Mother
void ChangeIp ( Mother & var , int j )
{
var . ip = j ;
}
};
int main ( )
{
Mother var ;
Amie a ;
a . ChangeIp ( var , 3 ) ;
affiche_ip ( var ) ;
}
// l e s c o n s t r u c t e u r s e t d e s t r u c t e u r s s o n t p u b l i c s
public :
// un c o n s t r u c t e u r n ’ a pas de t y p e de r e t o u r
// e t a l e meme nom que l a c l a s s e
Base ( )
{
// un c o n s t r u c t e u r s e r t a i n i t i a l i s e r l e s a t t r i b u t s
i = 0;
x = 1.0;
page 25 Aide-mémoire C++ par Marc Duruflé
// deuxieme c o n s t r u c t e u r
Base ( int j , double y )
{
i = j;
x = y;
}
// c o n s t r u c t e u r par c o p i e
Base ( const Base& var )
{
i = var . i ;
x = var . x ;
}
// un s e u l d e s t r u c t e u r p o s s i b l e
~Base ( )
{
// un d e s t r u c t e u r s e r t a l i b e r e r l a memoire u t i l i s e e par l ’ o b j e t
// i c i pas de t a b l e a u a d e t r u i r e
}
};
public :
// on a p p e l l e l e c o n s t r u c t e u r de l a c l a s s e mere
// e t l e s c o n s t r u c t e u r s d e s a t t r i b u t s
Daughter ( double z ) : Base ( ) , y ( z ) {}
// pour e v i t e r l e s c o n v e r s i o n s i m p l i c i t e s , mot c l e e x p l i c i t
e x p l i c i t Daughter ( int j ) : Base ( )
{
y = 0.0;
}
// pas b e s o i n de d e c l a r e r l e d e s t r u c t e u r
// l e d e s t r u c t e u r par d e f a u t e s t i m p l i c i t e e t ne f a i t r i e n
};
int main ( )
{
page 26 Aide-mémoire C++ par Marc Duruflé
// d e s qu ’ on d e c l a r e un o b j e t , un c o n s t r u c t e u r s e r a a p p e l e
// s i pas d ’ argument comme i c i , l e c o n s t r u c t e u r par d e f a u t Base ( ) e s t a p p e l e
Base b ;
// a p p e l du second c o n s t r u c t e u r de Base
Base a ( 4 , 5 . 0 ) ;
// a p p e l du c o n s t r u c t e u r par c o p i e ( e q u i v a l e n t a i n i t i a l i s e r c = a )
Base c ( a ) ;
// on p e u t a u s s i a p p e l e r un c o n s t r u c t e u r a p r e s l a d e c l a r a t i o n
b = Base ( 6 , − 2 . 0 ) ;
Daughter z ; // e r r e u r a l a c o m p i l a t i o n
// c a r l e c o n s t r u c t e u r par d e f a u t n ’ a pas e t e d e f i n i
Daughter w ( 2 , 5 . 2 3 , 0 . 4 3 ) ; // ok
// l o r s de l ’ a c c o l a d e fermante , l e s d e s t r u c t e u r s s e r o n t a p p e l e s
return 0 ;
}
9.5. Pointeur this
C’est un pointeur vers l’objet instancié.
c l a s s Base ;
c l a s s Base
{
public :
int ip ;
};
int main ( )
{
Base var ;
var . ModifieIp ( 4 ) ;
// i l a u r a i t e t e e q u i v a l e n t de f a i r e
// v a r . S e t I p ( 4 ) ; a f f i c h e _ o b j e t ( v a r ) ;
return 0 ;
}
// a t t r i b u t s s t a t i q u e s p r e c e d e s par l e mot c l e s t a t i c
s t a t i c int jp ;
s t a t i c double y ;
// methodes dynamiques
void SetIp ( int j )
{
ip = j ;
}
ip = 0 ; // i n t e r d i t , e r r e u r de c o m p i l a t i o n
SetIp ( 3 ) ; // i n t e r d i t , e r r e u r de c o m p i l a t i o n
jp = 3 ; // o u i on a l e d r o i t
}
};
// d e c l a r a t i o n o b l i g a t o i r e d e s a t t r i b u t s s t a t i q u e s a l ’ e x t e r i e u r de l a c l a s s e
int Exemple : : jp ( 3 ) ;
double Exemple : : y ( 2 . 0 3 ) ;
page 28 Aide-mémoire C++ par Marc Duruflé
int main ( )
{
// pour m o d i f i e r un membre s t a t i q u e
Exemple : : jp = −10;
Exemple : : y = −0.45;
// pour a p p e l e r une f o n c t i o n s t a t i q u e
Exemple : : DisplayInfoClass ( ) ;
return 0 ;
}
// on p e u t d e f i n i r d e s f o n c t i o n s v i r t u e l l e s
// q u i s e r o n t s u r c h a r g e e s dans l e s c l a s s e s d e r i v e e s
v i r t u a l void Draw ( )
{
// ne f a i t r i e n , on s a i t pas comment d e s s i n e r une forme g e n e r a l e
cout << "Methode␣ i n d e f i n i e " << endl ;
}
// on p e u t d e c l a r e r d e s methodes v i r t u e l l e s p u r e s
// qu ’ on a pas b e s o i n de d e t a i l l e r , c a r on c o n s i d e r e
// qu ’ e l l e ne s e r o n t j a m a i s a p p e l e e s
v i r t u a l int GetNombrePoints ( ) = 0 ;
int n = GetNombrePoints ( ) ;
cout << " ␣Nombre␣ de ␣ p o i n t s ␣ de ␣ l a ␣ forme ␣=␣ " << n << endl ;
}
};
{
public :
// on s u r c h a r g e l e s f o n c t i o n s v i r t u e l l e s de Forme
int GetNombrePoints ( )
{
return 4 ;
}
void Draw ( )
{
cout << "−−−" << endl ;
cout << " | ␣ | " << endl ;
cout << "−−−" << endl ;
}
};
void Draw ( )
{
cout << " / | " << endl ;
cout << "−−" << endl ;
}
};
int main ( )
{
Forme b ; // e r r e u r de c o m p i l a t i o n c a r l a c l a s s e e s t a b s t r a i t e
// ( a b s t r a i t e = c o n t i e n t une methode v i r t u e l l e pure )
Carre quad ;
Triangle tri ;
// l e s f o n c t i o n s Draw ( ) e t GetNombrePoints ( ) du T r i a n g l e s e r o n t a p p e l e e s
tri . AnalyseDessin ( ) ;
// on p e u t a u s s i c r e e r un o b j e t p o l y m o r p h i q u e
// ( q u i pourra e t r e un t r i a n g l e ou un c a r r e )
Forme ∗ forme ;
page 30 Aide-mémoire C++ par Marc Duruflé
// i c i c ’ e s t un c a r r e
forme = new Carre ( ) ;
delete forme ;
// e t maintenant un t r i a n g l e
forme = new Triangle ( ) ;
}
public :
// on s u r c h a r g e dans l a c l a s s e t o u s l e s o p e r a t e u r s i n t e r n e s
// o p e r a t e u r =
Vector& operator=(const Vector& v )
{
f o r ( int i = 0 ; i < m ; i++)
data [ i ] = v ( i ) ;
return ∗ t h i s ;
}
// o p e r a t e u r d ’ a c c e s ( )
double operator ( ) ( int i ) const ;
// i c i c ’ e s t l ’ o p e r a t e u r d ’ a c c e s q u i p e u t e t r e u t i l i s e pour V( i ) = c t e ;
double& operator ( ) ( int i ) ;
// l ’ o p e r a t e u r d ’ a c c e s ( ) p e u t e t r e s u r c h a r g e
// pour un nombre q u e l c o n q u e d ’ arguments (V( i , j ) = q u e l q u e c h o s e )
double& operator ( ) ( int i , int j ) ;
// o p e r a t e u r s += ∗= −=
Vector & operator +=(const Vector& v ) ;
Vector & operator ∗=(const Vector& v ) ;
Vector & operator −=(const Vector& v ) ;
// o p e r a t e u r de pre−i n c r e m e n t ++v
Vector & operator ++(void ) ;
page 31 Aide-mémoire C++ par Marc Duruflé
// o p e r a t e u r de p o s t −i n c r e m e n t v++
Vector operator ++(int ) ;
// o p e r a t e u r s de comparaison
bool operator ==(const Vector&) const ;
bool operator !=( const Vector&) const ;
bool operator <=(const Vector&) const ;
bool operator >=(const Vector&) const ;
bool operator <(const Vector&) const ;
bool operator >(const Vector&) const ;
};
// on p e u t g e r e r l e c a s m i x t e Vector / d o u b l e
Vector operator ∗ ( const double&, const Vector &);
Vector operator ∗ ( const Vector &, const double &);
// e n s u i t e dans l e main , on p e u t u t i l i s e r c e s s u r c h a r g e s
int main ( )
{
Vector x , y , z ;
z = 2.0∗ x + y ;
++x ;
x(0) = 3 .0;
// . . .
return 0 ;
}
10. Structure d’un code
En dispose les déclarations des fonctions et classes (appelées prototypes) dans des fichiers d’en-tête
(headers) dont l’extension se termine par .hpp, .H, .h++ ou .hxx. Les définitions sont elles placées dans des
fichiers .cpp, .C, .cxx, .c++ ou .cc.
// p a r f o i s deux c l a s s e s s o n t e n t r e l a c e e s , i l e s t a l o r s u t i l e
// de d e c l a r e r l ’ e x i s t e n c e d ’ une c l a s s e , a v a n t de l a d e t a i l l e r p l u s l o i n :
c l a s s MaClasse ;
page 32 Aide-mémoire C++ par Marc Duruflé
// on p e u t a l o r s d e c l a r e r d e s p r o t o t y p e s de f o n c t i o n s
// a v e c MaClasse en argument
void FunctionClasse ( const MaClasse &);
// exemple de p r o t o t y p e d ’ une c l a s s e
c l a s s MaClasse
{
public :
int n ;
double x ;
};
// l e f i c h i e r i o s t r e a m . h s e r a d i r e c t e m e n t i n s e r e dans l e f i c h i e r
// pour un f i c h i e r p e r s o n n e l , on met d e s g u i l l e m e n t s
#include " MonFichier . hxx"
// pour e v i t e r l e s m u l t i p l e s i n c l u s i o n s , l e s f i c h i e r s comportent
// t o u j o u r s d e s l i g n e s de ce t y p e :
#i f n d e f FILE_MON_FICHIER_HEADER_HXX
#define FILE_MON_FICHIER_HEADER_HXX
// l ’ i d e n t i f i c a t e u r i c i d o i t e t r e u n i q u e parmi t o u s l e s f i c h i e r s i n c l u s
// l e f a i t de m e t t r e ce d e f i n e empeche une s e c o n d e i n c l u s i o n du meme f i c h i e r
// p u i s q u e FILE_MON_FICHIER_HEADER_HXX s e r a a l o r s d e f i n i
// on met i c i t o u t l e contenu du f i c h i e r
c l a s s Patati
{};
page 33 Aide-mémoire C++ par Marc Duruflé
// e t on t e r m i n e par e n d i f
#endif
// l a n o t i o n de f l a g s e s t s o u v e n t u t i l i s e e , ce s o n t
// d e s i n d i c a t e u r s qu ’ on p e u t d e f i n i r l o r s de l a c o m p i l a t i o n
// ( o p t i o n −Dnom_flag )
// Par exemple s i on v e u t s p e c i f i e r dans l e code que
// l a l i b r a i r i e B l a s e s t u t i l i s e e , on va c o m p i l e r :
// g++ −DUSE_BLAS t o t o . cc − l b l a s
// e t dans l e f i c h i e r t o t o . cc , on va t r a i t e r d i f f e r e m m e n t l e c a s
// ou on p e u t u t i l i s e r Blas , e t l e c a s ou on ne p e u t pas
#i f d e f USE_BLAS
// p a r t i e du code q u i ne s e r a a c t i v e e que s i l e f l a g USE_BLAS e s t d e f i n i
// ( s o i t l o r s de l a c o m p i l a t i o n s o i t par une d i r e c t i v e #d e f i n e )
// par exemple on u t i l i s e une r o u t i n e b l a s pour a d d i t i o n n e r deux v e c t e u r s
daxpy_ ( n , alpha , x , 1 , y , 1 ) ;
#e l s e
#endif
// pour a c t i v e r manuellement un f l a g
#define USE_BLAS
// pour d e s a c t i v e r l e f l a g :
#undef USE_BLAS
// on p e u t t e s t e r a u s s i que l e f l a g e s t non a c t i f
#i f n d e f USE_BLAS
// dans ce cas , on a pas B l a s
#endif
// l e s #d e f i n e p e r m e t t e n t a u s s i de d e f i n i r d e s macros
// par exemple l a macro DISP
// permet d ’ a f f i c h e r l e nom e t contenu d ’ une v a r i a b l e :
#define DISP ( x ) s t d : : c o u t << #x " : ␣ " << x << s t d : : e n d l
// on p e u t a l o r s u t i l i s e r DISP p a r t o u t , e t l e remplacement s e r a e f f e c t u e
// par l e p r e p r o c e s s e u r
DISP ( x ) ; // s e r a r e m p l a c e par s t d : : c o u t << " x : " << x << s t d : : e n d l ;
page 34 Aide-mémoire C++ par Marc Duruflé
c l a s s MaClasse
{
public :
double x ;
};
} // f i n du namespace
// e n s u i t e s i on v e u t u t i l i s e r une f o n c t i o n du namespace ,
// s o i t on f a i t N o m L i b r a i r i e : :
void f ( )
{
NomLibrairie : : Fonc1 ( 2 . 0 ) ;
}
// s o i t on u t i l i s e l a commande u s i n g , e t on a pas b e s o i n de
// m e t t r e N o m L i b r a i r i e : :
using namespace NomLibrairie ;
int main ( )
{
Fonc1 ( 2 . 0 ) ;
return 0 ;
}
11. Entrées-sorties
Exemple :
// i o s t r e a m pour l e s e n t r e e s s o r t i e s s t a n d a r d
#include <i o s t r e a m >
// f s t r e a m pour l e s f i c h i e r s
#include <f s t r e a m >
int main ( )
{
// c o u t pour l e f l u x de s o r t i e a l ’ ecran
// c e r r pour l e f l u x d e s e r r e u r s
// e n d l e s t un r e t o u r c h a r i o t a v e c v i d a g e du b u f f e r
cout << "Coucou␣ " << endl ;
// c i n pour l e f l u x d ’ e n t r e e au c l a v i e r
int test_input ; double x ;
cout << " Entre z ␣un␣ e n t i e r ␣ s u i v i ␣d␣un␣ f l o t t a n t " << endl ;
cin >> test_input >> x ;
// par d e f a u t , c o u t a f f i c h e 5 c h i f f r e s s i g n i f i c a t i f s
// on p e u t en m e t t r e p l u s a v e c p r e c i s i o n
cout . precision ( 1 5 ) ; // i c i 15 c h i f f r e s s i g n i f i c a t i f s
cout << "x␣=␣ " << x << endl ;
// pour e c r i r e dans un f i c h i e r : o f s t r e a m
ofstream file_out ( " s o r t i e . dat " ) ; // on e c r i t dans s o r t i e . d a t
// une f o i s l e s e c r i t u r e s t e r m i n e e s :
file_out . close ( ) ;
// pour l i r e dans un f i c h i e r i f s t r e a m
ifstream file_in ( " e n t r e e . dat " ) ; // on l i t dans e n t r e e . d a t
// p r e m i e r e c h o s e a f a i r e : v e r i f i e r que l e f i c h i e r e s t o u v e r t
i f ( ! file_in . is_open ( ) )
{
cout << " I m p o s s i b l e ␣ de ␣ l i r e ␣ l e ␣ f i c h i e r ␣ e n t r e e . dat " << endl ;
abort ( ) ; // a b o r t q u i t t e l e programme , p r a t i q u e pour d e b u g g u e r
}
// e n s u i t e on p e u t l i r e une donnee
file_in >> x ;
// on p e u t v e r i f i e r s i l a l e c t u r e de c e t t e donnee a marche
i f ( ! file_in . good ( ) )
{
// un e c h e c p e u t v e n i r d ’ une mauvaise donnee
// ( par exemple s i i l y a un mot au l i e u d ’ un nombre )
cout << " Echec ␣ de ␣ l e c t u r e " << endl ;
abort ( ) ;
}
// on ferme l e f l u x une f o i s t e r m i n e
file_in . close ( ) ;
// on p e u t o u v r i r un a u t r e f i c h i e r a v e c l a methode open
page 36 Aide-mémoire C++ par Marc Duruflé
// pour l i r e / e c r i r e en b i n a i r e on u t i l i s e w r i t e e t re ad
file_out . open ( " b i n a r y . dat " ) ;
// w r i t e demande d e s char , donc on c o n v e r t i t t o u t en char ∗
file_out . write ( reinterpret_cast<char∗>(&x ) , s i z e o f ( double ) ) ;
file_out . close ( ) ;
return 0 ;
}
return norm ;
}
// on p e u t a v o i r p l u s i e u r s t y p e s g e n e r i q u e s
template<c l a s s Matrix , c l a s s Vector1 , c l a s s Vector2>
void MltAdd ( const Matrix& A , const Vector1& x , Vector2& y )
{
// . . .
}
int main ( )
{
// l e s f o n c t i o n s s ’ u t i l i s e n t normalement
vector<double> x ;
cout << Norm ( x ) << endl ;
// pour l e s v e c t e u r s c o m p l e x e s
vector<complex<double> > xc ;
cout << Norm ( xc ) << endl ;
page 37 Aide-mémoire C++ par Marc Duruflé
}
Exemple de classes génériques
// exemple d ’ une c l a s s e v e c t e u r
// T p e u t e t r e un i n t , d o u b l e , char , s t r i n g , e t c
template<c l a s s T>
c l a s s Vector
{
protected :
// donnees
T∗ data ;
int m ;
public :
int GetSize ( )
{
return m ;
}
};
// on p e u t m e t t r e p l u s i e u r s p a r a m e t r e s
template<c l a s s T , c l a s s Prop>
c l a s s Base
{
public :
// d e c l a r e r d e s f o n c t i o n s normales
void FoncNormale ( double , double ) ;
// e t d e s f o n c t i o n s t e m p l a t e
template<c l a s s Vector>
void FoncGeneric ( double , Vector &);
};
// d e f i n i t i o n d e s f o n c t i o n s a l ’ e x t e r i e u r de l a c l a s s e
template<c l a s s T , c l a s s Prop>
void Base<T , Prop > : : FoncNormale ( double x , double y )
{
}
// pour l a f o n c t i o n t e m p l a t e , on a en p r e m i e r l e s p a r a m e t r e s
// t e m p l a t e de l a c l a s s e p u i s ceux de l a f o n c t i o n
template<c l a s s T , c l a s s Prop> template<c l a s s Vector>
void Base<T , Prop > : : FoncGeneric ( double x , Vector& y )
{
}
// on p e u t e n s u i t e f a i r e une s p e c i a l i s a t i o n p a r t i e l l e de l a c l a s s e
// l a c l a s s e a i n s i d e f i n i e r e m p l a c e r a completement l a c l a s s e
// g e n e r i q u e pour l e j e u de p a r a m e t r e s c h o i s i
template<c l a s s Prop>
c l a s s Base<int , Prop>
page 38 Aide-mémoire C++ par Marc Duruflé
{
public :
};
// on p e u t f a i r e une s p e c i a l i s a t i o n t o t a l e
template<>
c l a s s Base<int , double>
{
};
int main ( )
{
// l o r s de l ’ i n s t a n c i a t i o n , i l f a u t p r e c i s e r l e t y p e d e s p a r a m e t r e s
Vector<int> v ;
// i c i l e c o m p i l a t e u r c h o i s i r a l a c l a s s e Base g e n e r i q u e
Base<string , int> A ;
// i c i l e c o m p i l a t e u r c h o i s i r a l a c l a s s e Base s p e c i a l i s e e p a r t i e l l e m e n t
Base<int , string> B ;
// i c i l e c o m p i l a t e u r c h o i s i r a l a c l a s s e s p e c i a l i s e e t o t a l e m e n t
Base<int , double> C ;
}
Les paramètres template peuvent être introduits par le mot-clé typename (au lieu de class), et on peut
aussi utiliser des constantes dont on connaitra la valeur à la compilation.
// i c i m d e s i g n e l a t a i l l e du v e c t e u r
// m e s t connu a l a c o m p i l a t i o n , ce q u i permet de p o u v o i r e c r i r e
// d e s a l g o s o p t i m i s e s ( meta−programing )
template<typename T , int m>
c l a s s TinyVector
{
// comme m e s t connu a l a c o m p i l a t i o n , on p e u t
// u t i l i s e r d e s t a b l e a u x s t a t i q u e s
T data [ m ] ;
public :
T operator ( ) ( int i )
{
return data [ i ] ;
}
};
int main ( )
{
// dans l e main , on d o i t p r e c i s e r l a t a i l l e
TinyVector<double , 3> y ;
}
page 39 Aide-mémoire C++ par Marc Duruflé
// c o n s t r u c t e u r p r e n a n t un commentaire en argument
MonException ( const string& c ) : comment ( c ) {}
};
int main ( )
{
try
{
// on met i c i l e code qu ’ on v e u t e x e c u t e r
// s i a un moment on a une e r r e u r , on p e u t l a n c e r une e x c e p t i o n
MonException a ( ‘ ‘ Argument invalide ’ ’ ) ;
throw a ;
// une e x c e p t i o n p e u t e t r e de n ’ i m p o r t e q u e l t y p e
// par exemple un e n t i e r
int b = 3 ;
throw b ;
}
catch ( MonException& err )
{
// c a s ou une e x c e p t i o n de t y p e MonException a e t e l a n c e e
// on f a i t l e t r a i t e m e n t a s s o c i e e a c e t t e e x c p e t i o n
}
catch ( int a )
{
// c a s ou une e x c e p t i o n de t y p e e n t i e r a e t e l a n c e e
}
catch ( . . . )
{
// t o u t e s l e s a u t r e s e x c e p t i o n s
// on p e u t a p p e l e r a b o r t par exemple s i on ne s a i t pas g e r e r
// ce c a s l a
abort ( ) ;
}
return 0 ;
}
page 40 Aide-mémoire C++ par Marc Duruflé
int main ( )
{
// c a l c u l de x^y
double x = 2 . 3 , y = 0 . 8 ;
double z = pow ( x , y ) ;
// s q r t : r a c i n e c a r r e e
// exp : e x p o n e n t i e l l e
// l o g : l o g a r i t h m e n e p e r i e n
// l o g 1 0 : l o g a r i t h m e en b a s e 10
// l o g 2 : l o g a r i t h m e en b a s e 2
// s i n , cos , tan : f o n c t i o n s t r i g o s u s u e l l e s
// a s i n , acos , atan : l e s a r c cos , s i n e t tan
// s i n h , cosh , tanh , a s in h , acos , atanh : l e s cos , s i n , e t c h y p e r b o l i q u e s
// tgamma : f o n c t i o n gamma
z = asin ( x ) ;
// a r r o n d i au p l u s p r o c h e
// i c i on c o n v e r t i t en e n t i e r p a r c e que round r e n v o i e un r e e l
int n = int ( round ( z ) ) ;
// a r r o n d i i n f e r i e u r
n = int ( floor ( z ) ) ;
// a r r o n d i s u p e r i e u r
n = int ( ceil ( z ) ) ;
// d ’ a u t r e s f o n c t i o n s e x i s t e n t
}
// pour c o n v e r t i r un nombre en s t r i n g
template<typename T>
i n l i n e std : : string to_str ( const T& input )
page 41 Aide-mémoire C++ par Marc Duruflé
{
std : : ostringstream output ;
output << input ;
return output . str ( ) ;
}
// pour c o n v e r t i r un s t r i n g en nombre
template <c l a s s T>
i n l i n e T to_num ( std : : string s )
{
T num ;
std : : istringstream str ( s ) ;
str >> num ;
return num ;
}
int main ( )
{
// pour m a n i p u l e r l e s c h a i n e s de c a r a c t e r e s , ne pas u t i l i s e r c har ∗ (C)
// mais p l u t o t d e s s t r i n g
string s ( " t o t o " ) ;
// nombre de c a r a c t e r e s : s i z e ( )
cout << "nombre␣ de ␣ l e t t r e s ␣=␣ " << s . size ( ) << endl ;
// pour a c c e d e r a chaque c a r a c t e r e , o p e r a t e u r [ ]
s [ 1 ] = ’ y ’ ; // s v a u t maintenant t y t o
// on p e u t comparer d e s s t r i n g
i f ( s == " t a t a " )
cout << " i n c o r r e c t " << endl ;
// on p e u t c o n c a t e n e r a v e c l ’ o p e r a t e u r +
s = s + " . dat " ; // s v a u t maintenant t y t o . d a t
// on p e u t r e c h e r c h e r une c h a i n e
int pos = s . find ( " t o " ) ; // pos d e v r a i t v a l o i r 2
i f ( pos == string : : npos )
cout << "on␣n␣ a ␣ pas ␣ t r o u v e ␣ l a ␣ c h a i n e ␣ t o ␣ dans ␣ s " << endl ;
// on p e u t e x t r a i r e une sous−c h a i n e
string s_sub = s . substr ( pos , 3 ) ;
// pour e x t r a i r e 3 c a r a c t e r e s a p a r t i r de s [ pos ]
14.3. Vecteurs
#include<v e c t o r >
int main ( )
{
// l a c l a s s e v e c t o r s t o c k e l e s e l e m e n t s de maniere c o n t i g u e
// a c c e s r a p i d e , mais i n s e r t i o n l e n t e
vector<double> x ( 5 ) ; // v e c t e u r de 5 r e e l s
// a c c e s a v e c [ ]
x [ 0 ] = 1 . 0 6 e −7;
x [ 1 ] = −3.5 e8 ;
// on p e u t a g r a n d i r l e v e c t e u r en g a r d a n t l e s a n c i e n s e l e m e n t s
x . resize ( 6 ) ;
// l e s nouveaux e l e m e n t s d o i v e n t e t r e i n i t i a l i s e s
x [5] = 2.5;
// on p e u t a u s s i r a j o u t e r un e l e m e n t a l a f i n du v e c t e u r
// ( i e l e v e c t e u r e s t r e t a i l l e e t un e l e m e n t e s t r a j o u t e )
x . push_back ( 3 . 4 ) ; // e q u i v a l e n t a x . r e s i z e ( 7 ) ; x [ 6 ] = 3 . 4 ;
// on p e u t a u s s i i n s e r e r un e l e m e n t a v e c i n s e r t , e t d e t r u i r e l e v e c t e u r a v e c c l e a r
x . clear ( ) ;
}
14.4. Listes
#include<l i s t >
#include <i o s t r e a m >
int main ( )
{
// une l i s t e ne s t o c k e pas l e s e l e m e n t s de maniere c o n t i g u e
// ( p e n s e z a une l i s t e simplement c h a i n e e )
// l ’ i n s e r t i o n e s t r a p i d e , mais l ’ a c c e s e s t l e n t
list<double> v ;
// push_back e t i n s e r t e x i s t e n t
v . push_back ( 3 . 4 ) ;
v . push_back ( 0 . 3 ) ;
page 43 Aide-mémoire C++ par Marc Duruflé
// pour p a r c o u r i r l a l i s t e , l e mieux e s t d ’ u t i l i s e r un i t e r a t e u r
list<double > : : iterator it ;
cout << ‘ ‘ v = ‘ ‘ ;
f o r ( it = v . begin ( ) ; it != v . end ( ) ; ++it )
cout << ‘ ‘ ‘ ‘ << ∗it ;
#include<s t a c k >
int main ( )
{
// s t a c k e s t un c o n t e n e u r c o r r e s p o n d a n t a une p i l e
// ( p r e m i e r e n t r e , p r e m i e r s o r t i )
stack<double> pile ;
// on e m p i l e l e s e l e m e n t s a v e c push
pile . push ( 0 . 3 3 ) ;
pile . push ( − 0 . 2 5 ) ;
pile . push ( 1 . 3 ) ; // l a p i l e v a u t ( 1 . 3 , −0.25 , 0 . 3 3 )
// on l i b e r e un e l e m e n t a v e c pop
pile . pop ( ) ; // l a p i l e v a u t ( −0.25 , 0 . 3 3 )
// pour a c c e d e r au d e r n i e r e l e m e n t t o p
double y = pile . top ( ) ; // y = −0.25 e t l a p i l e v a u t ( −0.25 , 0 . 3 3 )
}