现在的位置: 首页 > 综合 > 正文

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

2013年05月27日 ⁄ 综合 ⁄ 共 1426字 ⁄ 字号 评论关闭

面向过程设计中的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.其它文件中可以定义相同名字的函数,不会发生冲突;所以不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。

抱歉!评论已关闭.