static关键字

函数在stack上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时,如何实现? 最容易想到的方法是定义为全局的变量,但这样最明显的缺点是 破坏了此变量的访问范围 (使得在此函数中定义的变量,不仅仅只受此函数控制). 想要使用全局变量的之前应该先考虑使用 static

全局变量和静态变量的存储都放在内存的全局区

全局变量和全局静态变量的区别

  • 全局变量默认是有外部链接性的,作用域是整个工程,在一个文件内定义的全局变量,可以在另一个文件中使用。比较规范的方法是:在A.h中声明,比如extern int a;,但不能赋值,否则报错。在A.cpp中定义,int a=1;。然后在B.cpp中使用,cout << a <<endl;

  • 全局静态变量是显式用 static 修饰的全局变量,作用域仅在声明此变量的文件,其他的文件即使用 extern 声明也不能使用。这样即使两个不同的源文件都定义了相同名字的static全局变量,它们也是不同的变量。

1
2
3
4
5
6
7
8
9
void test_static()
{
static int n=0;
n++ ;
cout << n <<endl;
}
test_static();
test_static();
test_static();

运行结果是

1
2
3
1
2
3

静态局部变量有以下特点:

  1. 该变量在全局数据区分配内存;
  2. 静态局部变量在程序执行到该对象的声明处时,被首次初始化,即以后的函数调用不再进行初始化。即上面的static int n=0;
  3. 静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为 0;比如上面的n可以不初始化为0
  4. 始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。
  5. 它和全局变量的区别:全局变量对所有的函数都是可见的,而static局部变量只对定义自己的函数体可见。

把局部变量改变为static变量后是改变了它的生存期和内存中的存储区域,作用域其实不变。 把全局变量改变为static变量是改变了它的作用域,限制了它的使用范围。