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