欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 社会 > C++ 中静态数据和全局数据的比较

C++ 中静态数据和全局数据的比较

2024/10/23 15:23:43 来源:https://blog.csdn.net/xmu_cjs/article/details/142877976  浏览:    关键词:C++ 中静态数据和全局数据的比较

静态数据和全局数据

  • 定义和作用域
  • 生命周期
  • 内存分配
  • 访问权限
  • 使用场景
  • 代码示例

定义和作用域

  • 静态数据

    • 定义:静态数据可以是类中的静态成员变量,也可以是函数或文件作用域中的静态数据变量,通过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;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com