Scope o visibilidad de variables
La visibilidad de una variable es la parte del programa en la que esa variable está definida y puede
ser utilizada. La duración hace referencia al tiempo que transcurre entre la creación de una variable
y el instante en que es destruida. En general la visibilidad de una variable auto abarca desde el
punto en el que se define hasta que finaliza el bloque en el que está definida. Si la declaración de
una variable no se encuentra dentro de ningún bloque (variable global o extern), la visibilidad se
extiende desde el punto de declaración hasta el final del fichero (otros ficheros pueden ver dicha
variable sólo si la declaran como extern).
Las reglas de duración y visibilidad de C++ son similares a las de C. En C++ la visibilidad de
una variable puede ser local, a nivel de fichero o a nivel de clase.
Las variables locales se crean dentro de un bloque y sólo son visibles dentro del bloque en el
que han sido definidas y en sus bloques anidados, salvo que sean ocultadas por una nueva variable
del mismo nombre declarada en uno de esos bloques anidados.
Las variables que tienen visibilidad a nivel de fichero –variables globales– se definen fuera de
cualquier bloque, función o clase.
Una variable local declarada dentro de un bloque oculta una variable global del mismo
nombre u otra variable local también del mismo nombre declarada en un bloque más exterior. Por
ejemplo, puede suceder que en un bloque, hasta la declaración de una variable x se pueda estar
utilizando otra variable con el mismo nombre x de otro bloque que contenga al primero. A partir de
su declaración y hasta el final de su bloque, la nueva variable x será la local del bloque más interior.
Véase el ejemplo siguiente:
...
{
double x = 2.0;
printf("lf", x); // se imprime 2.0
{
printf("lf", x); // se imprime 2.0
double x = 3.0;
printf("lf", x); // se imprime 3.0
}
printf("lf", x); // se imprime 2.0
}
...
En C++ las variables definidas dentro de una clase –variables miembro– pueden ser
declaradas como privadas o como públicas 5 . Las variables miembro que han sido declaradas como
privadas no son visibles fuera de la clase; si se declaran como públicas se puede acceder a ellas
mediante los operadores punto (.) y flecha (->), con las mismas reglas que para las variables
miembro de las estructuras de C. Las funciones miembro de una clase tienen visibilidad directa
sobre todas las variables miembro de esa clase, sin necesidad de que les sean pasadas como
argumento.
La duración (lifetime) de una variable es el período de tiempo en que esta variable existe
durante la ejecución del programa. La duración de una variable puede ser automatic (opción por
defecto) o static. En el primer caso –el caso de las variables declaradas dentro de un bloque – la
variable se crea y se destruye cada vez que se pasa por el bloque. Las variables static existen hasta
que termina la ejecución del programa. Su valor se conserva entre las distintas pasadas por un
bloque. Para que una variable local sea static hay que declararla como tal dentro del bloque.
Debe recordarse que aunque una variable exista durante toda la ejecución de un programa,
sólo puede utilizarse en la zona del programa en que esa variable es visible.
C++ dispone del operador (::), llamado operador de resolución de visibilidad (scope
resolution operator). Este operador, antepuesto al nombre de una variable global que está oculta
por una variable local del mismo nombre, permite acceder al valor de la variable global 6 .
Considérese el siguiente ejemplo:
int a =2; //declaración de una variable global a
void main(void)
{
...
printf("a = %d", a); // se escribe a = 2
int a = 10; // declaración de una variable local a
printf("a = %d", a); // se escribe a = 10
printf("a = %d", ::a); // se escribe a = 2
}
El operador (::) no permite acceder a una variable local definida en un bloque más exterior
oculta por otra variable local del mismo nombre. Este operador sólo permite acceder a una variable
global oculta por una variable local del mismo nombre.