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(); }
我们能像调用函数一样通过
类名
和范围解析
运算符调用类中的静态成员函数
。