static定义静态全局变量时:
1. 未初始化的静态全局变量被程序自动赋为0,(好像不加static程序也会自动设为0,函数内部定义的变量如果不初始化就使用就会出错,程序不会自动赋值)
2. 静态全局变量对工程里面的其他文件来说是不可用的,也就是一个全局变量变成静态全局变量之后,其他文件可以定义相同名字的变量,而不会发生冲突,所以静态全局变量有向其他文件隐藏该变量的功能。
(这里主要看了ZZhays的专栏之后自己总结了一下)
main1.cpp
#include<iostream>
using namespace std;
static int a;//如果这里的a是static类型的,那么这个变量在main.cpp是不可见的,对其他文件隐藏了这个变量,初始化时是0
void fun();
void main()
{
a++;
cout<<a<<endl;
fun();
cout<<a<<endl;
}
main.cpp
#include<iostream>
using namespace std;
// int a=3;
extern int a;//如果这里不加extern的话,前面的static也没有的话,就会发生重定义的符号的问题;因为前面有static,所以a在这个文件里是不可用的,可以定义同样名字的变量
void fun()
{
a++;
cout<<a<<endl;
}
上面的这个例子有两个文件,运行程序发现不可行,那是因为a在main1.cpp里是静态的,所以main.cpp不可以引用a(我是这么理解的)
把main1.cpp里面的static去掉,程序就可以正常运行了
static定义静态局部变量时:
1. 静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。
从分配内存空间看:
全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,
而局部变量在栈里分配空间。 从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。