Preste atención al uso de palabras clave estáticas en C ++

Uno, estático en programación orientada a procesos

Variables globales estáticas
  • Hay un área de datos globales en la variable.
  • Las variables globales que no se inicializan manualmente se inicializarán automáticamente a 0.
  • Las variables globales estáticas son visibles en todo el archivo en el que se declaran e invisibles fuera del archivo.

La distribución de un programa completo en la memoria: área de código, área de datos globales, área de pila, área de pila.

Código de referencia:  

 #include<iostream>  
    using namespace std;  
      
    static int n;  //定义静态全局变量  
      
    void fn()  
    {  
        n++;
        cout<<n<<endl;  
    }  
      
    int main(void)  
    {  
        n = 20;//初始化  
        cout<<n<<endl;  
        fn();  
        return 0;  
    }  
resultado de la operación:

Comparación de variables globales y variables globales estáticas:

  • Las variables globales se pueden compartir en diferentes archivos
  • Otros archivos no pueden utilizar variables globales estáticas
        //File1  
        #include<iostream>  
        using namespace std;  
          
        void fn();  
        int n;  //定义静态全局变量 ,尝试加上static关键字是否能成功 
          
        int main(void)  
        {  
            n = 20;  
            cout<<n<<endl;  
            fn();  
            return 0;  
        }  
          
        

    //File2  
        #include<iostream>  
        using namespace std;  
          
        extern int n;  
          
        void fn()  
        {  
            n++;  
            cout<<n<<endl;  
        }  
    Variable local estática

Agregue la palabra clave estática antes de la variable local para convertirse en una variable local estática

caracteristicas:

  • Variables locales estáticas en el área de datos globales
  • Las variables globales estáticas se inicializan por primera vez cuando el programa se ejecuta a la declaración del objeto, es decir, las llamadas a funciones posteriores no se inicializarán
  • Las variables globales estáticas generalmente se inicializan en el lugar de la declaración. Si no se inicializan explícitamente, el programa las inicializará automáticamente a 0
  • Las variables estáticas de la biblioteca completa siempre residen en el área de datos globales hasta el final del programa.

    #include<iostream>  
    using namespace std;  
      
    void fn();  
      
    int main(void)  
    {  
        fn();  
        fn();  
        fn();  
        return 0;  
    }  
      
    void fn()  
    {  
        static int n = 10;  
        cout<<n<<endl;  
        n++;  
    }  

resultado de la operación:

Función estática

La palabra clave estática se agrega delante del tipo de función para definir una función estática. Las funciones estáticas solo se pueden usar en este archivo y no pueden ser usadas por otros archivos.

En segundo lugar, la palabra clave estática en la programación orientada a objetos

Miembro de datos estáticos
  • Para miembros de datos no estáticos, cada vez que se define un nuevo objeto, se generará una nueva copia. El miembro de datos estáticos es un miembro de la clase, no importa cuántos objetos de esta clase estén definidos, solo hay una copia del miembro de datos estáticos en el programa, es decir, los miembros de este tipo son compartidos por todos los objetos y la memoria se asigna una vez y todos los objetos de esta clase Se puede acceder al objeto, por lo que se actualiza su valor.
  • Los miembros de datos estáticos se almacenan en el área de datos globales. Debido a que la definición del miembro de datos estáticos es para asignar espacio, no se puede definir en la declaración de clase. El siguiente programa, int Myclass :: Sum = 0; es para definir miembros de datos estáticos.
  • Debido a que los miembros de datos estáticos están en el área de datos globales, se pueden manipular cuando no hay una instancia de la clase.
  • La inicialización de miembros de datos estáticos es diferente de la inicialización de miembros de datos generales. Formato de inicialización de miembros de datos estáticos: <tipo de datos> <nombre de clase> :: <nombre de miembro de datos estáticos>: = <valor>.
  • Los miembros de datos estáticos se utilizan para almacenar los atributos que tiene cada objeto. Siempre que se cambie una vez, se cambiará toda la información de esta categoría.
  • En comparación con las variables globales, los miembros de datos estáticos tienen las ventajas: los miembros de datos estáticos no entran en el espacio de nombres global, por lo que no hay posibilidad de conflicto con otros nombres globales; pero para lograr el ocultamiento de información, los miembros de datos estáticos pueden ser privados, pero las variables globales no. .

    #include<iostream>  
    using namespace std;  
      
    class Myclass  
    {  
    private:  
        int a , b , c;  
        static int sum;  //声明静态数据成员  
    public:  
        Myclass(int a , int b , int c);  
        void GetSum();  
    };  
      
    int Myclass::sum = 0;   //定义并初始化静态数据成员  
      
    Myclass::Myclass(int a , int b , int c)  
    {  
        this->a = a;  
        this->b = b;  
        this->c = c;  
        sum += a+b+c;  
    }  
    void Myclass::GetSum()  
    {  
        cout<<"sum="<<sum<<endl;  
    }  
      
    int main(void)  
    {  
        Myclass M(1 , 2 , 3);  
        M.GetSum();  
        Myclass N(4 , 5 , 6);  
        N.GetSum();  
        M.GetSum();  
        return 0;  
    }  

Función de miembro estático
  • Al igual que las variables estáticas, las funciones miembro estáticas sirven a la clase en lugar de a un objeto específico de la clase, son la implementación interna de la clase y pertenecen a la clase.
  • Las funciones miembro ordinarias generalmente implican el puntero this, que apunta al objeto de la propia clase, porque las funciones miembro ordinarias pertenecen a un objeto específico. Generalmente, estos valores predeterminados, como la función fn () es en realidad this-> fn (). La función miembro estática no tiene nada que ver con el objeto de la clase, por lo que no tiene este puntero. Por lo tanto, las funciones miembro estáticas no pueden acceder a los miembros no estáticos y las funciones miembro no estáticas que pertenecen al objeto de clase y solo pueden llamar a los miembros estáticos restantes.
  • Los miembros no estáticos pueden llamar a miembros estáticos a voluntad, pero no al revés.

    #include<iostream>  
    using namespace std;  
      
    class Myclass  
    {  
    private:  
        int a , b , c;  
        static int sum;  //声明静态数据成员  
    public:  
        Myclass(int a , int b , int c);  
        static void GetSum();  //声明静态成员函数  
    };  
      
    int Myclass::sum = 0;   //定义并初始化静态数据成员  
      
    Myclass::Myclass(int a , int b , int c)  
    {  
        this->a = a;  
        this->b = b;  
        this->c = c;  
        sum += a+b+c;    //非静态成员函数可以访问静态数据成员  
    }  
    void Myclass::GetSum()    //静态成员函数的实现  
    {  
        //cout<<a<<endl;    //错误代码,a是非静态数据成员  
        cout<<"sum="<<sum<<endl;  
    }  
      
    int main(void)  
    {  
        Myclass M(1 , 2 , 3);  
        M.GetSum();  
        Myclass N(4 , 5 , 6);  
        N.GetSum();  
        Myclass::GetSum();  
        return 0;  
    }  


Supongo que te gusta

Origin blog.csdn.net/zl1107604962/article/details/78995147
Recomendado
Clasificación