Ámbito y duración de las variables en funciones

Recordemos dos conceptos importantes sobre las variables:

  • El ámbito de una variable define la región del código donde dicha variable es accesible.
  • La duración de almacenamiento (lifetime) es el tiempo durante el cual la variable existe en memoria.

Recordemos los tipos de variables:

Variables locales

  • Se declaran dentro de una función o bloque {}.
  • Ámbito local: solo son accesibles dentro de la función o bloque en el que se definen.
  • Duración automática o local: se crean cuando el flujo de ejecución entra en el ámbito y se destruyen automáticamente al salir.
  • Estudiaremos en el siguiente apartado que los parámetros de una función en C++ se comportan como variables locales.

Ejemplo:

#include <iostream>

// Función sin parámetros
void mostrarContador() {
    // Variable local: solo existe dentro de esta función
    int contador = 0;  

    // Cada vez que se llama a la función, se crea de nuevo
    contador++;

    std::cout << "Valor del contador local: " << contador << std::endl;
}

int main() {
    // Llamamos varias veces a la misma función
    mostrarContador(); // Imprime 1
    mostrarContador(); // Imprime 1 otra vez (porque la variable se reinicia)
    mostrarContador(); // Imprime 1 otra vez

    return 0;
}

Variables estáticas

  • Se definen utilizando la palabra reservada static.
  • Ámbito local: solo son accesibles dentro de la función o bloque en el que se definen.
  • Duración estática o global: existen durante toda la ejecución del programa (no se destruye al salir de la función).
  • Se inicializa solo una vez, la primera vez que se llama a la función y conserva su valor en siguientes llamadas.

Ejemplo:

#include <iostream>

// Función sin parámetros
void mostrarContador() {
    // Variable estática local:
    // - Solo accesible dentro de esta función
    // - Persiste durante toda la ejecución del programa
    static int contador = 0;  

    contador++; // Incrementa su valor acumulado

    std::cout << "Valor del contador estático: " << contador << std::endl;
}

int main() {
    mostrarContador(); // Imprime 1
    mostrarContador(); // Imprime 2
    mostrarContador(); // Imprime 3

    return 0;
}

Variables globales

  • Se declaran fuera de cualquier función o clase, normalmente al inicio del archivo.
  • Ámbito global: Son accesibles desde cualquier función del mismo archivo.
  • Duración estática o global: Su duración es todo el tiempo de ejecución del programa.
  • El uso inadecuado puede dificultar la gestión clara de los recursos.

Ejemplo:

#include <iostream>

int global = 10;  // Variable global

void mostrarGlobal() {
    std::cout << "El valor de la variable global es: " << global << std::endl;
}

int main() {
    mostrarGlobal();  // Imprime el valor actual de 'global'

    global = 20;  // Modificamos el valor de la variable global

    mostrarGlobal();  // Imprime el nuevo valor de 'global'

    return 0;
}