Requisito previo: Variables estáticas en C
clave de periodo
La palabra clave estática tiene diferentes significados cuando se usa con diferentes tipos. Podemos utilizar palabras clave estáticas con:
- Variables estáticas: variables en una función, variables en una clase Miembros estáticos de una 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, espacio para se asigna 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 a la función. Esto es útil para implementar corrutinas en C/C++ o cualquier otra aplicación donde sea necesario almacenar el estado anterior de la función.
C++
// C++ program to demonstrate> // the use of static Static> // variables in a Function> #include> #include> 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 el recuento de variables se declara estático. Entonces, su valor se transmite a través de las llamadas a funciones. El recuento de variables 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 compartidos por los objetos. No puede haber múltiples copias de las mismas variables estáticas para diferentes objetos. Además, por esta razón las variables estáticas no se pueden inicializar utilizando constructores.
C++
// C++ program to demonstrate static> // variables inside a class> #include> 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;> }> |
>
>
Producción
undefined reference to `GfG::i' collect2: error: ld returned 1 exit status>
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 clase y el operador de resolución de alcance fuera de la clase, como se muestra a continuación:
C++
cómo descargar música
// C++ program to demonstrate static> // variables inside a class> #include> 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
Objetos de clase 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.
C++
Excepción de puntero nulo
// CPP program to illustrate> // when not using static keyword> #include> using> namespace> std;> class> GfG {> >int> i;> public>:> >GfG()> >{> >i = 0;> >cout <<>'Inside Constructor
'>;> >}> >~GfG() { cout <<>'Inside Destructor
'>; }> };> int> main()> {> >int> x = 0;> >if> (x == 0) {> >GfG obj;> >}> >cout <<>'End of main
'>;> }> |
>
>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 una variable está dentro del bloque if únicamente. Entonces, cuando se crea el objeto, se invoca el constructor y tan pronto como el control del bloque if supera el destructor, se invoca 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.
C++
// CPP program to illustrate> // class objects as static> #include> using> namespace> std;> class> GfG {> >int> i = 0;> public>:> >GfG()> >{> >i = 0;> >cout <<>'Inside Constructor
'>;> >}> >~GfG() { cout <<>'Inside Destructor
'>; }> };> int> main()> {> >int> x = 0;> >if> (x == 0) {> >static> GfG obj;> >}> >cout <<>'End of main
'>;> }> |
>
>Producción
Inside Constructor End of main Inside Destructor>
Puede ver claramente el cambio en la producción. Ahora el destructor se invoca después del final del main. Esto sucedió porque el alcance de los objetos estáticos abarca toda 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 los 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 operador '.' pero se recomienda invocar 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 miembro de la clase.
C++
tipo burbuja java
// C++ program to demonstrate static> // member function in a class> #include> 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:
- Prueba sobre palabras clave estáticas
- Miembros de datos estáticos en C++
- ¿Cuándo se destruyen los objetos estáticos?
- Datos interesantes sobre funciones miembro estáticas
- ¿Pueden las funciones estáticas ser virtuales?
- Comparación de palabras clave estáticas en C++ y Java
- Funciones estáticas en C