C++中的 static 详解
同学们,今天我们学习 C++ 中一个非常神奇的关键词:
static(静态)
它看起来只有一个单词,但是在 C++ 里面有很多不同的作用。
我们先记住一句最重要的话:
static 的核心作用:改变变量或者函数的“生命周期”和“可见范围”。
简单理解:
普通变量:出生 → 使用 → 消失
static变量:出生 → 一直活着 → 程序结束才消失
一、先理解一个问题:变量什么时候消失?
我们先看普通变量:
#include <iostream> using namespace std; void test() { int x = 10; cout << x << endl; } int main() { test(); test(); }运行:
10 10为什么两次都是10?
因为:
第一次:
进入test() 创建x x=10 输出 离开test() x消失第二次:
重新进入test() 重新创建x x=10所以:
普通变量每次调用函数都会重新创建。
二、static变量:只创建一次
现在加入static:
#include <iostream> using namespace std; void test() { static int x = 10; cout << x << endl; x++; } int main() { test(); test(); test(); }输出:
10 11 12为什么?
第一次:
创建x x=10 输出10 x增加到11第二次:
不会重新创建x 直接使用以前的x 输出11 增加到12第三次:
输出12同学们理解:
普通变量:
像每天发的新铅笔:
星期一: 新铅笔 用完丢掉 星期二: 再发一支static变量:
像你的名字:
出生以后一直存在 不会每天重新生成三、static最重要的作用1:保存函数中的数据
这是最常见的用途。
例如:
我们想统计函数调用次数。
普通写法:
int count() { int n=0; n++; return n; }调用:
cout<<count()<<endl; cout<<count()<<endl; cout<<count()<<endl;结果:
1 1 1为什么?
因为:
每次n都是新的。
使用static:
int count() { static int n=0; n++; return n; }结果:
1 2 3因为:
n记住了以前的值。
四、static的作用2:限制变量的作用范围
比如:
int a=10; int main() { }这个变量:
整个程序都可以访问。
叫:
全局变量
但是:
如果:
void test() { static int x=10; }那么:
x只能在test里面使用。
例如:
void test() { static int x=10; } int main() { cout<<x; }错误!
因为:
x只属于test函数五、static和普通局部变量的区别
看这个表:
| 特点 | 普通局部变量 | static局部变量 |
|---|---|---|
| 存储位置 | 栈区 | 静态存储区 |
| 生命周期 | 函数结束消失 | 程序结束消失 |
| 创建次数 | 每次调用一次 | 只创建一次 |
| 初始值 | 每次重新初始化 | 只初始化一次 |
六、static变量只初始化一次
看代码:
void test() { static int x=5; cout<<x<<endl; x++; }第一次:
创建x 赋值5 输出5第二次:
不会:
x=5而是:
继续使用旧值6所以:
static初始化:
第一次执行时初始化,以后不再初始化。
七、static在递归中的经典用途
有时会看到。
例如:
计算递归次数:
void dfs() { static int cnt=0; cnt++; cout<<"进入次数:"<<cnt<<endl; }这里:
cnt会一直保存。
八、static修饰全局变量
例如:
文件1:
int a=100;文件2:
extern int a;可以访问。
但是:
如果:
static int a=100;那么:
只能当前文件使用。
也就是说:
static可以保护变量:
别人看不到我九、static修饰函数
例如:
普通函数:
void hello() { }其他文件可以调用。
但是:
static void hello() { }表示:
这个函数只在当前文件有效。
十、C++面向对象中的static(重点)
以后学习类的时候,会遇到:
1. static成员变量
例如:
学生类:
class Student { public: static int count; };表示:
所有学生共享一个count。
比如:
创建学生:
Student a; Student b; Student c;普通变量:
a有一个 b有一个 c有一个static:
所有学生共同拥有一个像:
学校学生总人数。
2. static成员函数
例如:
class Student { public: static void show() { cout<<"hello"; } };可以直接:
Student::show();不用创建对象。
十一、生活中的比喻总结
普通变量:
像:
一次性纸杯 用一次 扔一次static变量:
像:
教室墙上的时钟 大家一起看 一直存在十二、信奥竞赛中static常见用途总结
同学们参加比赛时,有可能见到:
1. 记录次数
static int cnt;例如:
DFS次数
递归次数
搜索节点数量
2. 保存状态
例如:
static int ans;保存答案。
3. 防止重复初始化
例如:
static bool flag=false;第一次执行:
false以后:
保持修改后的状态。
十三、一句话记忆
static = 静态的、固定的、不会重新出生的东西。
变量:
static让变量“活得更久”。
函数:
static让函数“别人看不到”。
类:
static让数据“大家共享”。
课堂练习:
思考下面程序输出:
#include<iostream> using namespace std; void fun() { static int x=1; x*=2; cout<<x<<" "; } int main() { fun(); fun(); fun(); }答案:
2 4 8原因:
第一次: x=1 x*=2 x=2 第二次: x=2 x*=2 x=4 第三次: x=4 x*=2 x=8