La déclaration d'un nom introduit une association (binding) de ce nom, qui
définit un nouvel usage de ce nom. Toutes les occurrences de ce nom qui
correspondent à cette association sont dans la portée de cette
association. Les règles de portée du langage permettent d'associer une occurrence
d'un nom à sa déclaration. Quand on dit qu'un nom x est visible à un point du
programme, c'est un abus de langage pour dire que le nom x est dans la
portée d'une association de ce nom (une déclaration de ce nom).
Un objet (mais aussi classe, fonction ou énumération) doit être dans la portée d'exactement une seule définition (mais éventuellement de plusieurs déclarations).
En C++, il existe essentiellement quatre types de portée :
Une déclaration (ou définition) locale ou interne à un classe pourra occulter une
autre déclaration (ou définition) locale. Un nom est toujours associé à la
déclaration la plus ``proche'' syntaxiquement.
L'opérateur :: permet d'accéder à des noms normalement hors de portée:
int a; class A{ int a; public: void f(int); }; void A::f(int i) { // f dans la portée de la classe A a = ::a; // affecte le a dans la portée de la classe // par le a de la portée globale }
En ce qui concerne les noms de variables, d'après ce qui précède,
il n'existe que deux niveaux, local pour les variables déclarées dans
le bloc, et global ;
comme il n'existe pas en C++ de fonctions locales à d'autres fonctions,
le problème de
l'environnement d'appel des fonctions est très simple. La règle de la
portée lexicale,
indique que les noms qui ne sont pas locaux sont évalués dans l'environnement
lexical. L'accès aux noms, en C++ et en C, est donc
très simple (et efficace) : il y a d'une part les
noms locaux qui seront alloués sur la pile d'exécution, et les nom globaux qui
seront alloués dans la zone de données statiques.