static(静态)变量

来源:互联网 发布:三维人像建模软件 编辑:程序博客网 时间:2024/05/29 16:14

1.静态变量有什么作用

在C语言中,关键字static的意思是静态,它有3个明显的作用:
1)在函数体内,静态变量具有“记忆”功能,即被一个声明为静态的变量在这一函数被调用的过程中其值维持不变;
2)在模块内(但在函数体外),它的作用域范围是有限制的,即如果一个变量被声明为静态的,那么该变量可以被模块内所有函数访问,但不能被模块外其他函数访问;
3)内部函数应该在当前源文件中说明和定义,对于课在当前源文件意外使用的函数,应该在头文件中说明,使用这些函数的源文件要包含这个头文件。

static全局变量和普通的全局变量的区别在于static全局变量只初始化一次,下一次的运算依据是上一次的结果值。static()函数与普通函数的区别在于作用于不一样,static()函数只在一个源文件中有效,不能被其他源文件使用。


在C++中,在类内数据成员的声明前加上关键字static,该数据成员就是类内的静态数据成员。静态数据成员有以下特点:

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

2)静态数据成员存储在全局数据区。不属于特定的类对象,在没产生类的实例时,程序员也可以使用它;

3)静态数据成员和普通数据成员一样遵从public、protected、private访问规则;

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

静态数据成员不具有this指针,不能访问属于类对象的非静态数据成员,也无法访问非静态数据成员,它只能调用其余的静态成员函数。


附:为什么static变量只初始化一次?

对于所有对象(不仅仅是静态对象),初始化都只有一次,而由于静态变量具有“记忆”功能,初始化后,一直都没有被销毁,都会保存在内存区域中,所以不会再次初始化。

存放在静态区域的变量的生命周期一般比较长,一般与整个源程序“同生死,共存亡“,所以只需要初始化一次,而自动变量由于存放在栈区,一旦过程结束,就即刻被销毁。

例如:

 Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
void fun(int i)
{
    
static int val = i++;
    cout << 
"val = " << val << endl;
}
int main()
{
    fun(
0);
    fun(
1);
    fun(
2);
    
return 0;
}
程序输出为:
0
0
0
void fun1(int i)
{
    
static int val = i++;
    val = i++;
    cout << 
"val = " << val << endl;
}
int main()
{
    fun1(
0);
    fun1(
1);
    fun1(
2);
    
return 0;
}
程序输出为:
1
1
2

因为当调用fun1(0时,由于val被声明为static,所以定义语句只执行一次,此时val = i++,val的值为0,i的值变为1,执行第二语句val=i++后,此时val的值为i的初值为1,接着i的值变为2,所以第一次调用时输出为1.当调用fun(1)时,因为val是静态变量,具有记忆功能,所以会跳过定义语句,执行val=i++语句,所以val的值为1,而此时i的值变为2,所以第二次调用时输出为1.后面同样如此。

另外:在头文件中不建议定义静态变量,不然会引起空间浪费或者程序错误。所以不建议在头文件中定义任何变量,当然也包括静态变量。