Static (C++)

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

De forma predeterminada, un objeto o una variable que son definidas fuera de todos los bloques tiene vinculación externa de duración y externo.La duración estática significa que el objeto o la variable está asignado al iniciar el programa y desasignar cuando finaliza el programa.Vinculación externa significa que el nombre de la variable está visible desde fuera del archivo en el que se declara la variable.A la inversa, vinculación interna significa que el nombre no es visible fuera del archivo en el que se declara la variable.

la palabra clave de static se puede utilizar en las situaciones siguientes.

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

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

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

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

  • No se pueden declarar miembros de una unión como static.Sin embargo, una unión anónima global declarada se debe declarar explícitamente static.

Para obtener más información, vea Auto, extern, y Registrarse.

Ejemplo

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 );
}
  

el ejemplo siguiente 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;
}
  

El ejemplo siguiente se muestra una variable local declarada static en una función miembro.La variable estática está disponible al programa de conjunto; 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 seguro 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 estáticos de la clase de almacenamiento

Funciones miembro static

Control de acceso y miembros Static