static

De cppreference.com
Saltar a: navegación, buscar


La palabra static puede ser utilizada en 4 formas distintas:

  1. Para crear una variable que mantenga su valor permanentemente en una función.
  2. Para crear una copia de una variable que sea compartida por todos los objetos de la misma clase.
  3. Para declarar funciones miembro que actúen como funciones "no-miembro."
  4. Para especificar un linkeo interno.

Contenido

[editar] Almacenamiento permanente

Las variables locales Static, pueden conservar su valor en una instancia del programa. Esto quiere decir, que si una función que contiene una variable static es llamada varias veces, esta conserva el último valor asignado. Por ejemplo, en el siguiente código la variable estática "counter" cuenta el número de veces que la funcion foo() es llamada. Si la variable no fuera estática, counter siempre perdería su valor al terminar "foo()".:

void foo() {
  static int counter = 0;
  cout << "foo ha sido llamada " << ++counter << " veces\n";
}
 
int main() {
  for( int i = 0; i < 10; ++i ) foo();
}


[editar] Copia de una variable

Cuando es utilizada como dato miembro, todas las "instanciaciones" de una clase comparten una copia de la variable. Esto es, dos objetos de tipo Foo A1, A2 son creados, si A1 modifica numFoos, A2 puede observar este cambio. Por ejemplo:

class Foo {
public:
  Foo() {
    ++numFoos;
    cout << "Ahora se han creado " << numFoos << " instancias de la clase Foo\n";
  }
private:
  static int numFoos;
};
 
int Foo::numFoos = 0;  // Alocación de la memoria para numFoos y su inicialización
 
int main() {
  Foo f1;
  Foo f2;
  Foo f3;
}

En el código anterior, la variable static esta siendo compartida por las tres instancias de la clase Foo (f1, f2 y f3) y todas mantienen del número de veces que Foo ha sido instanciada.

[editar] Funciones de una clase que pueden ser llamadas sin el objeto

Cuando son utilizadas en una clase como funciones miembro, estas no toman una instanciación previa como si fueran una función libre que no depende de una clase. Esto quiere decir; que una función static puede ser llamada sin crear una instancia de la clase que la contiene.


class Foo {
public:
  Foo() {
    ++numFoos;
    cout << "Se han creado " << numFoos << " instancias de la clase Foo\n";
  }
  static int getNumFoos() {
    return numFoos;
  }
private:
  static int numFoos;
};
 
int Foo::numFoos = 0;  // Alocación de la memoria y la inicialización de numFoos
 
int main() {
  Foo f1;
  Foo f2;
  Foo f3;
  cout << "Hemos creado " << Foo::getNumFoos() << " instancias de la clase Foo\n";
}


[editar] Linkeo interno

Cuando es usada como una funcion libre, una variable global, o como una constante global, se especifica un "linkeo" interno. Esto limita el acceso del dato o la función del archivo actual. (a revisar)

Related: extern

Herramientas personales
Espacios de nombres
Variantes
Acciones
Navegación
Herramientas
Otros idiomas