Ámbito de las variables

El ámbito o alcance en un programa de una variable es la parte del programa donde la variable es accesible.

Básicamente podemos dividir a las variables en función del ámbito como locales o globales.

Variables globales

Las variables globales son accesibles por todas las funciones desde su declaración hasta el final del fichero.

El uso de variables globales no es aconsejable a pesar de que parezca útil y cómodo:

  • Disminuye la legibilidad

  • Su uso puede producir efectos colaterales, al producirse alteraciones no previstas de su valor en una parte del programa que afectan a su uso en otra zona.

  • Dificultan la modularidad del código.

Las variables y/o funciones globales se justifican cuando se necesitan en casi todas las funciones del programa.

Las variables std::cin y std::cout, que estudiaremos en breve, son globales).

Ejemplo de uso de variables globales

Las funciones de este programa, main() y mi_funcion(), son interdependientes. Esto es, en general, ¡una situación no deseable!

#include <iostream>
double z = 1.;        // Se declara z como global.
void mi_funcion();  // Estudiaremos las funciones mas adelante
int main()
{
   std::cout << z << std::endl;
   z = z + 1.;
   std::cout << z << std::endl;
   mi_funcion();     // Funcion modifica el valor de z
   std::cout << z << std::endl;
}
void mi_funcion() //Estudiaremos las funciones más adelante
{
   z = z*z;
}

Edita, compila y ejecuta el código

Advertencia

¡En este curso no se permitirá el uso de variables globales! Veremos más adelante una solución de compromiso, los espacios de nombres (namespaces).

Variables locales

Las variables locales son accesibles desde su declaración hasta el final del bloque de código del fichero en el que han sido declaradas.

Un bloque de código viene determinado por una pareja de llaves { }.

Si el bloque donde se ha declarado la variable local contiene a su vez otros bloques, también es accesible dentro de ellos.

En caso de que una variable aparezca declarada en varios niveles de anidamiento dentro de un bloque, prevalece la declaración del bloque más interno.

#include <iostream>
using namespace std;

int main()
{
   double z = 0.;
   cout << z << endl;
   {
      z = z + 1.;
      {
         int z = 2;    //Declaración local con el mismo nombre
         cout << z << endl;
      }
      {
         cout << z << endl;
      }
   }
}

Edita, compila y ejecuta el código

Atención

Dada su escasa legibilidad, las declaraciones anidadas de la misma variable, como las del ejemplo, son situaciones que nunca deberían ocurrir en un programa bien diseñado.

Las variables locales se destruyen, dejan de ser accesibles, cuando la ejecución del programa abandona el bloque donde han sido declaradas.

Nota

El término destruir hace referencia a que el bloque de memoria asociado a la variable pasa a estar disponible para albergar otra variable que se defina posteriormente en el programa, que eventualmente sobrescribirá los bits antiguos.

En la siguiente figura se visualizan los diferentes ámbitos del ejemplo anterior.

../../_images/ambito_variables.jpg