¿Cuáles son las diferencias entre una variable global static y una variable de clase, static?

publicado por: Anonymous

Estoy estudiando más características de C++ por mi cuenta, y me he topado con static, ¿qué diferencias hay entre declarar un static int x = 2 como una variable global, y declarar lo mismo dentro de una clase o un struct?

PD: También me gustaría conocer el funcionamiento de un método con static.

solución

static tiene varios usos:

  • En variable independiente:

    static int algo = 5;
    

Esa variable, aparte de tener duración durante toda la vida del programa, solo es visible en el archivo fuente en la que se declara; es decir, si en 2 archivos .cpp declaras 2 variables static int algo, cada una de ellas es independiente de la otra, y solo son visibles en el propio archivo.

En C++, se puede conseguir el mismo objetivo mediante namespace anónimos:

namespace {
  int Algo = 0;
}

Lo cual consigue el mismo efecto: las variables así declaradas solo son visibles en el archivo fuente en el que se declaran.

  • En variable-miembro de clase:

    class Class {
      static int Algo;
    };
    

Una variable-miembro de una clase así declarada, no necesita una instancia de la clase para poder accederla; es decir, no necesitas

Class instance;
instance.Algo = 0;

Puedes, directamente, hacer

Class::Algo = 0;

Lo cual implica que no ocupa espacio en cada instancia, sino que ocupa 1 única posición de memoria durante toda la vida del programa.

  • En variable automática:

    int algo( void ) {
      static int X = 10;
    
      return ++X;
    }
    

Así usadas, mantienen su ejecución entre llamadas: La primera vez que llamas a algo( ), devuelve 11. La segunda vez, devolverá 12; la tercera vez, 13, …

También presentan una peculiaridad: en los demás modos de empleo, no está definido cuando se inicializarán las variables, en relacion a los archivos fuente en el que se declara; si tiene 3 archivos fuente, con 1 variable static en cada uno, no sabes el ordén en el que se inicializará cada una: si primero las de un archivo o las de otro.

static en variables automáticas, sin embargo, se inicializan la primera vez que las uses, llames desde donde llames a tu función.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *