2. Cours semaine 1, jour 2 Cours C++ (2002) 2
Plan du jour
Le langage C : rappels sur les structures et
les données
Les modifications aux structures du langage
C apportées par C++
3. Cours semaine 1, jour 2 Cours C++ (2002) 3
Remarque préalable
Le langage C permet d’atteindre très
rapidement un niveau de « saleté »
important : les programmes sont rapidement
illisibles et, par conséquent, bogués…
Il est nécessaire de définir un ensemble de
règles de codage (coding style) pour éviter
les incompréhensions et améliorer la
lisibilité
4. Cours semaine 1, jour 2 Cours C++ (2002) 4
Coding style
Discutez entre vous de vos standards et de
vos habitudes de rédaction de programmes
Définissez une norme, suivie par tous
Même si cela prend du temps, commentez
vos programmes
La rédaction de programmes en C ou C++
n’est pas un concours de technicité et
d’illisibilité : certains s’y sont essayés…
5. Cours semaine 1, jour 2 Cours C++ (2002) 5
Illisibilité
C est un langage parfait pour l’illisibilité
Des concours annuels sont même organisés
IOCCC : International Obfuscated C Code
Contest
http://www.ioccc.org
Un grand nom du langage C, Ken
Thompson, reconnaît qu’il n’aimerait pas
travailler avec des gens comme lui
6. Cours semaine 1, jour 2 Cours C++ (2002) 6
Illisibilité – Exemple 1
#include <stdio.h>
#include <math.h>
double l;main(_,o,O){return putchar((_--+22&&_+44&&main(_,-43,_),_&&o)?(main(-
43,++o,O),((l=(o+21)/sqrt(3-O*22-O*O),l*l<4&&(fabs(((time(0)-
607728)%2551443)/405859.-4.7+acos(l/2))<1.57))[" #"])):10);}
7. Cours semaine 1, jour 2 Cours C++ (2002) 7
Illisibilité – Exemple 2
int m = 754974721, N, t[1 << 22], a, *p, i, e = 1 << 22, j, s, b, c, U;
f (d)
{
for (s = 1 << 23; s; s /= 2, d = d * 1LL * d % m)
if (s < N)
for (p = t; p < t + N; p += s)
for (i = s, c = 1; i; i--)
b = *p + p[s], p[s] = (m + *p - p[s]) *
1LL * c % m, *p++ = b % m, c = c * 1LL * d % m;
for (j = 0; i < N - 1;)
{
for (s = N / 2; !((j ^= s) & s); s /= 2);
if (++i < j)
a = t[i], t[i] = t[j], t[j] = a;
}
}
8. Cours semaine 1, jour 2 Cours C++ (2002) 8
Illisibilité – Exemple 2, suite
main (){
*t = 2;
U = N = 1;
while (e /= 2)
{
N *= 2;
U = U * 1LL * (m + 1) / 2 % m;
f (362);
for (p = t; p < t + N;)
*p++ = (*p * 1LL ** p % m) * U % m;
f (415027540);
for (a = 0, p = t; p < t + N;)
a += (6972593 & e ? 2 : 1) ** p, *p++ = a % 10, a /= 10;
}
while (!*--p);
t[0]--;
while (p >= t)
printf ("%d", *p--);
}
9. Cours semaine 1, jour 2 Cours C++ (2002) 9
Illisibilité - conclusions
Inutile de suivre un cours pour écrire
comme ça… Quoique
Besoin de cours intensifs, réguliers et
répétés pour ceux qui seront chargés de la
maintenance !
10. Cours semaine 1, jour 2 Cours C++ (2002) 10
Les 10 commandements
Une série de commandements a été faite
permettant à chaque programmeur de
prendre conscience de certains problèmes
Mieux vaut connaître ces commandements
avant de se rendre compte de leur utilité,
une fois que le mal est fait
Ils ont originellement été écrits en vieil
anglais, comme dans certaines bibles des
années 70…
11. Cours semaine 1, jour 2 Cours C++ (2002) 11
Commandement 1
"Thou shalt run lint frequently and study its
pronouncements with care, for verily its
perception and judgement oft exceed thine."
lint est un outil d’analyse du code qui permet de
trouver des erreurs qui apparaîtront très
probablement à l’exécution
Les compilateurs modernes effectuent des tâches
similaires
Rational Purify permet d’excellentes vérifications
12. Cours semaine 1, jour 2 Cours C++ (2002) 12
Commandement 2
"Thou shalt not follow the NULL pointer,
for chaos and madness await thee at its
end."
C et C++ utilisent abondamment les
pointeurs
Un pointeur NULL peut être la cause de
plantages : il faut effectuer des vérifications
aussi souvent que possibles sur les variables
peu sûres
13. Cours semaine 1, jour 2 Cours C++ (2002) 13
Commandement 3
"Thou shalt cast all function arguments to
the expected type if they are not of that type
already, even when thou art convinced that
this is unnecessary, lest they take cruel
vengeance upon thee when thou least expect
it."
C est fortement typé mais permet quelques
libertés : elles peuvent coûter chères…
14. Cours semaine 1, jour 2 Cours C++ (2002) 14
Commandement 4
"If thy header files fail to declare the return
types of thy library functions, thou shalt
declare them thyself with the most
meticulous care, lest grievous harm befall
thy program."
C permet d’effectuer de la compilation
séparée et C++ possède des classes (idem) :
les signatures des fonctions doivent être
parfaitement accessibles et connues
15. Cours semaine 1, jour 2 Cours C++ (2002) 15
Commandement 5
"Thou shalt check the array bounds of all strings
(indeed, all arrays), for surely where thou typest
"foo'' someone someday shall type
"supercalifragilisticexpialidocious''."
Autre facette des pointeurs, avec le problème des
NULL : même si vous écrivez un programme et
codez certaines variables en dur, des modifications
ultérieures pourraient être la cause de graves
problèmes d’exécution
16. Cours semaine 1, jour 2 Cours C++ (2002) 16
Commandement 6
"If a function be advertised to return an
error code in the event of difficulties, thou
shalt check for that code, yea, even though
the checks triple the size of thy code and
produce aches in thy typing fingers, for if
thou thinkest "it cannot happen to me'', the
gods shall surely punish thee for thy
arrogance."
Tester les codes d’erreur retournés
17. Cours semaine 1, jour 2 Cours C++ (2002) 17
Commandement 7
"Thou shalt study thy libraries and strive not
to reinvent them without cause, that thy
code may be short and readable and thy
days pleasant and productive."
Est vrai, reste et restera vrai pour tous les
langages offrant des librairies : C, C++,
Java, Ada, etc.
18. Cours semaine 1, jour 2 Cours C++ (2002) 18
Commandement 8
"Thou shalt make thy program's purpose
and structure clear to thy fellow man by
using the One True Brace Style, even if thou
likest it not, for thy creativity is better used
in solving problems than in creating
beautiful new impediments to
understanding."
La lisibilité réexpliquée
19. Cours semaine 1, jour 2 Cours C++ (2002) 19
Commandement 9
"Thy external identifiers shall be unique in the
first six characters, though this harsh discipline be
irksome and the years of its necessity stretch
before thee seemingly without end, lest thou tear
thy hair out and go mad on that fateful day when
thou desirest to make thy program run on an old
system."
Limitation des premiers compilateurs, à prendre
encore en compte dans le monde de l’embarqué où
C a été utilisé en premier
20. Cours semaine 1, jour 2 Cours C++ (2002) 20
Commandement 10
"Thou shalt foreswear, renounce, and abjure
the vile heresy which claimeth that "All the
world's a VAX'', and have no commerce
with the benighted heathens who cling to
this barbarous belief, that the days of thy
program may be long even though the days
of thy current machine be short."
Le monde change parfois. Remplacer VAX
par WinTel
21. Cours semaine 1, jour 2 Cours C++ (2002) 21
Les 10 commandements, fin
Ces règles finissent toujours par
réapparaître et par s’imposer d’elles mêmes
Autant les prendre en compte immédiatement
Ces sont des règles applicables lors de la
phase de codage qui ne remplacent en aucun
cas les besoins d’une gestion de projet
22. Cours semaine 1, jour 2 Cours C++ (2002) 22
C et C++
C est un langage ancien, mellant des
capacités de programmation à bas niveau
(juste au dessus de l’assembleur) à des
capacités de programmation à haut niveau, à
la manière de Pascal
C est un langage procédural
C est le successeur du langage B auquel il
ajoute la notion de type
B : il ne s’agit pas de la méthode formelle !
23. Cours semaine 1, jour 2 Cours C++ (2002) 23
C et C++ (2)
C et UNIX ont la même origine : les
laboratoires d’ATT Bell
Le premier programme C est UNIX
UNIX devait au départ servir dans les
commutateurs téléphoniques
Ceci explique en partie les différents niveaux de
programmation offerts par C
24. Cours semaine 1, jour 2 Cours C++ (2002) 24
C et C++ (3)
C++ date du début des années 80 : ajout de
la notion de classe
1990 : ajout des notions de templates et
d’exceptions
1993 : ajout de la notion de namespace
Processus de normalisation entre 1995 et
1997
Normalisation ANSI/ISO en 1998
25. Cours semaine 1, jour 2 Cours C++ (2002) 25
L’ancêtre C
ANSI C est un sous ensemble de C++ : tous
les programmes ANSI C peuvent être
compilés en C++
C++ peut être utilisé sans la moindre notion
d’objet. Mais ce n’est plus du C++, c’est du
C…
Toutes les règles syntaxiques de C restent
donc valables en C++
26. Cours semaine 1, jour 2 Cours C++ (2002) 26
ANSI C – Types de bases
Booléen : pas de type véritable, utilise les
entiers (int)
0 représente FALSE, les autres entiers
représentent TRUE
Caractère : char ou wchar_t
Un caractère se différentie par une simple
quote, 'a'
Le rien a un type…void
27. Cours semaine 1, jour 2 Cours C++ (2002) 27
Types de bases (2)
En C, les chaînes de caractères (string) sont
en fait des tableaux de caractères
Se différencient par des doubles quotes, "ansi"
Les entiers sont sous-divisés en trois
groupes
short int, int et long int, pouvant représenter
des chiffres de plus en plus importants
Qualificatifs supplémentaires : signed et
unsigned, pour entiers signés ou non
28. Cours semaine 1, jour 2 Cours C++ (2002) 28
Types de bases (3)
Les chiffres réels peuvent s’utiliser avec
deux types : float et double
Comme pour les entiers avec short, int et long,
float et double sont capables de représenter des
nombres réels de taille différente
Qualificatifs des nombres
F ou f pour float
L ou l pour long ou double
U ou u pour unsigned
29. Cours semaine 1, jour 2 Cours C++ (2002) 29
Types de bases (4)
Problème de représentativité/expressivité
Pas de normalisation sur les anciens
compilateurs
int et float utilise un mot
En fonction des plateformes : 8, 16 ou 32 bits
Demain : 64 bits
short utilise un demi mot
long et double utilisent deux mots
Problèmes lors du portage d’un programme
30. Cours semaine 1, jour 2 Cours C++ (2002) 30
Types de bases (5)
Sur une plate-forme 32 bits
int permet de représenter des chiffres de
-2^31 à (2^31)-1 soit
-2.147.483.648 à 2.147.483.647
short permet de représenter des chiffres de
-2^15 à (2^15)-1
long
-2^63 à (2^63)-1 ; Pas chez Microsoft : long = int !
unsigned int
0 à (2^32)-1
31. Cours semaine 1, jour 2 Cours C++ (2002) 31
Types de bases (6)
Mais encore, sur plate-forme 32 bit
Float utilise 1 mot, c’est à dire 32 bits
+/-1,2 e-38 à +/-3,4 e38
double utilise 2 mots, c’est à dire 64 bits
+/-2,2 e-308 à +/-1,8 e308
Remarque (bis repetita) : En C, la capacité
des types a TOUJOURS été dépendante de
la taille des mots du processeur
Intel Itanium IA64 : déjà disponible en test
32. Cours semaine 1, jour 2 Cours C++ (2002) 32
Variables
Possibilité de définir des constantes
const double PI = 3.1415
const char SP = ' '
C est un langage orienté ligne
Toutes les lignes d’un programme doivent être
délimitées
Le symbole de terminaison est ';'
Une ligne de programme peut être répartie sur
plusieurs lignes physiques
33. Cours semaine 1, jour 2 Cours C++ (2002) 33
Variables (2)
Existence de tableaux dans les différents
types de base
Attention, les strings sont déjà des tableaux…
int a[ 20 ] = tableau de 20 entiers
En C, pour un tableau de dimension N, on
utilise les indices de 0 à N-1
Attention lors des itérations !
Attention lors du développement de
programmes à partir d’algorithmes en pseudo
code ou en Pascal, surtout scientifiques
34. Cours semaine 1, jour 2 Cours C++ (2002) 34
Variables (3)
Possibilité de définir des tableaux à
plusieurs dimensions
int a[ 2 ][ 3 ]
Possibilité d’initialiser les tableaux
int a[ 2 ][ 3 ] = { { 1, 2, 3 }, { 4, 5, 6 } }
float fArray[ 5 ] = { 1.0, 2.0, 3.0, 4.0, 5.0 }
float fArray[ 5 ] = { 1.0 }
Idem que float fArray[5] = { 1.0, 1.0, 1.0, 1.0, 1.0 }
35. Cours semaine 1, jour 2 Cours C++ (2002) 35
Variables (4)
Initialisation des chaînes de caractères
char chaineA[] = { 'i', 'n', 'i', 't', 0 }
char chaineA[] = "init"
Il existe des caractères spéciaux
0, le caractère null (fin de chaînes)
n, pour marquer une nouvelle ligne
Standard UNIX ! Devient br sur Windows
t, pour marquer une tabulation
, pour récupérer le caractère
36. Cours semaine 1, jour 2 Cours C++ (2002) 36
Variables (5)
Possibilité de définir des types
supplémentaires, utilisant les types de base
typedef int Length
Il devient possible d’effectuer une déclaration de
variable telle que
Length l = 1;
Équivalente à int l = 1;
37. Cours semaine 1, jour 2 Cours C++ (2002) 37
Variables (6)
Possibilité d’utiliser une notion ensembliste
en créant des listes de valeurs : énumération
enum Etat { on, off, err }
Déclaration de l’énumération
Les chaînes de caractères seront en fait des entiers
numérotés à partir de 0
S’utilise avantageusement dans les switch (+ loin)
enum Etat e.
Variable e du type Etat
Pourra contenir une valeur possible de la définition
38. Cours semaine 1, jour 2 Cours C++ (2002) 38
Variables (7)
Possibilité de créer des structures de
données plus complexes en utilisant les
types de base
typedef struct {
int condition;
float press, temp; } Container
struct permet de créer une structure de zone
mémoire avec différents champs, à la manière
d’un enregistrement dans un fichier plat
structuré ou une base de données
39. Cours semaine 1, jour 2 Cours C++ (2002) 39
Variables (8)
Les structures créent des types (typedef)
Container ctn
Les champs d’une structure sont accessibles
avec un adressage pointé
ctn.condition = 5;
ctn.press = 1013.25;
ctn.temp = 10.0;
40. Cours semaine 1, jour 2 Cours C++ (2002) 40
Variables (9)
Différentes définitions
struct Container1 { … }
typedef struct { … } Container2
Et différentes utilisations
struct Container1 c1, c2;
Container2 c3, c4;
Le typedef crée un type et simplifie la
notation
41. Cours semaine 1, jour 2 Cours C++ (2002) 41
Variables (10)
Il est possible d’unir des types différents
union test { char a ; int i; double d; }
Dans un programme, l’utilisation de l’union
test permet de stocker soit a, soit i, soit d !
Cela marche car la zone mémoire est
réservée en fonction du type le plus
gourmand
Cela permet d’économiser de la mémoire
42. Cours semaine 1, jour 2 Cours C++ (2002) 42
Gestion des variables
La création de variables avec les types de
base s’accompagne d’une réservation
d’espace mémoire
Aucun espace mémoire n’est réservé a
priori pour une structure : il faut effectuer
l’opération d’allocation mémoire
malloc( sizeof( Container ) )
malloc = memory allocation
sizeof = calcul de la taille mémoire nécessaire
43. Cours semaine 1, jour 2 Cours C++ (2002) 43
Gestion de la mémoire
À la différence d’autres langages de
programmation, C gère deux types de
mémoire
Une pile (stack) : on y empile et dépile les
variables lors d’appels et de retours de
fonctions
Un tas (heap) : on y réserve des zones de
mémoire grâce à malloc
44. Cours semaine 1, jour 2 Cours C++ (2002) 44
programme
Gestion de la mémoire (2)
pile tas
45. Cours semaine 1, jour 2 Cours C++ (2002) 45
Pointeurs
La mémoire allouée dans le tas est gérée au
travers de pointeurs, un type de base
fondamental en C !
Container *ctn;
*ctn est de type structuré Container et donc
ctn est un pointeur sur une zone mémoire contenant
une structure ctn
ctn = malloc( sizeof( Container ) );
malloc renvoie un pointeur sur la zone mémoire
dont la taille est égale à celle d’une structure
Container
46. Cours semaine 1, jour 2 Cours C++ (2002) 46
Pointeurs (2)
L’adressage pointé existe encore :
En version normale :
(*ctn).press = 1000.0;
Le point s’applique sur un type de base ou une
structure, donc *ctn
Les parenthèses sont nécessaires pour des problèmes
de précédence d’opérateurs
En version flèchée
ctn->press = 1020.0;
La flèche s’applique sur les pointeurs, donc ctn
47. Cours semaine 1, jour 2 Cours C++ (2002) 47
Pointeurs (3)
L’opérateur malloc permet de gérer
directement la mémoire disponible dans le
tas associé au programme
C offre ainsi une certaine puissance vis-à-vis du
système d’exploitation
C offre un chausse-trappe !
De nombreux programmes C tournent lentement ou
plantent car la mémoire n’est pas désallouée après
utilisation
48. Cours semaine 1, jour 2 Cours C++ (2002) 48
Pointeurs (4)
Libération de la mémoire
free( ctn );
Désalloue la mémoire précédemment réservée
et associée à ctn
Il serait bon d’avoir une méthode qui libère
automatiquement la mémoire après
utilisation
Cela n’existe pas en C
49. Cours semaine 1, jour 2 Cours C++ (2002) 49
Pointeurs (5)
Les pointeurs sont puissants
int i;
int *a;
a = &i;
*a = 3;
La valeur 0 est utilisée comme pointeur
NULL
Attention à ne jamais la suivre !
50. Cours semaine 1, jour 2 Cours C++ (2002) 50
Pointeurs (6)
Les pointeurs sont durs à suivre
int& a;
int* b;
51. Cours semaine 1, jour 2 Cours C++ (2002) 51
Pointeurs (7)
Les pointeurs sont très puissants !
Possibilité de définir des pointeurs sur des
tableaux à plusieurs dimensions pour pouvoir
leur donner leur taille exacte en cours
d’exécution
int t[128][256] : grosse préréservation
int **t : le tableau à deux dimensions existe mais est
vide
Effectuer ensuite une série de malloc : un premier
pour les 128 lignes puis 128 itérations pour les 256
colonnes
52. Cours semaine 1, jour 2 Cours C++ (2002) 52
Pointeurs (8)
Les pointeurs permettent bien des choses :
Un pointeur représente un chemin vers une
variable / valeur
Une fonction renvoie une valeur
Il est possible de définir un pointeur vers une
fonction et donc
Il est possible de définir des tableaux de
fonctions
Il est aussi possible de définir des pointeurs sur
des indéfinis avec void *
53. Cours semaine 1, jour 2 Cours C++ (2002) 53
Opérations arithmétiques
Addition : +
Soustraction : -
Multiplication : *
Division entière ou réelle : /
Modulo : %
Pas de notation pour le calcul des exposants
Incrémentation de 1 : ++
Décrémentation de 1 : --
54. Cours semaine 1, jour 2 Cours C++ (2002) 54
Opérations logiques
ET logique : &&
OU logique : ||
NON logique : !
Test d’égalité : ==
Test d’inégalité : !=
Comparaisons arithmétiques : inférieur <,
inférieur ou égal <=, supérieur >, supérieur
ou égal >=
55. Cours semaine 1, jour 2 Cours C++ (2002) 55
Opérations binaires
ET sur bit : &
OU sur bit : |
NON sur bit : ~
OU EXCLUSIF sur bit : ^
Décalage de bits vers la droite : >>
Décalage de bits vers la gauche : <<
56. Cours semaine 1, jour 2 Cours C++ (2002) 56
Affectations
Affectation : =
Opérations spéciales
i += a; équivalent à i = i + a;
i -= a; équivalent à i = i - a;
i *= a; équivalent à i = i * a;
i /= a; équivalent à i = i / a;
57. Cours semaine 1, jour 2 Cours C++ (2002) 57
Point d’entrée
Un programme est une suite de fonctions
(qui renvoient des valeurs) et de procédures
(qui ne renvoient rien)
Cependant, un programme doit avoir un
point d’entrée :
main ( void )
Ce programme ne prend pas d’argument
En C, quand le type de la valeur renvoyée n’est
pas mentionné, int est pris par défaut
58. Cours semaine 1, jour 2 Cours C++ (2002) 58
Point d’entrée (2)
main( void )
Est équivalent à int main( void )
Est différent de void main( void )
Un bloc d’instructions est délimité par des
accolades ouvrantes et fermantes :
main( void )
{
/* instructions du programme */
}
59. Cours semaine 1, jour 2 Cours C++ (2002) 59
Point d’entrée (3)
Un programme peut avoir des paramètres
main( int argc, char *argv[ ] )
argc = argument count, le nombre
d’arguments fournis
argv = argument values, un tableau de
chaînes de caractères contenant la version
texte des arguments
argv[ 0 ] permet d’accèder au nom du
programme
60. Cours semaine 1, jour 2 Cours C++ (2002) 60
Point d’entrée (4)
Remarque : l’utilisation des paramètres
d’appel argc et argv est typique des
systèmes UNIX où les programmes sont
principalement invoqués (lancés) à partir
d’un shell
Cela a moins de sens sous Windows (en
mode graphique) bien que les shortcuts
permettent d’utiliser des arguments
61. Cours semaine 1, jour 2 Cours C++ (2002) 61
Point d’entrée (5)
Il est également possible de récupérer les
variables de l’environnement accessibles
sur le Shell
main( int argc, char *argv[ ], char *envp[ ] )
envp est un tableau de chaînes de caractères
mais sa dimension n’est pas fournie : il faut
tester la fin du tableau en testant le pointeur
sur un élément
62. Cours semaine 1, jour 2 Cours C++ (2002) 62
Définition de fonctions
Une fonction possède un type de retour, un
nom et des arguments ; une procédure est
une fonction qui ne renvoie rien (void)
void procedure( int entier, float reel )
{
/* les instructions de la fonction */
}
63. Cours semaine 1, jour 2 Cours C++ (2002) 63
Définition de fonctions (2)
Si la fonction possède un type de retour,
c’est qu’elle doit retourner quelque chose…
double fonction( int entier, float reel )
{
/* les instructions de la fonction */
return x;
}
64. Cours semaine 1, jour 2 Cours C++ (2002) 64
Mémoire des variables
Dans une définition de fonction, il est
possible de définir des variables pour une
utilisation locale
Ces variables seront supprimées / oubliées à
la fin de la fonction
Pour garder la trace d’une variable d’un
appel à l’autre, il faut utiliser le mot clé
static
65. Cours semaine 1, jour 2 Cours C++ (2002) 65
Mémoire des variables (2)
double fonc( int entier, float reel )
{
int i = 0;
static int j;
/* les instructions de la fonction */
return x;
}
j n’est pas global mais fonc s’en souviendra
66. Cours semaine 1, jour 2 Cours C++ (2002) 66
Structures de contrôle
Un programme n’est rien sans structures de
contrôle
Structures de contrôle nécessaires pour
Les tests
Les itérations
67. Cours semaine 1, jour 2 Cours C++ (2002) 67
Structures de contrôle (2)
Test basique
if( i < 0 )
i = 0;
Pas de marqueur then
Utilisation possible des accolades
if( i < 0 )
{
i = 0;
j = 1;
}
68. Cours semaine 1, jour 2 Cours C++ (2002) 68
Structures de contrôle (3)
Le traitement alternatif est mentionné par
else :
if( t == 0 )
i = 0;
else if( t == 1 )
i = 3;
else i = 6;
Les parenthèses peuvent s’avérer utiles pour
clarifier les tests d’un programme !
69. Cours semaine 1, jour 2 Cours C++ (2002) 69
Structures de contrôle (4)
Test en cascade
switch( ch )
{
case 'O':
case 'o' : i = 1;
break;
case 'N' :
case 'n' : i = 0;
break;
default : erreurNormande();
}
70. Cours semaine 1, jour 2 Cours C++ (2002) 70
Structures de contrôle (5)
Le test en cascade s’effectue sur des char ou
des int (un char est un int !)
Différentes conditions peuvent être
regroupées
Un cas par défaut peut être mentionné
Le break est nécessaire car la réalisation
d’une condition n’interrompt pas
l’enchaînement (une manière de faire du
side effect)
71. Cours semaine 1, jour 2 Cours C++ (2002) 71
Structures de contrôle (6)
Le if-then-else peut s’écrire de manière
compacte :
if( A )
B
Else C
Est équivalent à
( A ? B : C )
72. Cours semaine 1, jour 2 Cours C++ (2002) 72
Structures de contrôle (7)
Itération bornée (ou indexée)
for( initialisation ; condition d’arrêt ;
incrémentation )
{
/* instructions */
}
L’initialisation est effectuée avant le début
de la première itération
73. Cours semaine 1, jour 2 Cours C++ (2002) 73
Structures de contrôle (8)
La condition d’arrêt est testée avant
l’exécution de la première instruction du
bloc à chaque itération
L’incrémentation est effectuée à la fin de
chaque itération
Chacune de ces 3 parties est optionnelle !
Un break permet également de stopper
l’itération
74. Cours semaine 1, jour 2 Cours C++ (2002) 74
Structures de contrôle (9)
Utilisation typique :
for( i = d ; i < f ; i += p )
{
/* instructions */
}
Cette structure de contrôle peut être très
efficace. Il faut cependant faire attention en
utilisant ses spécificités.
75. Cours semaine 1, jour 2 Cours C++ (2002) 75
Structures de contrôle (10)
Itérations non bornées
Itération « tant que »
while( condition )
{
/* instructions */
}
76. Cours semaine 1, jour 2 Cours C++ (2002) 76
Structures de contrôle (11)
Itération « jusqu’à »
do
{
/* instructions */
}
while( condition )
77. Cours semaine 1, jour 2 Cours C++ (2002) 77
Commentaires
Commentaires
Ils sont vivement conseillés dans les
programmes !
Début avec /*
Fin avec */
Tout, TOUT, ce qui est entre un début et une
fin de commentaires est un commentaire, même
un bout de code malencontreusement déplacé !
78. Cours semaine 1, jour 2 Cours C++ (2002) 78
Inclusions
La mise à disposition de cet ensemble
d’instructions ne suffit pas pour développer
rapidement un programme
Besoin de librairies de fonctions prédéfinies,
tenant compte si nécessaires des spécificités de
la plate-forme
Utilisation de directives d’inclusion
#include <stdio.h>
#include <stdlib.h>
79. Cours semaine 1, jour 2 Cours C++ (2002) 79
Inclusions (2)
C permet d’utiliser (et d’inclure) deux types
différents de librairies
Les librairies standards du système
#include <stdio.h>
Ceci permet de faire le lien avec des programmes
précompilés du système
Les librairies propres au développeur
#include "monfichier.h"
Ceci permet de définir des librairies personnelles,
dont il faudra fournir le code
80. Cours semaine 1, jour 2 Cours C++ (2002) 80
Inclusions (3)
Les inclusions permettent de référencer des
fonctions définies par ailleurs ou d’utiliser
des constantes
Pour utiliser des variables définies dans un
autre programme, il faut préciser qu’elles
sont externes
extern int i;
la variable i est réellement définie dans un autre
programme (fichier)
81. Cours semaine 1, jour 2 Cours C++ (2002) 81
Extensions des noms
Conventions de nommage des fichiers
Le nom d’un fichier contenant une partie d’un
programme écrit en C comporte l’extension .c
Le nom d’un fichier contenant un ensemble de
déclarations de constantes ou de déclarations de
fonctions (les signatures) se termine par .h
(ceux que l’on utilisent avec #include)
Par extension, en C++ :
.cpp, .cxx, .cc
.hpp, .hxx, .hh
82. Cours semaine 1, jour 2 Cours C++ (2002) 82
Importation
#import
Directive Microsoft
Permet d’importer une DLL correspondant à la
définition d’un composant Microsoft ActiveX
N’existe que sur les plate-formes Windows
Depuis Visual C++ 5.0
83. Cours semaine 1, jour 2 Cours C++ (2002) 83
Directives compilateur
Il est possible d’influer sur le comportement
d’un compilateur en lui fournissant des
paramètres
Certains de ces paramètres peuvent être des
variables littérales lui demandant d’avoir un
certain comportement lorsqu’il analyse le
code source
Ces paramètres sont des définitions utilisées
par le préprocesseur
84. Cours semaine 1, jour 2 Cours C++ (2002) 84
Directives compilateur (2)
#define
Permet de définir des variables littérales dans le
code source, en plus des définitions passées au
compilateur
#define PI 3.14
#define MAX( A, B ) (((A)>=(B)) ? (A) : (B) )
#undef
Permet de supprimer une déclaration
85. Cours semaine 1, jour 2 Cours C++ (2002) 85
Directives compilateur (3)
#ifdef
Code source à prendre en compte si un littéral
est défini
#ifndef
Code source à prendre en compte si un littéral
n’a pas été défini
86. Cours semaine 1, jour 2 Cours C++ (2002) 86
Directives compilateur (4)
Ces déclarations de variables compilateur
sont en partie utilisées pour permettre le
portage d’un plate-forme à une autre ou
d’un système d’exploitation à un autre
Il faut se rappeler que les résultats d’un
programme C peuvent varier en fonction de
la taille des mots du processeur
87. Cours semaine 1, jour 2 Cours C++ (2002) 87
Directives compilateur (5)
#pragma
Permet également d’agir sur le processeur et
d’utiliser certaines options de compilation
plutôt que d’autres
Par exemple, cela permet de spécifier un jeu
d’instructions machine
Support MMX
Pentium 2, 3, 4
etc
88. Cours semaine 1, jour 2 Cours C++ (2002) 88
Débogage
#assert
Permet d’enclencher des mécanismes
d’assertion dans un programme en cours
d’exécution
Il y a en fait plusieurs manières de faire, cet
indicateur est une des possibilités offertes par
certains compilateurs
Nous y reviendrons plus tard
89. Cours semaine 1, jour 2 Cours C++ (2002) 89
C++
Quelques ajouts de C++
90. Cours semaine 1, jour 2 Cours C++ (2002) 90
Classes
Mot clé principal : class
Même s’il n’est pas toujours très objet, C++ a
des classes, la base de la programmation objet
Les classes ne montrent pas toujours la
totalité de ce qu’elles savent faire :
Il existe des qualificatifs permettant de dire qui
a le droit de voir et qui ne le pourra pas
Ces qualificatifs s’appliquent aux variables et
aux fonctions
91. Cours semaine 1, jour 2 Cours C++ (2002) 91
Classes (2)
public : tout le monde peut voir, accèder et
modifier
protégé (protected) : seule la descendance,
dans l’arbre d’héritage, a accès à ces
variables et fonctions (par héritage !)
privé (private) : seuls les objets du type de
la classe elle-même ont accès à des
variables et des fonctions privées
92. Cours semaine 1, jour 2 Cours C++ (2002) 92
Classes (3)
Ces types de protection sont à la base de
tous les langages à objets
mais il en manque un en C++
C++ n’a pas décidé d’être l’archétype des
langages à objet, il se veut plus pragmatique
(rustique ? sale ?)
C++ utilise public, private et protected mais
permet à certains objets d’accèder aux parties
les plus intimes d’un autre
93. Cours semaine 1, jour 2 Cours C++ (2002) 93
Classes (4)
Pour qu’un objet soit capable d’accèder aux
parties privées d’un autre objet, il doivent
être amis
Mot clé friend : si une classe en déclare une
autre friend, elle la laisse accèder à tout
Elle redéfinit en quelque sorte tout en public
pour certaines classes
Cela peut être très dangereux…
94. Cours semaine 1, jour 2 Cours C++ (2002) 94
Classes (5)
Le mot clé friend est considéré comme le
goto des mécanismes objet de protection
des accès…
Risque de couplage très fort dans un
système : très difficile à faire évoluer
ensuite.
Peut être partiellement éviter par l’usage de
fonctions inline (équivalent au #define de
fonctions)
95. Cours semaine 1, jour 2 Cours C++ (2002) 95
Classes (6)
Pour la terminologie C++ :
Une variable est généralement qualifiée de data
member
Une méthode est généralement qualifiée de
member function
96. Cours semaine 1, jour 2 Cours C++ (2002) 96
Classes (7)
C++ simplifie quelque peu la gestion de la
mémoire dans le tas
Il n’est plus nécessaire d’utiliser malloc et
free
malloc peut être remplacé par new
free peut être remplacé par delete
Il y a alors un embryon de gestion
automatisé de la mémoire
97. Cours semaine 1, jour 2 Cours C++ (2002) 97
Classes (8)
C++ permet d’utiliser const sur des classes :
cela a parfois son utilité
Mais toutes les variables d’une telle classe
ne sont pas obligées de rester constantes
mutable permet de préciser qu’une partie d’un
const est modifiable
98. Cours semaine 1, jour 2 Cours C++ (2002) 98
Classes (9)
Dans le code source d’une classe, il est
possible de considérer l’instance qui sera
produite à partir de la classe (définition)
Ce bloc mémoire peut être référencé par un
pointeur (c’est du C)
L’objet dans lequel on se trouve possède un
nom spécial : this
C’est celui que l’on est en train de parcourir
99. Cours semaine 1, jour 2 Cours C++ (2002) 99
Classes (10)
Certaines classes sont trop abstraites pour
avoir des instances
Il est possible d’avoir des chevaux et des
dauphins
Il est beaucoup plus dur d’avoir des instances
de mammifères bien que la classe (et sa
définition) existe
100. Cours semaine 1, jour 2 Cours C++ (2002) 100
Classes (11)
L’abstraction peut se traduire par
l’impossibilité de définir certaines fonctions
dans certaines classes et de savoir pourtant
que ces fonctions existeront
Tous les mammifères se déplacent et la
présence de la fonction déplacer() dans la
classe mammifère a un sens
Trouver le traitement correspondant est
beaucoup plus dur pour l’instant
101. Cours semaine 1, jour 2 Cours C++ (2002) 101
Classes (12)
Il est donc possible de dire qu’une fonction
est abstraite et de reléguer son
implémentation à une étape ultérieure, dans
une autre classe qui héritera de la classe
abstraite
Dans mammifère
virtual int déplacer();
Dans la classe cheval, il sera possible de
donner le contenu effectif de la méthode
102. Cours semaine 1, jour 2 Cours C++ (2002) 102
Classes (13)
Il est possible de créer des espaces de
nommage et de les utiliser
using namespace std;
Utilisation de l’espace de nommage standard,
autrement dit l’espace de nommage comportant
les fonctions standard
103. Cours semaine 1, jour 2 Cours C++ (2002) 103
Classes (14)
Il fut un temps, en C++, où les espaces de
nommage n’existaient pas
Pour résoudre certains problèmes, il était
possible (et il est encore possible)
d’effectuer des déclarations de classes
imbriquées
Cela s’appelle les nested classes
104. Cours semaine 1, jour 2 Cours C++ (2002) 104
Classes (15)
Class Externe {
public:
class InterneVisible { /* … */ }
private:
class InterneCachée { /* … */ }
}
105. Cours semaine 1, jour 2 Cours C++ (2002) 105
Classes (16)
Cela ne s’utilise pas n’importe comment !
Externe ext; // OK
InterneVisible intvis1; // erreur
InterneCachée intcach1; // erreur
Externe::InterneVisible intvis2; //OK
Externe::InterneCachée intcach2; // err
L’imbrication n’existe que pour des
problèmes de visibilité
106. Cours semaine 1, jour 2 Cours C++ (2002) 106
Classes (17)
Utilisation de l’héritage :
class Forme {
public: /* … */
};
class Rond : public Forme {
// un rond est une forme
};
107. Cours semaine 1, jour 2 Cours C++ (2002) 107
Classes (18)
Définition d’une classe :
class A {
int i, j, k; // private par défaut
public:
int f();
void g();
}
108. Cours semaine 1, jour 2 Cours C++ (2002) 108
Classes (19)
int B::f() {
return i + j – k;
}
void B::g() {
i = j = k =0;
}
109. Cours semaine 1, jour 2 Cours C++ (2002) 109
Classes (20)
Les commentaires ont été modifiés
Il est toujours possible de commenter par
bloc avec /* … */
Il est aussi possible de commenter sur une
ligne avec //
Tous les caractères jusqu’au retour chariot font
partie du commentaire
110. Cours semaine 1, jour 2 Cours C++ (2002) 110
Classes (21)
C++ est un langage orienté objet qui
supporte la programmation générique (ce
qui n’a rien avoir avec l’objet…)
Il est possible de définir des classes
template : un type d’objet devient alors
variable à l’intérieur d’une autre classe qui
est alors une classe paramétrée
Définition d’une classe avec une variable de
substitution
111. Cours semaine 1, jour 2 Cours C++ (2002) 111
Classes (22)
template<class T>
class Array {
int size = 100; // ~
T A[ size ];
public:
T& operator[] ( int index ) {
return A[ index ];
}
};
112. Cours semaine 1, jour 2 Cours C++ (2002) 112
Questions / Remarques