您的位置:首页 > 编程语言 > C语言/C++

C/C++中static的作用(面向过程)

2012-07-13 15:42 405 查看
面向过程设计中的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.其它文件中可以定义相同名字的函数,不会发生冲突;所以不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: