目录
1. static 的基本作用
2. static 在类中的使用
2.1 静态成员变量
2.2 静态成员函数
3. static 变量在全局作用域中的使用
3.1 static 全局变量
3.2 普通全局变量
4. static 局部变量
5. static 全局变量与普通全局变量的异同
static在类中的静态成员变量和成员函数使得这些成员属于类,而不属于类的实例对象。static修饰的全局变量限定了其作用域,仅限于当前源文件,避免命名冲突和命名空间污染。static局部变量只会初始化一次,并且在函数多次调用之间保持其值。
1. static 的基本作用
static 关键字的主要作用是控制变量或函数的生命周期、作用域和链接属性。
- 生命周期:
static修饰的变量在程序的整个运行过程中只会被初始化一次,并且其值会在整个程序运行期间保持不变。 - 作用域:
static影响变量和函数的可见性,决定它们在何处可访问。
2. static 在类中的使用
2.1 静态成员变量
-
定义:在类中使用
static修饰的成员变量属于类,而不属于类的对象。即所有类的实例对象共享同一个static成员变量。 -
声明和定义:静态成员变量需要在类的外部进行定义,并且只能初始化一次。
class MyClass {
public:
static int staticVar; // 声明静态成员变量
};
int MyClass::staticVar = 0; // 定义并初始化静态成员变量
-
访问:静态成员变量可以通过类名或者对象名来访问。
MyClass::staticVar = 10; // 通过类名访问
MyClass obj;
obj.staticVar = 20; // 通过对象访问
2.2 静态成员函数
-
定义:静态成员函数属于类本身,而不依赖于类的实例。静态函数只能访问静态成员变量,不能访问非静态的成员变量或成员函数。
class MyClass {
public:
static void staticFunction() {
// 只能访问静态成员变量
staticVar = 10;
}
static int staticVar;
};
-
调用:静态成员函数可以通过类名直接调用,也可以通过对象调用。
MyClass::staticFunction(); // 通过类名调用
MyClass obj;
obj.staticFunction(); // 通过对象调用
3. static 变量在全局作用域中的使用
3.1 static 全局变量
-
作用域:
static修饰的全局变量的作用域限制在定义它的源文件内,不能被其他源文件访问。这是为了隐藏实现细节,减少全局命名空间污染。
static int globalVar = 0; // static 全局变量,仅限于当前文件访问
-
生命周期:
static全局变量在程序运行期间一直存在,并且只初始化一次。
3.2 普通全局变量
-
作用域:普通的全局变量可以在程序的任何部分(如果声明了
extern)被访问,因此它可以跨源文件共享。
int globalVar = 0; // 普通全局变量,可以在其他源文件中使用 extern 声明访问
-
生命周期:普通全局变量和
static全局变量一样,在程序的生命周期内始终存在。
4. static 局部变量
static 也可以用于局部变量,常见于函数内部。static 局部变量只会在第一次调用该函数时初始化,并且该变量在后续的调用中保持其值。
void func() {
static int localVar = 0;
localVar++;
std::cout << localVar << std::endl;
}
在这个例子中,localVar 在第一次调用时被初始化为 0,之后每次调用时都将保持上一次的值。
5. static 全局变量与普通全局变量的异同




















