1. 静态变量
静态变量是在程序生命周期内保持其值的特殊变量。它们在第一次使用时被初始化,并且在整个程序执行期间保持其值,直到程序结束。简单理解,static修饰的变量只在当前翻译单元中有效。
下面实例中,在Static.cpp文件中定义静态变量value,在main.cpp中再次定义value,编译成功。去掉static则编译失败。
2. 静态类成员
静态类成员可以是静态变量或静态函数。它们属于整个类而不是类的实例,并且在类的所有实例之间共享。静态类成员在内存中只有一个副本,无论创建多少个类的实例,它们都共享相同的静态成员。静态类成员在类内部声明时必须在定义之前加上`static`关键字。
下面实例中,x,y是Entity的静态成员变量,不属于实例。想要访问,要通过int Entity::x的方式。通过Entity::print(),访问静态成员方法。注意静态成员方法不能访问非静态成员函数。
#include<iostream>
struct Entity
{
static int x, y;
static void print()
{
std::cout << x << ","<<y << std::endl;
}
};
int Entity::x;
int Entity::y;
int main()
{
Entity e;
e.x = 8;
e.y = 6;
Entity::print();
}
3. 局部静态
在C++中,局部静态变量是在函数内部定义的静态变量。与普通局部变量不同,局部静态变量在函数首次执行时初始化,并且在整个程序的生命周期内保持其值,而不是每次函数调用时重新创建和初始化。
局部静态变量的特点包括:
1. 初始化:局部静态变量在第一次执行到其定义处时初始化,仅在第一次初始化时进行赋值。之后的函数调用将跳过初始化过程。
2. 生命周期:局部静态变量的生命周期与程序的生命周期相同,即在整个程序执行期间保持其值,而不是在函数调用结束后被销毁。
3. 可见性:局部静态变量仅在定义它的函数内可见,它对于其他函数是不可访问的。
4. 存储位置:局部静态变量存储在静态存储区,而不是栈上。这意味着它们的内存分配在程序开始时进行,并且在程序结束时才被释放。
局部静态变量通常用于以下情况:
- 在函数内部需要保持数据的持久性,而不是在每次函数调用时重新创建变量。
- 需要在函数调用之间共享数据,同时又希望将变量的作用域限制在函数内部。
- 需要在函数内部跟踪某些计数器或状态的变化。
以下是一个示例代码,展示了局部静态变量的使用:
```cpp
#include <iostream>
void countCalls() {
// 定义局部静态变量
static int counter = 0;
counter++;
std::cout << "Function call count: " << counter << std::endl;
}
int main() {
countCalls(); // 输出: Function call count: 1
countCalls(); // 输出: Function call count: 2
countCalls(); // 输出: Function call count: 3
return 0;
}
```
在上述示例中,`countCalls()` 函数内定义了一个局部静态变量 `counter`。每次调用 `countCalls()` 函数时,`counter` 的值会自增,并在函数调用时保持其值。每次调用函数时,都会输出 `counter` 的当前值,实现了对函数调用次数的计数。
请注意,局部静态变量的生命周期是整个程序的生命周期。因此,如果在不同的函数中使用同名的局部静态变量,它们将共享相同的存储位置和值。