Visibilidad y tiempo de vida de variables

Hay dos tipos principales de zona de visibilidad: zona local de visibilidad y zona global de visibilidad.

Una variable declarada fuera de todas las funciones se coloca en la visibilidad global. Estas variables pueden ser accesibles desde cualquier parte del programa. Estas variables se ubican en el pool global de la memoria, por eso el tiempo de sus vidas coincide con el tiempo de vida del programa.

Una variable declarada dentro del bloque (parte del código encerrada dentro de las llaves) pertenece a la visibilidad local. Esta variable no es visible (por tanto no es accesible) fuera del bloque en el que está declarada. El caso más común de la declaración local es una variable declarada dentro de la función. Una variable con declaración local se coloca en una pila, y su tiempo de vida coincide con el tiempo de vida de la función.

Ya que la zona de visibilidad de una variable local es el bloque donde está declarada, hay posibilidad de declarar las variables con los nombres que coincidan con los de las variables declaradas en otros bloques, y también declaradas en los niveles superiores, así sucesivamente hasta el nivel global.

Ejemplo:

void CalculateLWMA(int rates_total,int prev_calculated,int begin,const double &price[])
  {
   int        i,limit;
   static int weightsum=0;
   double     sum=0;
//---
   if(prev_calculated==0)
     {
      limit=MA_Period+begin;
      //--- set empty value for first limit bars
      for(i=0; i<limit; i++) LineBuffer[i]=0.0;
      //--- calculate first visible value
      double firstValue=0;
      for(int i=begin; i<limit; i++)
        {
         int k=i-begin+1;
         weightsum+=k;
         firstValue+=k*price[i];
        }
      firstValue/=(double)weightsum;
      LineBuffer[limit-1]=firstValue;
     }
   else
     {
      limit=prev_calculated-1;
     }
 
   for(i=limit;i<rates_total;i++)
     {
      sum=0;
      for(int j=0; j<MA_Period; j++) sum+=(MA_Period-j)*price[i-j];
      LineBuffer[i]=sum/weightsum;
     }
//---
  }

Preste la atención a la variable i declarada en línea

      for(int i=begin; i<limit; i++)
        {
         int k=i-begin+1;
         weightsum+=k;
         firstValue+=k*price[i];
        }

Su visibilidad es sólo el ciclo for, fuera de este ciclo hay otra variable con el mismo nombre que ha sido declarada al principio de la función. Además, en el cuerpo del ciclo está declarada la variable K, cuya zona de visibilidad es el cuerpo del ciclo.

Se puede declarar las variables locales con el especificador de acceso static. En este caso, el compilador coloca esta variable en el pool global de la memoria. Por tanto, el tiempo de vida de una variable estática coincide con el tiempo de vida del programa. No obstante, la zona de visibilidad de esta variable se limita por el bloque donde está declarada.

Véase también

Tipos de datos, Encapsulación y extensión de tipos, Inicialización de variables, Creación y eliminación de objetos