II - Les notions de bases
1. Les types de données
1.1. Les entiers
- char // pour les entiers ou les caractères (code ASCII)
- short
- int
- long
avec short < long et short <= int <= long
1.2. Les nombres réels
- float (32 bits)
- double (64 bits)
- long double (128 bits)
La représentation binaire des nombres réels en C++ suivent le standard IEEE754.
1.3. Les entiers non-signés
- unsigned int
- unsigned char
- unsigned short
Par exemple, unsigned char utilise un intervalle de 0 à 255 au lieu de -128 à 127.
1.4. La conversion automatique des types
Une conversion automatique a lieu lors d'opérations mixtes, d'affectations, d'expressions logiques.
Haut de la page
2. Les opérations sur les bits
Opérateur | Description |
& | et |
| | ou |
^ | ou exclusif |
<< | translation vers la gauche |
>> | translation vers la droite |
Haut de la page
3. Le processus de compilation
4. Quelques programmes simples
Exemple 1
Exemple 2
Exemple 3
Haut de la page
5. Les classes de variables
5.1. auto
- espaces attribués automatiquement lors de l'exécution du programme (liaisons dynamiques)
- déclaration par défaut
- i.e.: auto int x; est la même chose que int x ; // auto
5.2. extern
- variables globales partagées par plusieurs fichiers.
Exemple:
Définition de la fonction
Déclaration de la fonction
Note:
Déclaration : aucun espace mémoire n'est utilisé ; ne fait que dire au compliateur qu'il existe une variable qui doit être définit ailleurs. Il s'agit d'une définition si la variable est initialisée (ie :extern int y = z ;)
Définition : La variable est créée et initialisée. Cela doit se produire une seule fois. Lorsqu'une variable avec le mot clé extern est initialisé, cela devient une définition.
Compilateur linéaire On doit avoir la définition avant d'utiliser la variable ou la fonction.
5.3. static
- La liaison est statique.
- L'espace mémoire réservé dans l'exécutable.
- La durée de vie est la même que la durée de vie du programme.
- Si elle est déclarée dans fonction.cpp (ie), la variable est globale privée (local au fichier) → cet usage est banni par ANSI C++.
- Lorsqu'une variable globale est déclarée static, elle devient locale au fichier où elle est définie. Cet usage est défini comme obsolète par ANSI C++.
5.4. const
- Sert à définir des constantes.
- Elles doivent toujours être initialisées.
Exemple:
5.5. register
- Un registre du processeur assigné à cette variable (permet une exécution plus rapide). Cette assignation n'est pas garantie.
5.6. volatile
- La valeur de cette variable peut être modifiée par un événement extérieur.
- i.e.: permet d'aller chercher une valeur à l'extérieur du programme
Note: register et volatile ne sont à peu près jamais utilisés.
Haut de la page
6. Les espaces de nom (namespace)
- But: éviter la pollution des noms
- Équivalent des package en Java
- Opérateur de resolution de portée (::)
- L'énoncé "using" permet d'éviter la spécification de l'espace de nom.
- déclarer using monEspace::a ou using namespace monEspace
- défait la solution introduite par les espaces de noms (attention à la pollution)
- Espace de noms anonymes
- namespace { int i; } // i est local au fichier
- même portée que portée globale; remplace les variables statiques globales.
- la définition de int i en plus de namespace { int i; } serait ambigüe.
Haut de la page
7. Les abstraction de données
7.1. Les structures
7.2. Les énumérations
7.3. Les unions
Les éléments d'une union partagent le même espace de mémoire.
Haut de la page
8. Les chaine de caractères
Haut de la page
9. Les pointeurs
Un pointeur est une variable conçue pour contenir des adresses. Sa déclaration spécifie le type des éléments sur lesquels le pointeur va pointer.
Haut de la page
10. Les tableaux
Le nom du tableau correspond à l'adresse de ce tableau.
int a[10];
int *p;
p = a; // pointe au début du tableau
Notes:
- p[i] et *(p+i) sont équivalents.
- &p[0] et p sont équivalents.
- int *p[5] est un tableau de 5 pointeurs alors que int (*p)[5] est un pointeur à un tableau de 5.
- &p[i] et p+i sont équivalents.
Il est possible de parcourir un tableau en utilisant strictement des pointeurs.
char *c = "bonjour" déclare une chaine de caractères constituées d'un tableau de caractères. Une chaine est un tableau de caractères se terminant par '\0' (null). Ce code est équivalent à
char c[8] = {'b', 'o', 'n', 'j', 'o', 'u', 'r', '\0'};
string s("bonjour");
char *c = s.c_str();
Haut de la page
11. Les tableaux multidimensionels
Haut de la page
12. Les références
Haut de la page
13. Le passage des paramètres
Haut de la page
14. La conversion
14.1. Réinterprétation de constante: const_cast
- Retirer la constance d'une variable. Ceci est utile pour corriger une erreur dans la déclaration d'une fonction.
14.2. Réinterprétation de pointeur: reinterpret_cast
- Ne change pas la nature de la variable; le pointeur demeure un pointeur du contenu de la variable et l'adresse demeure une adresse.
14.3. Conversion explicite de type: static_cast<type>
- Change la nature du contenu
Haut de la page
15. L'allocation dynamique de la mémoire
Il n'y a pas de ramasse-miettes (garbage collector) en C++.
Il existe 3 types d'allocation mémoire
- statique (variable static) : par l'éditeur des liens.
- automatique (variable auto) : sur la pile d'exécution
- dynamique (via les pointeurs) : sur le heap
Une variable est initialisée en 3 étapes:
- Allocation de la mémoire
- Construction du type (constructeur)
- retour de pointeur
La destruction se fait en deux étapes:
- Destruction du type (destructeur)
- Libération de la mémoire
Haut de la page
16. L'allocation de tableaux multi-dimensionnels
16.1. Allocation dynamique
16.2. Allocation semi-dynamique
16.3. Allocation pleinement dynamique