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;
}
特性:
- 存储在静态存储区
- 只初始化一次(首次执行时)
- 保持值跨函数调用(
- 默认初始化为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);