# static


## ***static***

1. *什么是static*
   
   - *下述代码括号里面传的就是`this pointer`*
     
     *当不是静态方法的时候 c1, c2, c3调用同一个函数 那么就是靠this point区分到底是c1 还是 c2 的*
     
     ```cpp
     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就可以省去类外初始化的麻烦*
   
   ```cpp
   class Person {
   public:
     ...
   private:
     inline static uint8_t age = 0;
   }
   ```

