Static (C++)

La palabra clave static se puede utilizar para declarar variables, funciones, miembros de datos de clase y funciones de clase.

De forma predeterminada, un objeto o variable definidos fuera de todos los bloques tiene duración estática y vinculación externa. Duración estática significa que el objeto o la variable se asignan cuando se inicia el programa y se desasignan cuando finaliza el programa. Vinculación externa significa que el nombre de la variable puede verse desde fuera del archivo en el que se declara la variable. A la inversa, la vinculación interna significa que el nombre no es visible fuera del archivo en el que se declara la variable.

La palabra clave static se puede usar en las siguientes situaciones.

  • Cuando se declara una variable o función en el ámbito de archivo (ámbito global o de espacio de nombres), la palabra clave static especifica que la variable o función tienen vinculación interna. Cuando se declara una variable, la variable tiene duración estática y el compilador la inicializa como 0, a menos que se especifique otro valor.

  • Cuando se declara una variable en una función, la palabra clave static especifica que la variable mantiene su estado entre las llamadas a esa función.

  • Al declarar un miembro de datos en una declaración de clase, la palabra clave static especifica que todas las instancias de la clase compartan una copia del miembro. Un miembro de datos estático se debe definir en el ámbito de archivo. Un miembro de datos entero que se declara como const static puede tener un inicializador.

  • Cuando se declara una función miembro en una declaración de clase, la palabra clave static especifica que todas las instancias de la clase comparten la función. Una función miembro estática no puede tener acceso a un miembro de instancia porque la función no tiene un puntero this implícito. Para tener acceso a un miembro de instancia, declare la función con un parámetro que sea un puntero o referencia de instancia.

  • No puede declarar los miembros de una unión como estáticos. Sin embargo, una unión anónima declarada globalmente se debe declarar explícitamente como static.

Para obtener más información, vea auto, extern y register.

Ejemplo

En el ejemplo siguiente se muestra cómo una variable declarada static en una función conserva su estado entre las llamadas a esa función.

// static1.cpp
// compile with: /EHsc
#include <iostream>

using namespace std;
void showstat( int curr ) {
   static int nStatic;    // Value of nStatic is retained
                          // between each function call
   nStatic += curr;
   cout << "nStatic is " << nStatic << endl;
}

int main() {
   for ( int i = 0; i < 5; i++ )
      showstat( i );
}
  

En el ejemplo siguiente se muestra el uso de static en una clase.

// static2.cpp
// compile with: /EHsc
#include <iostream>

using namespace std;
class CMyClass {
public:
   static int m_i;
};

int CMyClass::m_i = 0;
CMyClass myObject1;
CMyClass myObject2;

int main() {
   cout << myObject1.m_i << endl;
   cout << myObject2.m_i << endl;

   myObject1.m_i = 1;
   cout << myObject1.m_i << endl;
   cout << myObject2.m_i << endl;

   myObject2.m_i = 2;
   cout << myObject1.m_i << endl;
   cout << myObject2.m_i << endl;

   CMyClass::m_i = 3;
   cout << myObject1.m_i << endl;
   cout << myObject2.m_i << endl;
}
  

En el ejemplo siguiente se muestra una variable local declarada static en una función miembro. La variable estática está disponible para el programa completo; todas las instancias del tipo comparten la misma copia de la variable estática.

Nota

La asignación de un valor a una variable local estática en una aplicación multiproceso no es segura para subprocesos y no la recomendamos como práctica de programación.

// static3.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
struct C {
   void Test(int value) {
      static int var = 0;
      if (var == value) 
         cout << "var == value" << endl;
      else
         cout << "var != value" << endl;

      var = value;
   }
}; 

int main() {
   C c1;
   C c2;
   c1.Test(100);
   c2.Test(100);
}
  

Vea también

Referencia

Palabras clave de C++

Clases de almacenamiento de C++

Especificadores de clases de almacenamiento estático

Funciones miembro estáticas

Control de acceso y miembros estáticos