C++中全局变量、静态全局变量和全局常量详解

在C++中,全局变量、静态全局变量和全局常量是程序中常见的概念,它们在不同的情境下有着不同的用途和特性。让我们深入了解这些概念,以及它们的区别和用法。

1. 全局变量

全局变量是定义在函数外部,整个程序范围内都可见的变量。通常将全局变量的声明放在.cpp文件中,以避免多层包含可能引起的重复定义错误。为了在其他文件中使用这些变量,可以在相应的头文件中使用 extern 关键字进行声明。

// global_variables.h
extern int globalVar;  // 声明全局变量

// global_variables.cpp
int globalVar = 42;  // 定义全局变量

其他文件只需包含头文件即可使用全局变量,而不会引起重复定义错误。

2. 静态全局变量

静态全局变量是使用 static 修饰的全局变量。与普通全局变量不同,静态全局变量的作用域被限制在定义它的源文件内,不能被其他源文件引用。在头文件中声明和定义静态全局变量时一体化,不需要额外的 extern 关键字。

// static_global_variable.h
static int staticGlobalVar = 24;  // 静态全局变量的声明和定义

多个编译单元包含相同的头文件也不会引起重定义错误,因为每个编译单元都有独立的空间存储静态全局变量。

3. 全局常量

全局常量是使用 const 关键字定义的全局变量,其值在定义时被初始化,并且不能在程序运行过程中修改。在.cpp文件中定义并赋初值,在头文件中使用 extern 进行声明。

// global_constants.h
extern const double PI;  // 声明全局常量

// global_constants.cpp
const double PI = 3.14159;  // 定义全局常量

虽然多个编译单元中的全局常量有不同的内存地址,但由于其为常量,其值不可修改,因此不会影响程序的行为。

4. 区别

4.1 静态变量与普通变量的区别

普通全局变量的作用域是整个源程序,而静态全局变量的作用域被限制在定义该变量的源文件内,避免在其他源文件中引起错误。

4.2 static全局变量与普通的全局变量

静态全局变量只初始化一次,防止在其他文件单元中被引用。

4.3 static局部变量和普通局部变量

静态局部变量只被初始化一次,下一次依据上一次结果值。

4.4 static函数与普通函数

静态函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。

5. static的用途

  1. 在函数体内,被声明为静态的变量在函数调用过程中保持其值不变。
  2. 在模块内,被声明为静态的变量和函数只能在模块内部访问,不被模块外其他函数或文件访问,起到限制作用域的作用。

6. 静态变量的使用

static 是C++语言的关键字之一,用于给变量创建永久存储空间。静态变量的生存期远远超过了创建它的函数,可以在多次函数调用中保持其值不变。其可见性与普通变量相似,向下可见,但需要注意未定义标识符时会导致编译器提醒。

void fun(int x) {
    static int a = x;
    static int b = 0;
    a++;
    printf("a = %d \n", a);
}

int main() {
    for (int i = 10; i > 0; i--) {
        fun(i);
    }
    system("pause");
    return 0;
}

输出结果将是:

a = 11 
a = 11 
a = 11 
a = 11 
a = 11 
a = 11 
a = 11 
a = 11 
a = 11 
a = 11 

由于 static int a 是一个静态变量,它在第一次调用 fun 函数时被初始化为 x 的值,即 10。在随后的每次调用中,a 会保持其值,并且由于它是静态变量,不会被重新初始化。因此,无论循环多少次,输出都会显示 a = 11,每次都是 a 在上一次的基础上自增1。

7. 静态变量的原理

静态变量在内存中的存储位置不同于栈区的局部变量,而是在数据区。当静态变量被创建时,在数据区为其分配了一段空间,并分配了一个标志符,初始化时标志符被设为 1。之后标志符被设为 0,限制了之后对其的赋值,从而保持其值不变。这使得静态变量的生存期超过了函数本身的生存期。

  • 24
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值