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

static的三种作用

文章目录

  • 1.C 静态局部变量时
  • 2.C 静态全局变量/函数时
  • 3.C++ 类静态成员时
    • 静态成员变量
    • 静态成员函数


1.C 静态局部变量时

作用:函数内的“记忆者”
代码:

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

特性:

  1. 存储在静态存储区
  2. 只初始化一次(首次执行时)
  3. 保持值跨函数调用(
  4. 默认初始化为0(static int x;等价于static int x = 0;

内存布局:
±------------------+
| 栈区 | ← 普通局部变量
±------------------+
| 堆区 | ← malloc分配的内存
±------------------+
| 静态存储区 | ← static变量在此
| ±-------+ |
| | count | |
| ±-------+ |
±------------------+
| 代码区 | ← 程序指令
±------------------+

2.C 静态全局变量/函数时

作用:文件内的“隐私保护者”
代码:
module1.c

static int hiddenVar = 42;  // 只能在本文件访问static void privateFunc() { // 只能在本文件调用printf("私有函数\n");
}void publicFunc() {privateFunc();  // 正确:同文件可调用printf("访问隐藏变量: %d\n", hiddenVar);
}

module2.c

extern void publicFunc(); int main() {publicFunc();// privateFunc();   // 错误!不可见// hiddenVar = 10; // 错误!不可见return 0;
}

特性:
1.实现封装:隐藏模块内部实现细节
2.避免命名冲突:不同文件的同名static变量互不影响
3.提高安全性:防止外部代码意外修改内部状态

3.C++ 类静态成员时

静态成员变量

作用:类的”共享状态“
代码:

class Player {
public:static int totalPlayers;  // 声明Player() {totalPlayers++;  // 所有对象共享计数器}static int getTotal() { return totalPlayers; }
};// 必须在类外定义和初始化!
int Player::totalPlayers = 0; int main() {Player p1;Player p2;cout << "玩家数量: " << Player::getTotal(); // 输出2
}

特性:
1.不属于任何对象,属于类本身
2.必须在类外单独定义和初始化
3.可通过类名直接访问(Player::totalPlayers)
4.所有对象共享同一份副本

静态成员函数

作用:类的“工具集”
代码:

class MathUtils {
public:static double pi() { return 3.1415926; }static int add(int a, int b) { return a + b; }
};// 使用示例:
double circleArea = MathUtils::pi() * radius * radius;
int sum = MathUtils::add(5, 3);

在这里插入图片描述

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

相关文章:

  • 【C++】模拟实现map和set
  • [Linux入门] Linux磁盘管理与文件系统
  • YOLOv3 中的 IoU 计算详解
  • 在Ubuntu linux终端写文件的方法
  • FFmpeg开发笔记(七十一)使用国产的QPlayer2实现双播放器观看视频
  • 【Zephyr 系列 25】多芯片协同设计:主控 + BLE + LoRa 芯片的统一调度与消息系统
  • 什么是泛型,如何使用它?
  • 动态组件(component)的高级使用
  • PL端DDR3读写(1)
  • 转换专家从格式转换到创意剪辑的全链路解决方案
  • AIGC 基础篇 Python基础(练习1)
  • 板凳-------Mysql cookbook学习 (十--6)
  • Python6.14打卡(day46)
  • StampedLock入门教程
  • 面试问题总结——关于C++(四)
  • 【卫星通信】3GPP标准提案:面向NB-IoT(GEO)场景的IMS信令优化方案-降低卫星通信场景下的语音呼叫建立时延
  • ELK日志文件分析系统——L(Logstash)
  • Flutter 状态管理与 API 调用的完美结合:从理论到实践
  • python实战:使用Python合并PDF文件
  • pyqt5,python开发软件,文件目录如何设置,如何引用,软件架构如何设计
  • 洛谷 P5711:闰年判断
  • 基于Python学习《Head First设计模式》第十一章 代理模式
  • 「Linux中Shell命令」Shell常见命令
  • Vue 3 砸金蛋互动抽奖游戏
  • Redis事务与驱动的学习(一)
  • 出现端口占用,关闭端口进程命令
  • Redis三种集群概述:主从复制、哨兵模式与Cluster模式
  • MySQL 究极奥义·动态乾坤大挪移·无敌行列转换术
  • SSH参数优化与内网穿透技术融合:打造高效远程访问解决方案
  • Android 获取签名 keystore 的 SHA1和MD5值