static变量在c++中的使用

2017-04-24

今天学习c++ singleton(单例模式)的实现时,发现static关键字扮演者至关重要的角色,趁此机会总结一下:
1.static简介
2.static作用
3.static局部变量和static全局变量的区别
4.示例

1. static 简介

变量其实只不过是程序可操作的存储区的名称。 C++ 中每个变量都有指定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。
变量的存储区分类:

  1. 栈:临时变量。由编译器决定何时分配,不需要的时候自动清除的内存。
  2. 堆:由 new 分配的内存块。由编程人员指定何时分配,并要delete显式释放。堆可以动态地扩展和收缩。
  3. 常量存储区:里面存放的是常量,不允许修改。
  4. 静态存储区:全局变量,静态变量。

2. static 作用

static的作用主要有3点:

  1. 隐藏:加了static变量作用域会限制在该变量所处的.c,.cpp文件中,其他.c,.cpp文件无法访问到它。
  2. 变量的持久化:静态数据区的变量会在程序刚开始运行时,就完成唯一一次初始化。
  3. 默认初始化为0:出生在静态存储区的变量(static,global),会自动初始化为0x00。tips:将变量弄成全局的可以省去初始化为0的工序。

3. static局部变量和static全局变量的区别


主要区别在于“隐藏”这一点:
加了static变量作用域会限制在该变量所处的.c,.cpp文件中,其他.c,.cpp文件无法访问到它。
而未加static的全局变量可以在其他文件中访问到。

4. static变量使用示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<iostream>
using namespace std;
int staticLocalVar(){
static int local_var = 9; // 静态局部变量
local_var++;
return local_var;
}
static int global_var = 0;// 静态全局变量
int iszero1; // 静态存储区的变量会自动初始化为0
static int iszero2;
int main(){
cout<<"global_var : local_var"<<endl;
for(; global_var<10; global_var++){
cout<<global_var<<" : "<<staticLocalVar()<<endl;
}
int iszero3; // 非静态存储区的变量会初始化为一个未知的值!!!
cout<<"iszero1:"<<iszero1<<endl;
cout<<"iszero2:"<<iszero2<<endl;
cout<<"iszero3:"<<iszero3<<endl;
return 0;
}

运行结果:
运行结果图