目录
01 前言
02 变量的作用域与生命周期
2.1 什么是作用域:
2.2 什么是变量的生命周期:
03 局部静态
3.1非静态变量例子
3.2静态变量例子
04 全局变量
05 后话
01 前言
在前几期里,我们了解了static关键字在特定上下文中的含义。
今天我们看一看另一个环境。我们可以在局部作用域中使用 static 来声明一个变量。
这种情况和我们之前看到的两种static有点不同。这次的局部静态 Local static 有更多的含义。
02 变量的作用域与生命周期
正式开始之前我们先了解什么是作用域和生命周期
2.1 什么是作用域:
一段程序代码中所用到的名字并不总是有效或者可用,而限定这个名字可用性的代码范围就是这个名字的作用域。
- 局部变量的作用域是变量所在的局部范围。
- 全局变量的作用域是整个工程。
2.2 什么是变量的生命周期:
变量的创建到变量的销毁之间的一个时间段。
- 局部变量的生命周期:进入作用域生命周期开始,出作用域生命周期结束。
- 全局变量的生命周期:整个程序的生命周期。
03 局部静态
局部 local static 变量允许我们声明一个变量,它的生命周期基本上相当于整个程序的生命周期,然而它的作用范围却被限制在这个函数内。
在任何作用域中声明它都可以,这个和函数没有关系,刚才我只是用函数举了一个例子,它并不仅仅局限在函数内部,也可以在 if 语句中,可以在任何位置。
这就是为什么函数作用域中的 static 和类作用域中的 static之间没有太大区别的原因,因为生命周期实际是相同的。唯一的区别是在类作用域中,类中的任何东西都可以访问它(这个静态变量)。
如果你在函数作用域中声明一个静态变量,它将是那个函数的局部变量。对类来说也是局部变量。
让我们来看一些例子。
3.1非静态变量例子
#include <iostream>
void funtion()
{
int i = 0;
i++;
std::cout << i << std::endl;
}
int main()
{
funtion();
funtion();
funtion();
funtion();
funtion();
return 0;
}
我们创建了个函数funtion,内部定义int i = 0;然后让它自加1,cout函数将结果打印出来
可以看到每一次调用这个函数时 i 都会被设置为 0。然后增加 1,通过调用函数来进行测试。
你可以看到1被打印了5次。
3.2静态变量例子
但是如果我给变量i 设置为static静态变量的话。
#include <iostream>
void funtion()
{
static int i = 0;
i++;
std::cout << i << std::endl;
}
由运行结果分析,当static修饰局部变量i后,变量i在funtion函数中进入后创建,出函数并未后销毁,而是保留了上一次循环i出funtion函数后的值继续作用,即局部变量i被static关键字修饰后,作用域不变,生命周期变长了。
这意味着当我第一次调用函数时,这个变量将被初始化为 0。然后所有对函数的后续调用实际上不会创建另一个全新的变量,而是将第一次初始化的变量i的生命周期延长了
04 全局变量
比如我创建一个全局变量b
#include <iostream>
int b = 0;
void funtion()
{
//static int i = 0;
b++;
std::cout << b << std::endl;
}
int main()
{
funtion();
funtion();
funtion();
b = 10;
funtion();
funtion();
return 0;
}
这样的写法没有任何问题。但是我们可以在任何地方访问 b。比如你可以在 function 函数调用之间让 b 等于 10。这可以极大的改变你的程序所做的事情。
所以如果你想要这样做,但又不希望让每个人都能访问这个变量。你可以在局部作用域下声明成 static。像我一开始写的程序那样。
05 后话
最后,我们要记住
- 局部 local static 变量允许我们声明一个变量,它的生命周期基本上相当于整个程序的生命周期,然而它的作用范围却被限制在这个函数内。
- 在任何作用域中声明它都可以,这个和函数没有关系,刚才我只是用函数举了一个例子,它并不仅仅局限在函数内部,也可以在 if 语句中,可以在任何位置