CSI2772 - Concepts avancés de programmation en C++

Version Imprimable

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érateurDescription
& 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

Collaboratrices: Emilie Lavigne et Sophie-Catherine Jeaurond