C++ - Static 关键字

C++ 学习笔记

C++ 关键字 — static

用法总结

  • 总的来说,static关键字有三个用法:
    • 在 class/struct 内部
    • 在 class/struct 外部
    • local static var

在 class/struct 内部

  • static修饰的类成员属于类,不属于对象

修饰类中成员 - 类的共享数据

  • static类对象必须要在类外进行初始化
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #include <iostream>
    using namespace std;

    class Entity{
    public:
    static int x;
    void print()
    {
    cout << x << endl;
    }
    };

    int Entity::x; // static类对象的初始化

    // 程序的主函数
    int main()
    {
    Entity e1;
    Entity e2;

    e1.x=1;
    e2.x=2;

    e1.print();
    e2.print();

    return 0;
    }

修饰类中成员函数

  • 由于static修饰的类成员属于类,不属于对象,因此static类成员函数是没有this指针的,this指针是指向本对象的指针。
  • 正因为没有this指针,所以static类成员函数,不能访问非static的类成员,只能访问 static修饰的类成员。

在 class/struct 外部

  • 表示只在当前的编译单元引用

example1

  • 在demo1.cpp中

    1
    static int x = 7;
  • 在demo2.cpp中

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <iostream>
    using namespace std;

    int x;

    function main()
    {
    cout << x << endl;
    }
  • 编译的时候就会报错,因为x只在demo1.cpp中才可以被使用

  • 类似的,function 和 var 有类似的用法,static 的 function 只可以在当前的解释单元被使用

example2

  • 如果在 头文件 中申明 static变量
  • 那么每一个include的文件都会有一个单独的 static 变量,因为 include 就相当于将这段代码copy进去

local static var

  • 主要关注点变量的生命周期

  • 注意 static 关键字在 function 中的用法

demo1

1
2
3
4
5
6
function test()
{
static int x = 0;
x++;
cout << x << endl;
}
  • x变量只会创建一次
  • 每次调用test函数,x都会增加,打印的值也会增加