静态数据和全局数据
- 定义和作用域
- 生命周期
- 内存分配
- 访问权限
- 使用场景
- 代码示例
定义和作用域
-
静态数据
- 定义:静态数据可以是类中的静态成员变量,也可以是函数或文件作用域中的静态数据变量,通过static关键字定义
- 作用域:
- 如果是类的静态成员变量,则它是整个类的共有数据,属于类本身,而不属于任何对象,所有类的对象共享一个静态成员变量
- 如果是局部静态变量,作用域限制在它的函数或代码块中,但是它的生命周期超过了作用域。(什么意思?)
- 访问:
- 类的静态成员变量可以通过类名或对象来访问
- 局部静态变量只能在其定义的函数或代码块中访问。
-
全局数据
- 定义:全局数据是在所有函数或类之外声明的变量,没有局部作用域限制,存在域整个程序的生命周期中。
- 作用域:全局数据可以在整个文件中被访问
- 访问:全局数据可以在定义它的文件内被访问
生命周期
- 静态数据
- 局部静态变量:虽然局部静态变量的作用域只限于函数或代码块,但它的生命周期贯穿整个程序运行期间。也就是说,静态变量的内存只会分配一次,并且保留它的值直到程序结束。例如,在函数中定义的静态变量,其值在函数调用之间保持不变。
- 类的静态成员变量: 它的生命周期与程序一样长,无论是否创建对象,它都会一直存在。
- 全局数据
- 全局变量的生命周期贯穿整个程序的运行。它们在程序启动时分配内存,并在程序结束时释放。
内存分配
静态数据和全局变量都存储在全局/静态数据区,在整个程序的生命周期中都存在
访问权限
- 静态数据
- 局部静态变量的访问权限被定义在作用域中
- 类的静态成员变量在整个类中访问,也可以通过public,private,protected限制访问
- 全局数据
全局数据在整个文件中都可以访问,通过extern在其他文件中也可以访问。
使用场景
- 静态数据
- 局部静态变量: 常用于在函数中保存某个状态信息,比如计数器等,这样函数每次调用时可以保持上次的结果。例如,用来统计函数的调用次数。
- 类的静态成员变量: 当需要某个数据被多个对象共享时,可以使用静态成员变量。例如,统计类的实例化对象个数。
- 全局数据:
- 通常用于在多个函数之间共享数据,但它会增加代码的耦合性,不利于程序的维护和调试。因此,通常推荐避免不必要的全局变量。
代码示例
#include <iostream>
using namespace std;// 全局变量
int globalVar = 10;class Example
{
public:// 静态成员变量static int staticVar;// 静态函数,可以访问静态成员变量static void printStaticVar() {cout << "Static Variable: " << staticVar << endl;}
};// 静态成员变量必须在类外进行定义
int Example::staticVar = 5;// 普通函数,带有局部静态变量
void func() {static int localStaticVar = 0; // 静态局部变量localStaticVar++;cout << "Local Static Variable: " << localStaticVar << endl;
}int main() {// 访问全局变量cout << "Global Variable: " << globalVar << endl;// 调用带静态局部变量的函数func(); // 输出:Local Static Variable: 1func(); // 输出:Local Static Variable: 2// 访问静态成员变量Example::printStaticVar(); // 输出:Static Variable: 5// 修改静态成员变量Example::staticVar = 20;Example::printStaticVar(); // 输出:Static Variable: 20return 0;
}