当前位置: 首页 > news >正文

P14 C++局部静态变量static延长生命周期

目录

01 前言

02 变量的作用域与生命周期

 2.1 什么是作用域:

2.2 什么是变量的生命周期:

03 局部静态

3.1非静态变量例子

3.2静态变量例子

04 全局变量

05 后话 


01 前言

在前几期里,我们了解了static关键字在特定上下文中的含义。

今天我们看一看另一个环境。我们可以在局部作用域中使用 static 来声明一个变量。

这种情况和我们之前看到的两种static有点不同。这次的局部静态 Local static 有更多的含义。

02 变量的作用域与生命周期

正式开始之前我们先了解什么是作用域和生命周期

 2.1 什么是作用域:

一段程序代码中所用到的名字并不总是有效或者可用,而限定这个名字可用性的代码范围就是这个名字的作用域。

  1. 局部变量的作用域是变量所在的局部范围。
  2. 全局变量的作用域是整个工程。

2.2 什么是变量的生命周期:

变量的创建到变量的销毁之间的一个时间段。

  1. 局部变量的生命周期:进入作用域生命周期开始,出作用域生命周期结束。
  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 后话 

最后,我们要记住

  1. 局部 local static 变量允许我们声明一个变量,它的生命周期基本上相当于整个程序的生命周期,然而它的作用范围却被限制在这个函数内。
  2. 在任何作用域中声明它都可以,这个和函数没有关系,刚才我只是用函数举了一个例子,它并不仅仅局限在函数内部,也可以在 if 语句中,可以在任何位置

http://www.lryc.cn/news/245932.html

相关文章:

  • C语言:写一个函数,求字符串的长度,在main函数中输入字符串并输出其长度(指针)
  • CentOS7安装Docker运行环境
  • 单片机调试技巧--栈回溯
  • 分布式锁之基于redis实现分布式锁(二)
  • python中%s的用法(字符串变量赋值办法),长字符串换行办法
  • 【Mybatis】预编译/即时sql 数据库连接池
  • 物联网AI 无线连接学习之WiFi基础篇 802.11协议发展
  • FreeRTOS-队列Queue
  • 车内总线通信技术简述
  • 6.2 Windows驱动开发:内核枚举SSSDT表基址
  • 实时LCM的ImgPilot搭建部署
  • 开源与闭源:大模型未来的发展之争
  • linux系统初始化本地git,创建ssh-key
  • JDBC 操作 SQL Server 时如何传入列表参数
  • [算法总结] - 蓄水池采样算法
  • 【Dockerfile】将自己的项目构建成镜像部署运行
  • flink和机器学习模型的常用组合方式
  • 自动驾驶学习笔记(十二)——定位技术
  • 【MySQL系列】PolarDB入门使用
  • 第二节HarmonyOS DevEco Studio创建项目以及界面认识
  • 网页设计--第5次课后作业
  • Spring Cache框架,实现了基于注解的缓存功能。
  • CSS-鼠标属性篇
  • Fiddler弱网测试究竟该怎么做?
  • 蓝桥杯-平方和(599)
  • 从零构建属于自己的GPT系列1:预处理模块(逐行代码解读)、文本tokenizer化
  • STM32内存介绍
  • Qt::Window 、Qt::Tool是 Qt 框架中的一个窗口标志(Window Flag),用于指定窗口的类型和行为
  • 东胜物流软件 SQL注入漏洞复现
  • 第1章 爬虫基础