3.6.3. Static

La palabra reservada static tiene varios significados. Normalmente, las variables definidas localmente a una función desaparecen al final del ámbito de ésta. Cuando se llama de nuevo a la función, el espacio de las variables se vuelve a pedir y las variables son re-inicializadas. Si se desea que el valor se conserve durante la vida de un programa, puede definir una variable local de una función como static y darle un valor inicial. La inicialización se realiza sólo la primera vez que se llama a la función, y la información se conserva entre invocaciones sucesivas de la función. De este modo, una función puede «recordar» cierta información entre una llamada y otra.

Puede surgir la duda de porqué no utilizar una variable global en este caso. El encanto de una variable static es que no está disponible fuera del ámbito de la función, de modo que no se puede modificar accidentalmente. Esto facilita la localización de errores.

A continuación, un ejemplo del uso de variables static:

//: C03:Static.cpp
// Using a static variable in a function
#include <iostream>
using namespace std;

void func() {
  static int i = 0;
  cout << "i = " << ++i << endl;
}

int main() {
  for(int x = 0; x < 10; x++)
    func();
} ///:~

Listado 3.25. C03/Static.cpp


Cada vez que se llama a func() dentro del bucle, se imprime un valor diferente. Si no se utilizara la palabra reservada static, el valor mostrado sería siempre 1.

El segundo significado de static está relacionado con el primero en el sentido de que «no está disponible fuera de cierto ámbito». Cuando se aplica static al nombre de una función o de una variable que está fuera de todas las funciones, significa «Este nombre no está disponible fuera de este fichero». El nombre de la función o de la variable es local al fichero; decimos que tiene ámbito de fichero. Como demostración, al compilar y enlazar los dos ficheros siguientes aparece un error en el enlazado:

//: C03:FileStatic.cpp
// File scope demonstration. Compiling and 
// linking this file with FileStatic2.cpp
// will cause a linker error

// File scope means only available in this file:
static int fs; 

int main() {
  fs = 1;
} ///:~

Listado 3.26. C03/FileStatic.cpp


Aunque la variable fs está destinada a existir como un extern en el siguiente fichero, el enlazador no la encontraría porque ha sido declarada static en FileStatic.cpp.

//: C03:FileStatic2.cpp {O}
// Trying to reference fs
extern int fs;
void func() {
  fs = 100;
} ///:~

Listado 3.27. C03/FileStatic2.cpp


El especificador static también se puede usar dentro de una clase. Esta explicación se dará más adelante en este libro, cuando aprenda a crear clases.