一.前言在讲static之前先明确两个关键术语· 生命周期变量从创建到销毁的时间段全局变量生命周期是整个程序运行期局部变量是所在函数执行期· 作用域变量 / 函数能被访问的范围全局作用域 整个程序局部作用域 函数 / 代码块内类作用域 类内部。static的核心作用就是延长生命周期、缩小作用域不同场景下侧重点不同。二.static 的 4 个核心使用场景按常用度排序场景 1修饰局部变量函数内的 static 变量作用生命周期从 “函数执行期” 变为 “整个程序运行期”只初始化 1 次程序结束才销毁作用域仍局限在所在函数内外部无法访问。代码示例最经典的计数器#include iostream using namespace std; void countCall() { // static局部变量只初始化1次下次调用直接用上次的值 static int count 0; count; cout 函数被调用了 count 次 endl; } int main() { countCall(); // 输出函数被调用了1次 countCall(); // 输出函数被调用了2次 countCall(); // 输出函数被调用了3次 return 0; }关键说明如果去掉staticcount每次调用都会重置为 0输出永远是 1static局部变量的初始化在程序启动时完成而非函数第一次调用时且只执行 1 次存储位置从 “栈区” 移到 “静态存储区”全局变量也存在这里。场景 2修饰全局变量 / 函数文件级的 static作用作用域从 “整个程序所有源文件” 缩小为 “当前源文件”其他文件无法访问生命周期仍为整个程序运行期无变化。为什么需要全局变量 / 函数默认是 “外部链接”extern其他源文件通过extern就能访问容易导致命名冲突static把它变成 “内部链接”仅限当前文件使用避免冲突。代码示例// file1.cpp #include iostream using namespace std; // static全局变量仅限file1.cpp访问 static int global_num 100; // static函数仅限file1.cpp访问 static void printNum() { cout global_num: global_num endl; } void test() { printNum(); // 合法同一文件内可访问 }// file2.cpp #include iostream using namespace std; // 错误无法访问file1.cpp中的static全局变量 extern int global_num; // 错误无法访问file1.cpp中的static函数 extern void printNum(); int main() { // 编译报错undefined reference to global_num cout global_num endl; // 编译报错undefined reference to printNum() printNum(); return 0; }场景 3修饰类的成员变量静态成员变量作用属于类本身而非类的某个对象所有对象共享同一个静态成员变量生命周期整个程序运行期必须在类外初始化因为不属于任何对象不能在构造函数里初始化。代码示例#include iostream using namespace std; class Student { public: // 静态成员变量统计学生总数所有对象共享 static int total_num; string name; // 构造函数创建对象时总数1 Student(string n) : name(n) { total_num; } }; // 静态成员变量必须在类外初始化关键 int Student::total_num 0; int main() { Student s1(张三); Student s2(李四); Student s3(王五); // 两种访问方式类名::变量 或 对象.变量推荐用类名 cout 学生总数 Student::total_num endl; // 输出3 cout s1对应的总数 s1.total_num endl; // 输出3 return 0; }场景 4修饰类的成员函数静态成员函数作用属于类本身而非对象只能访问静态成员变量 / 函数不能访问非静态成员因为没有 this 指针可以直接通过 “类名函数名” 调用无需创建对象。代码示例#include iostream using namespace std; class Student { public: static int total_num; // 静态成员变量 string name; Student(string n) : name(n) { total_num; } // 静态成员函数获取学生总数只能访问静态成员 static int getTotalNum() { // 错误不能访问非静态成员name没有this指针 // cout name endl; return total_num; } }; int Student::total_num 0; // 初始化静态成员变量 int main() { // 无需创建对象直接通过类名调用静态函数 cout 初始总数 Student::getTotalNum() endl; // 输出0 Student s1(张三); // 也可以通过对象调用不推荐 cout 当前总数 s1.getTotalNum() endl; // 输出1 return 0; }