静态局部变量和静态全局变量

静态局部变量(static local variable)是在函数内部声明的,具有静态存储期限的变量。这意味着它的生命周期从程序开始时开始,直到程序结束,而不是在函数调用时创建和销毁。静态局部变量只会被初始化一次,即使在函数被多次调用时也是如此。它们的值在函数调用之间保持不变。
静态局部变量的例子:

#include <iostream>
void incrementAndPrint() {
    static int count = 0; // 静态局部变量
    count++; // 每次调用时增加count的值
    std::cout << count << std::endl;
}
int main() {
    incrementAndPrint(); // 输出:1
    incrementAndPrint(); // 输出:2
    incrementAndPrint(); // 输出:3
    return 0;
}

在这个例子中,count是一个静态局部变量。每次调用incrementAndPrint函数时,count的值都会增加,并且记住上一次调用的值,因为它在函数调用之间保持不变。第一次调用时,count初始化为0,然后增加到1,并打印出来。后续的调用会继续增加count的值并打印。如果count不是静态的,那么每次调用incrementAndPrint时,count都会被重新初始化为0,因此每次都会打印1。


在C++中,静态变量主要有两种类型,它们的存储期限都是静态的,但是它们的作用域不同:

  1. 静态局部变量(Static Local Variables)
    • 静态局部变量是在函数内部声明的,但它们的生命周期是整个程序运行期间,而不是函数调用的生命周期。
    • 它们仅在函数内部可见,不能被其他函数访问。
    • 静态局部变量只在第一次调用函数时初始化,之后每次调用时保持上一次的值。
  2. 静态全局变量(Static Global Variables)
    • 静态全局变量是在文件作用域内声明的,它们的生命周期也是整个程序运行期间。
    • 它们在声明它们的文件内可见,但在其他文件中默认是不可见的,即它们具有内部链接性(internal linkage)。
    • 如果没有在声明时初始化,静态全局变量会被自动初始化为0。
    • 通过使用extern关键字,可以在其他文件中声明静态全局变量,从而使得它们可以被其他文件访问。
      除了这两种类型,C++中的类成员也可以是静态的,这意味着无论创建了多少个类的对象,静态成员都只有一个副本:
  3. 静态类成员(Static Class Members)
    • 静态类成员是属于类的,而不是属于类的任何一个对象的。
    • 它们在类的所有对象之间共享,不需要通过对象来访问。
    • 静态类成员可以在类定义内部或外部进行初始化,但通常是在类定义外部进行。

这些是C++中主要的静态变量类型,它们在程序中的作用和用途各不相同。


在C++中,不同的作用域通常与特定的生命周期相关联。以下是各种作用域与对应的变量生命周期:

  1. 全局作用域(Global Scope)
    • 对应的变量生命周期:静态存储期限(Static Storage Duration)。
    • 全局变量在程序开始时创建,在程序结束时销毁。
  2. 局部作用域(Local Scope)
    • 自动局部变量(Auto Local Variables):自动存储期限(Auto Storage Duration)。
      • 在进入块(如函数内部)时创建,在退出块时销毁。
    • 静态局部变量(Static Local Variables):静态存储期限(Static Storage Duration)。
      • 在程序开始时创建,但在第一次使用时初始化,只在定义它们的函数内部可见,在程序结束时销毁。
  3. 类作用域(Class Scope)
    • 对应的变量生命周期:依赖于成员的存储类别。
    • 类成员变量可以是静态或非静态的,静态类成员具有静态存储期限,非静态成员变量的生命周期与类对象的生命周期相同。
  4. 命名空间作用域(Namespace Scope)
    • 对应的变量生命周期:静态存储期限(Static Storage Duration)。
    • 在命名空间中定义的变量在程序开始时创建,在程序结束时销毁。
  5. 函数原型作用域(Function Prototype Scope)
    • 对应的变量生命周期:没有实际的生命周期,因为函数原型作用域只用于参数声明,不创建实际的存储空间。
  6. 块作用域(Block Scope)
    • 对应的变量生命周期:自动存储期限(Auto Storage Duration)。
    • 在进入块(如循环或条件语句内部)时创建,在退出块时销毁。
  7. 线程存储期限(Thread Storage Duration)
    • 对应的变量生命周期:线程存储期限(Thread Storage Duration)。
    • 使用thread_local关键字声明的变量在每个线程开始时创建,在线程结束时销毁。
  8. 动态存储期限(Dynamic Storage Duration)
    • 对应的变量生命周期:动态存储期限(Dynamic Storage Duration)。
    • 使用new关键字在堆上分配的变量在调用delete时销毁。

需要注意的是,虽然作用域通常与特定的生命周期相关联,但有时也可以通过使用存储类说明符(如staticexternthread_local)来改变这种默认关联。例如,一个在局部作用域内声明的变量可以通过使用static关键字将其生命周期变为静态存储期限。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九层指针

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值