C++笔记 - static

182 阅读1分钟

static关键字有两种用法,修饰变量修饰函数

  • 静态变量的生命周期是整个程序的生命周期,即程序直到关闭才释放静态变量

  • 静态变量全局一份,即使对类进行实例化也不能获得多个静态变量,所以会对类的使用有一定的限制作用。

  • 类的静态函数只能访问静态变量或其他静态函数

  • 静态变量在多线程的情况下需要注意数据竞争的问题。


下面看一下静态变量的常用方式:

  • 函数中的静态变量,函数重入时,保持上一次的状态。

    #include <iostream>
    
    size_t get_index(void) {
        static size_t index = 0;
        return index++;
    }
    
    int main(void) {
        for (int i = 0; i < 3; i++) {
            std::cout << get_index() << std::endl;
        }
    }
    

  • 文件范围内的静态变量,实现单例模式的好助手。

    #include <iostream>
    
    class num { 
      public:
        int m_a;
        
      public:
        num(int a);
    };
    
    num::num(int a) : m_a(a) {}
    
    static num g_num = num(10);
    
    void show_num(void) { std::cout << g_num.m_a << std::endl; }
        
    int main(void) { show_num(); }
    

    通过静态变量实现单例模式的好处是:

    • 不需要外部进行初始化,接口可以做得更简单

    • 像调用函数一样调用接口,不需要获取类对象后,再进行调用函数。


  • 类中的静态变量,由所有对象共享

    #include <iostream>
    
    class num { 
      public:
        static int m_a;
    };
    
    int num::m_a = 0;
    
    int main(void) {
        auto n1 = num{};
        auto n2 = num{};
        n1.m_a = 1;
        std::cout << n2.m_a << std::endl; // 输出:1
    } 
    

  • 类中的静态函数

    #include <iostream>
    
    class num {
      public:
        static int m_a;
    
      public:
        static void show_num(void);
        static void add_num(int count);
    };
    
    int num::m_a = 0;
    void num::add_num(int count) { m_a += count; }
    
    void num::show_num(void) {
        num::add_num(1);
        std::cout << m_a << std::endl;
    }
    
    int main(void) { num::show_num(); }
    

    我们能像调用函数一样通过类名范围解析运算符调用类中的静态成员函数