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.
2. Les opérations sur les bits
Opérateur Description & et | ou ^ ou exclusif << translation vers la gauche >> translation vers la droite
3. Le processus de compilation
4. Quelques programmes simples
Exemple 1Exemple 2
Exemple 3
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
- variables globales partagées par plusieurs fichiers.
Exemple:5.3. static
Définition de la fonction
Déclaration de la fonctionNote:
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.
- 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.
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.
7. Les abstraction de données
7.1. Les structures7.2. Les énumérations
7.3. Les unions
Les éléments d'une union partagent le même espace de mémoire.
8. Les chaine de caractères
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.
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();
11. Les tableaux multidimensionels
12. Les références
13. Le passage des paramètres
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.
- 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
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
- Destruction du type (destructeur)
- Libération de la mémoire
16. L'allocation de tableaux multi-dimensionnels
16.1. Allocation dynamique16.2. Allocation semi-dynamique
16.3. Allocation pleinement dynamique