0%

static详解

static 是 C++ 中的关键字,用于声明静态成员变量和静态成员函数,以及在局部变量中具有持久性。

1. 静态变量
  1. 静态局部变量:在函数内部声明的静态变量。和全局变量一样,数据都存放在全局区。

    在函数内部声明的静态变量,其生命周期跨越函数调用。它们只会在第一次函数调用时初始化,并且保留其值直到程序结束。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void foo() {
    static int count = 0;
    count++;
    std::cout << "Count: " << count << std::endl;
    }

    int main() {
    foo(); // 输出:Count: 1
    foo(); // 输出:Count: 2
    foo(); // 输出:Count: 3
    return 0;
    }
  2. 静态成员变量:静态成员变量属于类,而不是类的实例。它们被所有类的对象所共享,并且在类的所有实例中只有一个副本。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include <iostream>

    class MyClass {
    public:
    static int count;
    };

    int MyClass::count = 0; // 静态成员变量在类外部进行初始化

    int main() {
    MyClass obj1;
    MyClass::count = 5; // 通过类名访问静态成员变量
    std::cout << "Count: " << obj1.count << std::endl; // 输出:Count: 5,因为静态成员变量是共享的
    return 0;
    }
  3. 静态全局变量:在函数外部声明的静态变量称为静态全局变量。它们的作用域限制在声明它们的文件内,并且在程序的整个生命周期内保留其值。

    说到这,顺便说说extern关键字。它用于声明一个变量或函数是在其他文件中定义的,而不是在当前文件中定义的。即在当前文件中声明在其他文件中定义的变量或函数,以便在当前文件中使用它们。

2. 静态函数

静态成员函数:静态函数属于类,而不是类的实例。它们可以直接通过类名调用,而无需创建类的实例。

1
2
3
4
5
6
7
8
9
10
11
12
class Math {
public:
static int add(int a, int b) {
return a + b;
}
};

int main() {
int sum = Math::add(5, 3); // 直接通过类名调用静态函数
std::cout << "Sum: " << sum << std::endl; // 输出:Sum: 8
return 0;
}