C++ static关键字

85 阅读1分钟
  • static修饰局部变量

    作用域 :保持不变,范围都是代码块;

    生命周期 :局部变量生命周期为代码块,static修饰后,局部变量生命周期为整个进程;

    存储区域 :局部变量存储在栈,static修饰后存储在静态数据区;

void test_func() {
    int i = 0;
    static int j = 0;
    printf("i : %d, j : %d\n", i, j);
    i++;
    j++;
}

int main() {
    for (int t = 0; t < 5; t++) {
        test_func();
    }
}

输出如下:

i : 0, j : 0
i : 0, j : 1
i : 0, j : 2
i : 0, j : 3
i : 0, j : 4
  • static修饰全局变量

    全局变量整个工程可见(通过extern),static修饰后,只有当前文件可见;

  • static修饰全局函数

    同全局变量,static修饰后,只有当前文件可见;

  • static修饰成员变量和成员函数

    static修饰的成员变量和成员函数,属于该类而不属于某个类对象,整个类仅有一份;

class Sample_C {
public:
    Sample_C() {}
    ~Sample_C() {}
    
    int m_k;
    static int m_number;
};
int Sample_C::m_number = 0;

int main() {
    Sample_C A;
    Sample_C B;
    printf("A.m_number : %d\n", A.m_number);
    printf("B.m_number : %d\n", B.m_number);
    A.m_number++;
    B.m_number++;
    printf("A.m_number : %d\n", A.m_number);
    printf("B.m_number : %d\n", B.m_number);
    
    printf("A size : %d\n", sizeof(A));  //类对象的大小不包含static成员变量
}

输出如下:

A.m_number : 0
B.m_number : 0
A.m_number : 2
B.m_number : 2
A size : 4