在C语言中,关键字static的意思是静态的,有3个明显的作用:

1. 在函数体内,静态变量具有记忆作用,即一个被声明为静态的变量在这一函数被调用的过程中其值维持不变。

2. 在模块内(但在函数体外),它的作用域范围是有限制的,如果一个变量被声明为静态的,那么该变量可以被模块内所有的函数访问,但不能被模块外的其他函数访问。

3. 内部函数应该在当前源文件中说明和定义,对于可在当前源文件以外使用的函数,应该在一个头文件中说明,使用这些函数的源文件要包含这个头文件。

 

static全局变量和普通全局变量的区别:static全局变量只初始化一次,这是为了防止它在其他文件单元中引用。

 

static局部变量和普通局部变量的区别:static局部变量只初始化一次,下次的运算依据是上一次的结果值。

 

static函数与普通函数的区别在与作用域不一样,static()函数只在一个源文件中有效,不能被其它源文件使用。

 

静态数据成员的特点:

1. 对于非静态数据成员,每个类都有自己的复制品。而静态数据成员被当做是类的成员。无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份复制品,由该类型的所有对象共享访问。

2. 静态数据成员存储在全局数据区。定义时要分配空间,所以不能在类声明中定义。由于静态数据成员属于本类的所有对象共享,所以他不属于特的类对象,在没有产生类对象时,其作用域就可见,即在没有产生类的实例时,程序员也可以使用它。

3. 静态数据成员也遵从public、protect、private访问规则。

4. static成员变量的初始化在类外,此时不能再带上static的关键字。private、protect的static成员虽然可以在类外初始化,但是不能在类外被访问。

 

静态数据成员的优势:

1. 静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其他全局名字冲突的可能性。

2.可以实现信息隐藏。静态数据成员可以使private成员,而全局变量不能。

#include<stdio.h>
#include <iostream>
#include "a.h"
using namespace std;
void fun(int i)
{
    static int value = i++;
    cout<<value<<endl;
}
int main()
{
    fun(0);
    fun(1);
    fun(2);
    return 0;
}

运行结果: 0
运行结果: 0
运行结果:0