345 字
2 分钟
C++入门 (六) : C++中的静态
2026-03-13

类内和类外static的区别#

类外类内
修饰的符号在 link 阶段是局部的,只对定义它的编译单元(.obj)可见这部分内存是这个类的所有实例共享的,多次实例化,static 变量也只会有一个实例(见下篇)

类和结构体外的static#

静态变量存储在静态存储区中,而不是栈或堆上。它们在程序的整个执行期间都存在,并且只有一个实例。

static 变量或函数表示只在该translation unit中有效,链接器不会再去外面找他的定义,有点像类的private属性

\\ Static.cpp
static int s_Variable = 5; // s stands for static
\\ Main.cpp
#include <iostream>
int s_Variable = 10;
int main()
{
std::cout << s_Variable << std::endl; // 10
std::cin.get();
}
\\ Static.cpp
int s_Variable = 5; // remove static
\\ Main.cpp
#include <iostream>
int s_Variable = 10;
int main()
{
std::cout << s_Variable << std::endl; // LNK ERROR already defined in Main.obj
std::cin.get();
}

所以两个全局变量的名字不能一样

extern会在另外的编译单元里找 s_variable 的定义

\\ Static.cpp
int s_Variable = 5;
\\ Main.cpp
extern int s_Variable; // 它是变量的引用
std::cout << s_Variable << std::endl; // 5

总结#

在类或结构体的外部使用static修饰变量和函数,会让他们拥有不被外部翻译单元链接的能力。少用全局变量,这可能造成代码混乱。

C++入门 (六) : C++中的静态
https://dingfengbo.vercel.app/posts/c入门/06-c中的静态/
作者
Eureka
发布于
2026-03-13
许可协议
CC BY-NC-SA 4.0