目录
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
,之后每次调用时都将保持上一次的值。