static
关键字有两种用法, 修饰变量 和 修饰函数.
静态变量
的生命周期是整个程序的生命周期, 即程序直到关闭才释放静态变量
.静态变量
全局一份, 即使对类进行实例化
也不能获得多个静态变量
, 所以会对类的使用有一定的限制作用.- 类的
静态函数
只能访问静态变量
或其他静态函数
. 静态变量
在多线程的情况下需要注意数据竞争
的问题.
下面看一下静态变量
的常用方式:
- 函数中的
静态变量
, 函数重入时, 保持 上一次 的状态.
#include <iostream>
size_t get_index(void) {
static size_t index = 0;
return index++;
}
int main(void) {
for (int i = 0; i < 3; i++) {
std::cout << get_index() << std::endl;
}
}
- 文件范围 内的
静态变量
, 实现单例模式
的好助手.
#include <iostream>
class num {
public:
int m_a;
public:
num(int a);
};
num::num(int a) : m_a(a) {}
static num g_num = num(10);
void show_num(void) { std::cout << g_num.m_a << std::endl; }
int main(void) { show_num(); }
- 通过
静态变量
实现单例模式
的好处是:- 不需要外部进行初始化, 接口可以做得更简单
- 像调用函数一样调用接口, 不需要获取类对象后, 再进行调用函数.
- 类中的
静态变量
, 由所有对象 共享.
#include <iostream>
class num {
public:
static int m_a;
};
int num::m_a = 0;
int main(void) {
auto n1 = num{};
auto n2 = num{};
n1.m_a = 1;
std::cout << n2.m_a << std::endl; // 输出: 1
}
- 类中的
静态函数
.
#include <iostream>
class num {
public:
static int m_a;
public:
static void show_num(void);
static void add_num(int count);
};
int num::m_a = 0;
void num::add_num(int count) { m_a += count; }
void num::show_num(void) {
num::add_num(1);
std::cout << m_a << std::endl;
}
int main(void) { num::show_num(); }
我们能像调用函数一样通过类名
和范围解析
运算符调用类中的静态成员函数
. 如果觉得有帮助,可以扫描右边的微信打赏码支持一下.