Requisito previo: variables estáticas en C
La palabra clave estática tiene diferentes significados cuando se usa con diferentes tipos. Podemos usar palabras clave estáticas con:
Variables estáticas: variables en una función, variables en una clase
Miembros estáticos de clase: objetos de clase y funciones en una clase
Veamos ahora cada uno de estos usos de estática en detalle:
Variables estáticas
- Variables estáticas en una función : cuando una variable se declara como estática, se le asigna espacio durante la vida útil del programa . Incluso si la función se llama varias veces, el espacio para la variable estática se asigna solo una vez y el valor de la variable en la llamada anterior se transfiere a la siguiente llamada de función. Esto es útil para implementar rutinas en C/C++ o cualquier otra aplicación en la que se deba almacenar el estado anterior de la función.
// C++ program to demonstrate
// the use of static Static
// variables in a Function
#include <iostream>
#include <string>
using
namespace
std;
void
demo()
{
// static variable
static
int
count = 0;
cout << count <<
" "
;
// value is updated and
// will be carried to next
// function calls
count++;
}
int
main()
{
for
(
int
i=0; i<5; i++)
demo();
return
0;
}
Producción:
0 1 2 3 4
Puede ver en el programa anterior que la variable cuenta se declara como estática. Por lo tanto, su valor se transmite a través de las llamadas a funciones. La variable count no se inicializa cada vez que se llama a la función.
Como nota al margen, Java no permite variables locales estáticas en funciones . - Variables estáticas en una clase : como las variables declaradas como estáticas se inicializan solo una vez, ya que se les asigna espacio en un almacenamiento estático separado, las variables estáticas en una clase son compartidas por los objetos. No puede haber múltiples copias de las mismas variables estáticas para diferentes objetos. También por esta razón, las variables estáticas no se pueden inicializar usando constructores.
// C++ program to demonstrate static
// variables inside a class
#include<iostream>
using
namespace
std;
class
GfG
{
public
:
static
int
i;
GfG()
{
// Do nothing
};
};
int
main()
{
GfG obj1;
GfG obj2;
obj1.i =2;
obj2.i = 3;
// prints value of i
cout << obj1.i<<
" "
<<obj2.i;
}
Puede ver en el programa anterior que hemos intentado crear múltiples copias de la variable estática i para múltiples objetos. Pero esto no sucedió. Por lo tanto, el usuario debe inicializar explícitamente una variable estática dentro de una clase utilizando el nombre de la clase y el operador de resolución de alcance fuera de la clase, como se muestra a continuación:
// C++ program to demonstrate static
// variables inside a class
#include<iostream>
using
namespace
std;
class
GfG
{
public
:
static
int
i;
GfG()
{
// Do nothing
};
};
int
GfG::i = 1;
int
main()
{
GfG obj;
// prints value of i
cout << obj.i;
}
Producción:
1
Miembros estáticos de la clase
- Clasifique los objetos como estáticos : al igual que las variables, los objetos también cuando se declaran como estáticos tienen un alcance hasta la vida útil del programa.
Considere el siguiente programa donde el objeto no es estático.// CPP program to illustrate
// when not using static keyword
#include<iostream>
using
namespace
std;
class
GfG
{
int
i;
public
:
GfG()
{
i = 0;
cout <<
"Inside Constructor\n"
;
}
~GfG()
{
cout <<
"Inside Destructor\n"
;
}
};
int
main()
{
int
x = 0;
if
(x==0)
{
GfG obj;
}
cout <<
"End of main\n"
;
}
Producción:
Inside Constructor Inside Destructor End of main
En el programa anterior, el objeto se declara dentro del bloque if como no estático. Entonces, el alcance de la variable está dentro del bloque if solamente. Entonces, cuando se crea el objeto, se invoca al constructor y, tan pronto como el control del bloque if supera, se invoca al destructor, ya que el alcance del objeto está dentro del bloque if solo donde se declara.
Veamos ahora el cambio en la salida si declaramos el objeto como estático.// CPP program to illustrate
// class objects as static
#include<iostream>
using
namespace
std;
class
GfG
{
int
i = 0;
public
:
GfG()
{
i = 0;
cout <<
"Inside Constructor\n"
;
}
~GfG()
{
cout <<
"Inside Destructor\n"
;
}
};
int
main()
{
int
x = 0;
if
(x==0)
{
static
GfG obj;
}
cout <<
"End of main\n"
;
}
Producción:
Inside Constructor End of main Inside Destructor
Puede ver claramente el cambio en la salida. Ahora el destructor se invoca después del final de main. Esto sucedió porque el alcance del objeto estático es a lo largo de la vida útil del programa.
- Funciones estáticas en una clase : al igual que los miembros de datos estáticos o las variables estáticas dentro de la clase, las funciones de miembros estáticos tampoco dependen del objeto de la clase. Se nos permite invocar una función miembro estática usando el objeto y el ‘.’ pero se recomienda invocar a los miembros estáticos usando el nombre de clase y el operador de resolución de alcance.
Las funciones de miembros estáticos solo pueden acceder a los miembros de datos estáticos u otras funciones de miembros estáticos , no pueden acceder a los miembros de datos no estáticos ni a las funciones de miembros de la clase.// C++ program to demonstrate static
// member function in a class
#include<iostream>
using
namespace
std;
class
GfG
{
public
:
// static member function
static
void
printMsg()
{
cout<<
"Welcome to GfG!"
;
}
};
// main function
int
main()
{
// invoking a static member function
GfG::printMsg();
}
Producción:
Welcome to GfG!
Artículos relacionados:
- Cuestionario sobre palabra clave estática
- Miembros de datos estáticos en C++
- ¿Cuándo se destruyen los objetos estáticos?
- Datos interesantes sobre las funciones miembro estáticas
- ¿Pueden las funciones estáticas ser virtuales?
- Comparación de palabra clave estática en C++ y Java
- Funciones estáticas en C
Este artículo es una contribución de Harsh Agarwal . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA