Palabra clave estática en C++

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:

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *