Portée (Scope) et durée de vie en C++
Apprenez la portée et la durée de vie en C++ pour comprendre la visibilité des variables et la gestion mémoire.
Dans les programmes C++, chaque variable possède une portée (scope) et une durée de vie (lifetime). La portée détermine où la variable est accessible dans le programme, tandis que la durée de vie définit combien de temps elle existe en mémoire. Ces notions sont particulièrement importantes pour les fonctions, les boucles et la gestion de la mémoire.
1. Qu’est-ce que la portée (Scope) ?
La portée désigne la zone dans laquelle une variable est définie.
En C++, la visibilité d’une variable est limitée aux accolades ({ }) où elle est déclarée.
Portée locale
Les variables définies à l’intérieur d’une fonction ou d’un bloc ne sont valables que dans ce bloc.
#include <iostream>
using namespace std;
int main() {
int nombre = 10; // variable locale
cout << nombre << endl;
}
// 'nombre' n’est plus accessible ici
Dans cet exemple, la variable nombre ne peut être utilisée qu’à l’intérieur de la fonction main().
2. Portée au niveau du bloc
En C++, chaque paire d’accolades ({ }) crée sa propre portée.
Cela est fréquent dans les boucles et les instructions conditionnelles.
int main() {
int a = 5;
if (a > 0) {
int b = 10; // valable uniquement dans ce bloc 'if'
cout << a + b << endl;
}
// cout << b; // Erreur ! 'b' n’est pas accessible ici
return 0;
}
Remarque : Des variables du même nom peuvent être déclarées dans différents blocs. Cependant, une variable déclarée dans un bloc interne « masque » celle du bloc externe.
int x = 5;
int main() {
int x = 10; // la variable externe 'x' est masquée
cout << x << endl; // 10
return 0;
}
3. Portée globale
Les variables définies en dehors de toutes les fonctions sont appelées variables globales. Elles peuvent être utilisées n’importe où dans le programme.
#include <iostream>
using namespace std;
int compteur = 0; // variable globale
void Incremente() {
compteur++;
}
int main() {
Incremente();
Incremente();
cout << "Compteur: " << compteur << endl; // 2
return 0;
}
Les variables globales doivent être utilisées avec précaution, car elles peuvent être modifiées depuis n’importe quel endroit du programme.
4. Le mot-clé static et la durée de vie
Le mot-clé static permet de modifier la durée de vie d’une variable.
Les variables static ne sont créées qu’une seule fois et restent en mémoire jusqu’à la fin du programme.
#include <iostream>
using namespace std;
void Compter() {
static int compteur = 0; // créé une seule fois
compteur++;
cout << "Fonction appelée " << compteur << " fois." << endl;
}
int main() {
Compter();
Compter();
Compter();
return 0;
}
Sortie :
Fonction appelée 1 fois.
Fonction appelée 2 fois.
Fonction appelée 3 fois.
La variable static conserve sa valeur entre les appels de fonction.
Cela est utile pour des compteurs ou des caches.
5. L’opérateur de résolution de portée (::)
Lorsqu’il existe une variable locale et une variable globale portant le même nom,
on peut accéder à la variable globale en utilisant l’opérateur de résolution de portée (::).
#include <iostream>
using namespace std;
int x = 100; // variable globale
int main() {
int x = 10; // variable locale
cout << "x local: " << x << endl;
cout << "x global: " << ::x << endl; // accès à la variable globale
return 0;
}
Sortie :
x local: 10
x global: 100
6. Durée de vie automatique et statique
| Type | Description | Durée de vie |
|---|---|---|
| Automatique | Variables déclarées à l’intérieur d’une fonction. Automatique par défaut. | Créée à l’appel de la fonction et détruite à sa fin. |
| Statique | Déclarée avec le mot-clé static. |
Créée au démarrage du programme et conservée jusqu’à sa fin. |
7. Exemple : comparaison de compteurs
L’exemple suivant montre la différence entre les variables automatiques et statiques.
#include <iostream>
using namespace std;
void Compteur() {
int automatique = 0;
static int permanent = 0;
automatique++;
permanent++;
cout << "Automatique: " << automatique
<< " | Statique: " << permanent << endl;
}
int main() {
Compteur();
Compteur();
Compteur();
return 0;
}
Sortie :
Automatique: 1 | Statique: 1
Automatique: 1 | Statique: 2
Automatique: 1 | Statique: 3
Comme on le voit, la variable automatique est réinitialisée à chaque appel,
tandis que la variable statique conserve sa valeur.
8. TL;DR
- La portée détermine où une variable est accessible.
- Les variables locales ne sont valides que dans le bloc où elles sont définies.
- Les variables globales sont accessibles dans tout le programme, mais doivent être utilisées avec précaution.
- Les variables
staticconservent leur valeur jusqu’à la fin du programme. - L’opérateur
::permet d’accéder aux variables globales. - Tous les exemples peuvent être exécutés avec Visual Studio 2022 ou GCC 11+.