静态的

static 存储类说明符有三种不同的含义。

  1. 为在命名空间范围内声明的变量或函数提供内部链接。

    // internal function; can't be linked to
    static double semiperimeter(double a, double b, double c) {
        return (a + b + c)/2.0;
    }
    // exported to client
    double area(double a, double b, double c) {
        const double s = semiperimeter(a, b, c);
        return sqrt(s*(s-a)*(s-b)*(s-c));
    }
    
  2. 声明一个变量具有静态存储持续时间(除非它是 thread_local)。命名空间范围变量是隐式静态的。静态局部变量只初始化一次,第一次控制通过其定义,并且每次退出其范围时都不会被销毁。

    void f() {
        static int count = 0;
        std::cout << "f has been called " << ++count << " times so far\n";
    }
    
  3. 当应用于类成员的声明时,声明该成员是静态成员

    struct S {
        static S* create() {
            return new S;
        }
    };
    int main() {
        S* s = S::create();
    }
    

请注意,对于类的静态数据成员,2 和 3 同时应用:static 关键字使成员成为静态数据成员并使其成为具有静态存储持续时间的变量。