c++中的静态(static)

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` 的当前值,实现了对函数调用次数的计数。

请注意,局部静态变量的生命周期是整个程序的生命周期。因此,如果在不同的函数中使用同名的局部静态变量,它们将共享相同的存储位置和值。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值