static
目录
static
-
什么是static
-
下述代码括号里面传的就是
this pointer当不是静态方法的时候 c1, c2, c3调用同一个函数 那么就是靠this point区分到底是c1 还是 c2 的
1 2 3 4 5 6 7 8complex c1, c2, c3; cout << c1.real(); cout << c2.real(); // 上述代码其实要是看透本质等于下面代码 complex c1, c2, c3; cout << complex::real(&c1); cout << complex::real(&c2); -
所以静态就是不带这个
this pointer -
静态用在哪 - 存储静态的数据 不会变动的
-
static的修饰
- static 修饰局部变量
- 存放原本从栈区变成了静态存储区
- 生命周期原本从包含语句模块结束变成了延续到整个程序结束
- 作用域不发生变化
- static 修饰全局变量
- static全局变量会存在静态存储区
- 生命周期会延续到整个程序结束
- 作用域从原本的全文件共享,变成了定义文件共享
- static 修饰函数
- 跟全局变量类似,作用域发生了改变
- static 修饰成员变量
- 静态成员变量是在类内进行声明,在类外进行定义和初始化,在类外进行定义和初始化的时候不要出现 static 关键字和 private、public、protected 访问规则
- 静态成员变量相当于类域中的全局变量,被类的所有对象所共享,包括派生类的对象,且只能该变量只能被初始化一次,不能在类的构造函数中对静态成员变量进行初始化
- 静态成员变量可以作为成员函数的默认参数,而普通成员变量不可以
- 静态数据成员的类型可以是所属类的类型,而普通数据成员的类型只能是该类类型的指针或引用
- static 修饰成员函数
- 静态成员函数不能调用非静态成员变量或者非静态成员函数,因为静态成员函数没有
this指针。静态成员函数做为类作用域的全局函数 - 静态成员函数不能声明成 virtual function、const funciton、volatile function
- 静态成员函数不能调用非静态成员变量或者非静态成员函数,因为静态成员函数没有
- static 对象
- 静态对象的生存周期为整个程序的生命周期,而非静态对象的生命周期只存在于某个循环中
inline 与 static
-
在c++17之后 静态成员直接类内inline就可以省去类外初始化的麻烦
1 2 3 4 5 6class Person { public: ... private: inline static uint8_t age = 0; }