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

【C/C++】static关键字的作用

在C语言中,static关键字的作用取决于它的使用场景。主要有以下两种情况:

1. 修饰局部变量(函数内部)

作用

  • 将局部变量的存储位置从栈内存改为静态内存(全局数据区),使其生命周期延长至整个程序运行期间。
  • 变量只会在第一次调用函数时初始化,后续调用保留上次的值。
  • 不影响变量的作用域,它仍然只能在函数内部访问。

示例

#include <stdio.h>void counter() {static int count = 0;  // 仅在第一次调用时初始化count++;printf("Count: %d\n", count);
}int main() {counter();  // 输出: Count: 1counter();  // 输出: Count: 2counter();  // 输出: Count: 3return 0;
}

对比
count不加static,每次调用函数时都会重新初始化为0,输出始终为1。

2. 修饰全局变量或函数

作用

  • 限制变量或函数的作用域:使其仅在定义它的文件(.c)内可见,其他文件无法通过extern引用。
  • 避免命名冲突,实现文件级的封装。

示例

// file1.c
static int private_data = 100;  // 仅file1.c可见static void private_func() {  // 仅file1.c可见printf("Private function\n");
}void public_func() {  // 可被其他文件调用private_func();  // 内部可正常调用
}
// file2.c
extern int private_data;  // 错误!无法引用其他文件的static变量
extern void private_func();  // 错误!无法引用其他文件的static函数
extern void public_func();  // 正确!public_func未被static修饰int main() {public_func();  // 可以调用return 0;
}

3. 在C++中的额外作用(拓展)

在C++中,static还有以下用途:

(1) 类的静态成员变量
  • 所有对象共享同一个变量实例。
  • 必须在类外初始化。

示例

class MyClass {
public:static int count;  // 声明静态成员变量
};int MyClass::count = 0;  // 定义并初始化int main() {MyClass::count = 10;  // 直接通过类名访问return 0;
}
(2) 类的静态成员函数
  • 不依赖于对象实例,可直接通过类名调用。
  • 不能访问非静态成员变量或函数(没有this指针)。

示例

class MathUtils {
public:static int add(int a, int b) {  // 静态成员函数return a + b;}
};int main() {int result = MathUtils::add(3, 4);  // 无需创建对象return 0;
}

总结

场景作用
局部变量延长生命周期(存储在静态内存),保留上次调用的值。
全局变量/函数限制作用域为当前文件,避免被其他文件引用。
C++类成员实现类级别的共享数据或工具函数(不依赖对象实例)。

关键点

  • static在C中主要用于控制变量的存储位置和作用域。
  • 在C++中扩展了类静态成员的概念,用于实现类级别的属性和方法。
http://www.xdnf.cn/news/553159.html

相关文章:

  • 计算机图形学Games101笔记--几何
  • 计算机视觉与深度学习 | matlab实现ARIMA-WOA-CNN-LSTM时间序列预测(完整源码和数据)
  • VMD查看蛋白质-配体的分子动力学模拟轨迹
  • 【Redis实战篇】达人探店
  • Golang的代码注释规范与实践
  • 机器学习第十八讲:混淆矩阵 → 诊断模型在医疗检查中的误诊情况
  • 33、魔法防御术——React 19 安全攻防实战
  • 每日算法刷题Day11 5.20:leetcode不定长滑动窗口求最长/最大6道题,结束不定长滑动窗口求最长/最大,用时1h20min
  • AMO——下层RL与上层模仿相结合的自适应运动优化:让人形行走操作(loco-manipulation)兼顾可行性和动力学约束
  • 【优秀三方库研读】在 quill 开源库中 QUILL_MAGIC_SEPARATOR 的作用是什么,解决了什么问题
  • 【爬虫】12306自动化购票
  • 【VS Code】Qt程序的调试与性能分析
  • SN生成流水号并且打乱
  • LTX-Videov本地部署教程:时空扩散+多尺度渲染,重塑AI视频研究范式
  • 第 4 章:网络与总线——CAN / Ethernet / USB-OTG
  • STM32中的ADC
  • CSS之box-sizing、图片模糊、计算盒子宽度clac、(重点含小米、进度条案例)过渡
  • 喷涂喷漆机器人详解
  • python-leetcode 68.有效的括号
  • RSA加解密实战指南:Java与JavaScript实现详解 + 在线工具推荐
  • PyTorch 之 torch.distributions.Categorical 详解
  • Vue 3.0 Transition 组件使用详解
  • 高等数学笔记——向量代数与空间解析几何1
  • Mujoco 学习系列(一)安装与部署
  • C#新建打开文件对话框
  • 机器学习 集成学习方法之随机森林
  • Oracle中如何解决LATCH:CACHE BUFFERS LRU CHAIN
  • 精益数据分析(73/126):黏性阶段的功能优先级法则——七问决策模型与风险控制
  • 【神经网络与深度学习】扩散模型之原理解释
  • 调皮用法|python语言中的self参数