static 在 C++ 中本质控制链接性和生存期;类内 static 成员需声明与定义分离,C++17 起可用 inline static;static 成员函数无 this 指针;static 局部变量首次调用初始化且线程安全;全局 static 具内部链接,现代推荐用匿名命名空间替代。
static 在 C++ 里不是“静态”这么简单,它本质是控制名字的**链接性(linkage)和生存期(lifetime)**;用错地方,轻则变量不共享、重则 ODR 违规或未定义行为。
static 修饰类内成员变量:必须声明+定义分离
类内 static 成员变量只是**声明**,不分配内存;必须在类外单独定义(且仅一次),否则链接时报 undefined reference。
- 头文件中写声明:
class A { static int count; }; - 源文件(.cpp)中写定义:
int A::count = 0;(不能加static) - 若在头文件里直接定义(如
static int count = 0;),每个包含该头的编译单元都会生成一份副本 → 违反 ODR,行为未定义 - C++17 起可用
inline static在类内定义:inline static int count = 0;,安全且简洁
static 成员函数:无 this 指针,只能访问 static 成员
static 成员函数属于类而非对象,没有隐式 this 参数,因此:
- 不能访问非
static数据成员或调用非static成员函数 - 可直接通过类名调用:
A::func(),无需实例 - 不能被
virtual、const或volatile修饰 - 常用于工厂函数、配置初始化、工具逻辑等与具体对象无关的操作
static 局部变量:只初始化一次,生存期贯穿整个程序
函数内 static 变量在**首次执行到其定义语句时初始化**,之后每次调用都复用同一块内存: