11 Portée, visibilité, durée de vie
La portée d'un identificateur (correspondant à un nom de variable,
de fonction,...) correspond aux parties du programme où cet
identificateur peut être utilisé sans provoquer d'erreur à la compilation.
La portée d'une variable globale ou d'une fonction globale est égale au
programme: elles peuvent être utilisée n'importe où. Un identificateur
correspondant à une variable locale peut être utilisé à partir de sa
définition jusqu'à la fin de la première instruction composée ({...}) qui
contient sa définition.
Deux variables peuvent avoir le même nom mais dans ce cas, elle doivent
avoir deux portés différentes. Par exemple, on peut évidemment utiliser une
variable locale i dans deux fonctions différentes : dans ce cas, les
portées des deux variables sont disjointes. Mais on peut aussi avoir la
situation suivante :
//=========================
{
int i=3;
{
int i=5;
cout << i; // affiche 5
}
cout << i; // affiche 3
}
//=========================
Ici les deux variables i ont bien des portées différentes : la
portée de la seconde est incluse dans celle de la première. Lors du premier
cout, seule la seconde variable (celle valant 5) est
visible, la première existe toujours (elle occupe un espace
mémoire) mais elle n'est pas accessible. Après le }, la seconde
variable est détruite et il ne reste plus que la première variable valant
3. Une variable peut donc être ``à portée'' mais non visible.
La durée de vie d'une variable correspond à la période depuis sa
création (allocation de mémoire) à sa destruction (libération de la zone
mémoire correspondante). Cette notion coïncide avec la portée pour toutes
les variables que nous avons évoquées jusqu'ici, mais ce n'est pas le cas
pour les variables static et pour les celles correspondant à des
structures de données dynamiques (i.e. dont la création n'a pas été
effectuée avec l'opérateur new), ces deux cas seront présentés
ultérieurement.