面向过程设计中的static
1、静态全局变量
#include <iostream>
using namespace std;
void fn();
static int n; //定义静态全局变量
void main()
{
n=20;
cout<<n<<endl;
fn();
}
void fn() { n++; cout<<n<<endl;}
静态全局变量有以下特点:
1.该变量在全局数据区分配内存;
2.未经初始化的静态全局变量会被自动初始化为0(在函数体内声明的自动变量的值是随机的,除非它被显式初始化,而在函数体外被声明的自动变量也会被初始化为0);
3.静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的;
一般程序把新产生的动态数据存放在堆区,函数内部的自动变量存放在栈区。自动变量一般会随着函数的退出而释放空间,静态数据(即使是函数内部的静态局部变量)也存放在全局数据区。全局数据区的数据并不会因为函数的退出而释放空间。
注意:全局变量和全局静态变量的区别
1.全局变量是不显式用static修饰的全局变量,全局变量默认是动态的,作用域是整个工程,在一个文件内定义的全局变量,在另一个文件中,通过extern的声明,就可以使用全局变量。
2.全局静态变量是显式用static修饰的全局变量,作用域是声明此变量所在的文件,其他的文件即使用extern声明也不能使用。
2、静态局部变量
#include <stdio.h>
void trystat(void);
int main()
{
int count;
for(count=1; count<=3; count++)
{
printf("Now look when count = %d:\n", count);
trystat();
}
return 0;
}
void trystat(void)
{
int fade = 1;//每次调用trystat()时,fade都会被初始化为1
static int stay = 1; //stay只在编译trystat()函数时被初始化一次
printf("fade = %d and stay = %d\n", fade++, stay++);
}
运行结果:
Now look when count = 1:
fade = 1 and stay = 1
Now look when count = 2:
fade = 1 and stay = 2
Now look when count = 3:
fade = 1 and stay = 3
静态局部变量有以下特点:
1.该变量在全局数据区分配内存;
2.静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;
3.静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;
4.它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束;
3、静态函数
#include <iostream>
using namespace std;
static void fn();//声明静态函数
void main()
{
fn();
}
void fn() { int n=10; cout<<n<<endl;} //定义静态函数
静态函数的好处:
1.静态函数只能在声明它的文件当中可见,不能被其它文件所用;
2.其它文件中可以定义相同名字的函数,不会发生冲突;所以不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。