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.