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

在c++中static用在全局和局部有什么区别

在 C++ 中,static 关键字的作用会根据其使用的上下文(全局作用域、局部作用域等)有所不同。我们可以分别讨论它在全局作用域和局部作用域中的不同含义和作用:

1. 在全局作用域中使用 static

static 关键字用于全局变量或函数时,它的作用是将该变量或函数的作用域限定为定义它的文件内,也就是说,它使得该变量或函数具有内部链接

示例:
// file1.cpp
static int x = 10;  // 全局静态变量,只能在file1.cpp中访问static void foo() {  // 全局静态函数,只能在file1.cpp中调用// do something
}// file2.cpp
extern void foo();  // error: foo is not declared in this scope
  • 全局静态变量 (static 修饰)static 修饰的全局变量在文件外不可见,其他文件中的代码不能访问它。它只在定义它的文件内有效。

  • 全局静态函数 (static 修饰)static 修饰的全局函数同样只在定义它的文件内可见,不能在其他文件中调用。

2. 在局部作用域中使用 static

static 用于局部变量时,它的作用是保持该变量的值在多次函数调用之间的持久性。即使函数调用结束,该局部静态变量仍然存在,并且保持上次函数调用时的值。局部静态变量 只会被初始化一次,并且在后续的函数调用中不会重新初始化。

示例:
void foo() {static int x = 0;  // 局部静态变量,初始化一次,之后保留其值x++;std::cout << "x = " << x << std::endl;
}int main() {foo();  // 输出 x = 1foo();  // 输出 x = 2foo();  // 输出 x = 3return 0;
}
  • 局部静态变量 (static 修饰):该变量的生命周期与程序的生命周期相同,但作用域仅限于所在的函数内部。它在程序执行时只会初始化一次,并在后续调用时保留上次的值。

3. 总结

  • 全局作用域中的 static:限定变量或函数的作用域仅限于定义它的文件内,其他文件无法访问。

  • 局部作用域中的 static:使局部变量在多次函数调用之间保持其值,不会每次进入函数时重新初始化。

这两种用法的关键区别在于,全局作用域中的 static 控制可见性,而局部作用域中的 static 控制变量的生命周期

在 C++ 中,全局的 static 变量和局部的 static 变量在初始化和生命周期方面有一些不同。让我们逐步解析这些差异:

1. 全局 static 变量的初始化

  • 初始化时机:全局 static 变量是在程序启动时初始化的,也就是在程序执行的初期,由程序的启动例程(通常是由运行时环境负责)完成初始化。

    • 全局 static 变量是 在程序加载时进行一次性初始化的,且初始化发生在 main() 函数开始执行之前。

    • 如果没有显式的初始化值,C++ 会将全局静态变量初始化为默认值(如 0nullptr 等)。

示例:
// 全局静态变量
static int globalVar = 5;int main() {// globalVar 在程序启动时已初始化为5return 0;
}
  • 生命周期:全局 static 变量的生命周期与程序的生命周期一致。它从程序开始执行直到程序结束时才会销毁。

    • 在程序执行期间,globalVar 变量始终存在,且在程序退出时会被销毁。

2. 局部 static 变量的初始化

  • 初始化时机:局部 static 变量的初始化发生在 第一次进入其所在的函数时。也就是说,局部静态变量在程序第一次调用包含它的函数时被初始化一次。

    • 一旦局部静态变量被初始化,它的值会在后续的函数调用中被保留。即使函数多次被调用,局部静态变量的值也不会丢失。

示例:
void func() {static int count = 0;  // 仅初始化一次count++;std::cout << count << std::endl;
}int main() {func();  // 输出 1func();  // 输出 2func();  // 输出 3return 0;
}
  • 生命周期:局部 static 变量的生命周期与全局 static 变量类似,它从程序开始直到程序结束才会销毁。但是,它的作用域仅限于其定义的函数内部。

    • 当程序退出时,局部静态变量会被销毁,但在程序运行期间,它始终存在,并且在函数调用之间保留上次的值。

3. 全局和局部 static 变量的主要区别

特性全局 static 变量局部 static 变量
初始化时机程序启动时,初始化一次第一次进入函数时,初始化一次
初始化值如果没有显式初始化,默认为 0如果没有显式初始化,默认为 0
作用域限制在定义它的文件内(文件内可见)限制在定义它的函数内(函数内可见)
生命周期程序运行期间一直存在程序运行期间一直存在
访问权限仅在定义它的文件内可见仅在定义它的函数内可见

4. 全局 static 与局部 static 的生命周期差异

  • 全局 static 变量:它的生命周期是从程序启动开始,直到程序退出时销毁。这意味着无论函数调用多少次,这个变量始终存在。

  • 局部 static 变量:它的生命周期是与程序的生命周期一致的,但它的作用域仅限于定义它的函数内。局部静态变量只在第一次调用时初始化一次,并且在之后的每次调用中保持其值。

小结

  • 全局 static 变量:程序启动时初始化,且生命周期贯穿整个程序运行过程。

  • 局部 static 变量:首次进入函数时初始化,且生命周期贯穿整个程序运行过程,但作用域仅限于所在函数。

希望这能帮助你理解全局 static 和局部 static 变量的初始化时机及生命周期的差异!

http://www.xdnf.cn/news/4667.html

相关文章:

  • Qt开发经验 --- 避坑指南(7)
  • 【链表扫盲】FROM GPT
  • P2392 kkksc03考前临时抱佛脚
  • mongodb升级、改单节点模式
  • 为什么虚拟环境下包找错路径?
  • 堡塔云WAF免费WEB防火墙,从搭建到应用
  • k8s监控方案实践(一):部署Prometheus与Node Exporter
  • 排序算法-冒泡排序
  • [数据库之十三] 数据库索引之散列索引
  • 如何在macOS上通过SSHFS挂载远程文件系统
  • 室内无人机自主巡检解决方案-自主方案
  • 批量清洗与修改 YOLO 标签:删除与替换指定类别
  • uniapp index.html怎么改都不生效
  • Redis如何实现分布式锁
  • 论文学习:《RNADiffFold:使用离散扩散模型的生成RNA二级结构预测》
  • 中级网络工程师知识点2
  • 【se-res模块学习】结合CIFAR-10分类任务学习
  • 嵌入式学习--江协51单片机day3
  • 问题 | 当前计算机视觉迫切解决的问题
  • spring中RequestContextHolder
  • Wubuntu安装时创建分区失败解决方案
  • 预渲染 Prerender
  • 图漾相机——Sample_V2示例程序(待补充)
  • 【UltralyticsYolo11图像分类完整项目-03】Onnx版Cpu预测C++实现
  • 解构语言模型推理过程,超越最终答案:通过分析子思考路径提升大语言模型推理准确性的方法研究
  • FastExcel 本地开发和Linux上上传Resource文件的差异性
  • 直接用字符串方式 split(“。“) 来切句,虽然能把句子拆开,但无法和 BERT 模型的 token 位置对应(embedding 用不上)
  • 高炉炼铁:构建全流程工艺可视化管控体系
  • Redis最新入门教程
  • 多返回值(C++)