简单介绍: 像在VB,C#,C,C++,Java,PHP中我们可以看到static作为关键字和函数出现,在其他的高级计算
机语言如FORTRAN、ALGOL、COBOL、BASIC、LISP、SNOBOL、PL/1、Pascal、PROLOG、Ada等语言中也是
有出现的,只是有着不同的作用,对于其具体作用,读者有需要的时候是可以具体查阅的。我只介绍在C和C++以及
静态类中它的使用。
一、 C++中:
1、 C++与C#的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变
量和函数,不涉及类; 后者主要说明static在类中的作用。
[1] 面向过程
静态全局变量
在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子,
如下:
//Example1
#include<iostream>
usingnamespace std;
void fn(); //声明函数
static int n; //声明静态全局变量
void main()
{
n=20; //为n赋初值
printf("%d",n);//输出n的值
fn(); //调用fn函数
}
void fn()
{
n++; //n的值自加一(n=n+1)
printf("%d",n); //输出n的值
}
静态全局变量有以下特点:
(1)该变量在全局数据区分配内存:
未经初始化的静态全局变量会被程序自动初始化为0(在函数体内声明的自动变量的值是随机的,除非它被显式初
始化,而在函数体外被声明的自动变量也会被初始化为0);静态全局变量在声明它的整个文件都是可见的,而在文
件之外是不可见的;静态变量都在全局数据区分配内存,包括后面将要提到的静态局部变量。
一般程序把新产生的动态数据存放在堆区,函数内部的自动变量存放在栈区。自动变量一般会随着函数的退出而释
放空间,静态数据(即使是函数内部的静态局部变量)也存放在全局数据区。全局数据区的数据并不会因为函数的退
出而释放空间。细心的读者可能会发现:Example 1中的代码中将 static int n; //定义静态全局变量 改为 int n; //定
义全局变量程序照样正常运行。的确,定义全局变量就可以实现变量在文件中的共享,但定义静态全局变量还有以下
好处:静态全局变量不能被其它文件所用;其它文件中可以定义相同名字的变量,不会发生冲突;您可以将上述示例
代码改为如下:
//Example2
//File1第一个代码文件的代码
#include <iostream>
usingnamespase std;
void fn(); //声明fn函数
static int n; //定义静态全局变量
void main()
{
n=20;
cout<n<endl;
fn();
}
//File2第二个代码文件的代码
#include<iostream>
extern int n;
void fn()
{
n++;
printf("%d",n);
}
编译并运行Example 2,您就会发现上述代码可以分别通过编译,但运行时出现错误。试着将 static int n; //定义静
态全局变量 改为 int n; //定义全局变量 再次编译运行程序,细心体会全局变量和静态全局变量的区别。
注意:全局变量和全局静态变量的区别
1)全局变量是不显式用static修饰的全局变量,全局变量默认是有外部链接性的,作用域是整个工程,在一个文件内
定义的全局变量,在另一个文件中,通过extern 全局变量名的声明,就可以使用全局变量。
2)全局静态变量是显式用static修饰的全局变量,作用域是声明此变量所在的文件,其他的文件即使用extern声明也
不能使用。
静态局部变量
在局部变量前,加上关键字static,该变量就被定义成为一个静态局部变量。
我们先举一个静态局部变量的例子,如下
//Example3
#include <iostream>
#include <stdio.h>
void fn();
void main()
{
fn();
fn();
fn();
}
void fn()
{
static int n=10;
printf("%d",n);
n++;
}
通常,在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量分配栈内存。但随着程序退出函数
体,系统就会收回栈内存,局部变量也相应失效。但有时候我们需要在两次调用之间对变量的值进行保存。通常的想
法是定义一个全局变量来实现。但这样一来,变量已经不再属于函数本身了,不再仅受函数的控制,给程序的维护带
来不便。静态局部变量正好可以解决这个问题。静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持
到下一次调用,直到下次赋新值。
静态局部变量有以下特点:
(2)该变量在全局数据区分配内存:
静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;静态局部变量一般
在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;它始终驻留在全局数据区,直到程序运行结束。
但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。
2、静态函数
在函数的返回类型前加上static关键字,函数即被定义为静态函数。静态函数与普通函数不同,它只能在声明它的文
件当中可见,不能被其它文件使用。静态函数的例子:
//Example4
#include <iostream>
usingnamespace std;
static void fn();//声明静态函数
void main()
{
fn();