目录

static

static

  1. 什么是static

    • 下述代码括号里面传的就是this pointer

      当不是静态方法的时候 c1, c2, c3调用同一个函数 那么就是靠this point区分到底是c1 还是 c2 的

      1
      2
      3
      4
      5
      6
      7
      8
      
      complex c1, c2, c3;
      cout << c1.real();
      cout << c2.real();
      // 上述代码其实要是看透本质等于下面代码
      
      complex c1, c2, c3;
      cout << complex::real(&c1);
      cout << complex::real(&c2);
      
    • 所以静态就是不带这个this pointer

    • 静态用在哪 - 存储静态的数据 不会变动的

static的修饰

  1. static 修饰局部变量
    • 存放原本从栈区变成了静态存储区
    • 生命周期原本从包含语句模块结束变成了延续到整个程序结束
    • 作用域不发生变化
  2. static 修饰全局变量
    • static全局变量会存在静态存储区
    • 生命周期会延续到整个程序结束
    • 作用域从原本的全文件共享,变成了定义文件共享
  3. static 修饰函数
    • 跟全局变量类似,作用域发生了改变
  4. static 修饰成员变量
    • 静态成员变量是在类内进行声明,在类外进行定义和初始化,在类外进行定义和初始化的时候不要出现 static 关键字和 private、public、protected 访问规则
    • 静态成员变量相当于类域中的全局变量,被类的所有对象所共享,包括派生类的对象,且只能该变量只能被初始化一次,不能在类的构造函数中对静态成员变量进行初始化
    • 静态成员变量可以作为成员函数的默认参数,而普通成员变量不可以
    • 静态数据成员的类型可以是所属类的类型,而普通数据成员的类型只能是该类类型的指针或引用
  5. static 修饰成员函数
    • 静态成员函数不能调用非静态成员变量或者非静态成员函数,因为静态成员函数没有 this 指针。静态成员函数做为类作用域的全局函数
    • 静态成员函数不能声明成 virtual function、const funciton、volatile function
  6. static 对象
    • 静态对象的生存周期为整个程序的生命周期,而非静态对象的生命周期只存在于某个循环中

inline 与 static

  1. 在c++17之后 静态成员直接类内inline就可以省去类外初始化的麻烦

    1
    2
    3
    4
    5
    6
    
    class Person {
    public:
      ...
    private:
      inline static uint8_t age = 0;
    }