C++静态
C++ 中的「静态(static)」
static 是 C++ 中作用最多、最容易混淆的关键字,核心分三大场景:局部静态、类/结构体静态、全局静态(补充)
一、局部静态(函数内的 static)
定义
在函数内部用 static 声明的局部变量,叫局部静态变量。
核心特性
- 生命周期:程序启动时分配内存,程序结束才释放(不是函数调用结束就销毁)
- 初始化:只初始化一次,后续调用函数会保留上一次的值
- 作用域:依然只在函数内部可见,外部无法访问
代码示例
#include <iostream>
using namespace std;
void test() {
// 局部静态变量:只初始化 1 次
static int count = 0;
count++;
cout << "count = " << count << endl;
}
int main() {
test(); // 输出 1
test(); // 输出 2
test(); // 输出 3
return 0;
}
结果:count 会持续累加,不会被重置。
二、类 / 结构体中的静态(static 成员)
类/结构体里的 static 分为:静态成员变量、静态成员函数。
1. 静态成员变量
核心特性
- 属于类,不属于对象:所有对象共享同一个变量,不占用对象内存
- 必须类内声明,类外初始化!!!
- 生命周期:程序全局,和程序同生共死
- 访问方式:
类名::变量名或对象.变量名
代码示例
#include <iostream>
using namespace std;
class Person {
public:
// 类内声明静态成员变量
static int total;
Person() {
total++; // 构造时计数
}
};
// 类外初始化(必须写!)
int Person::total = 0;
int main() {
Person p1;
Person p2;
// 直接用类名访问
cout << "总人数:" << Person::total << endl; // 输出 2
return 0;
}
2. 静态成员函数
核心特性
- 属于类,不属于对象
- 只能访问静态成员(静态变量/静态函数),不能访问普通成员变量/函数
- 没有 this 指针
- 访问方式:
类名::函数名()
代码示例
class Person {
public:
static int total;
// 静态成员函数
static void showTotal() {
// 只能访问静态变量
cout << "总人数:" << total << endl;
}
};
int Person::total = 0;
// 调用:
Person::showTotal(); // 无需创建对象,直接用类调用
三、补充:全局静态(文件内的 static)
虽然你没问,但这是 static 三大用法之一,必须补齐:
- 在函数外、全局区声明的
static变量/函数 - 作用域限制在当前文件内,其他文件无法访问(避免命名冲突)
// 全局静态变量:仅当前 .cpp 文件可用
static int num = 100;
static void func() {
// 仅当前文件可调用
}
一张表总结 C++ 静态关键字
| 类型 | 位置 | 生命周期 | 作用域 | 核心特点 |
|---|---|---|---|---|
| 局部静态 | 函数内部 | 程序全程 | 函数内 | 只初始化一次,值会保留 |
| 静态成员变量 | 类/结构体中 | 程序全程 | 类内+友元 | 所有对象共享,类外初始化 |
| 静态成员函数 | 类/结构体中 | 程序全程 | 类内+友元 | 无this,只能访问静态成员 |
| 全局静态 | 文件全局区 | 程序全程 | 当前文件 | 外部文件不可见,防冲突 |
总结
- 局部 static:函数内变量不销毁、保留值
- 类 static:成员属于类、所有对象共享,静态函数只能访问静态成员
- 全局 static:限制作用域在当前文件,避免命名冲突
此文章使用豆包辅助编写完成

浙公网安备 33010602011771号