3.6.3 静态变量

关键字static有一些独特的意义。通常,函数中定义的局部变量在函数作用域结束时消失。当再次调用这个函数时,会重新创建该变量的存储空间,其值会被重新初始化。如果想使局部变量的值在程序的整个生命期里仍然存在,我们可以定义函数的局部变量为static(静态的),并给它一个初始值。初始化只在函数第一次调用时执行,函数调用之间变量的值保持不变。用这种方式,函数可以“记住”函数调用之间的一些信息片断。

我们可能奇怪为什么不使用全局变量。static变量的优点是在函数范围之外它是不可用的,所以它不可能被轻易地改变。这会使错误局部化。

下面是一个使用static变量的例子:

3.6.3 静态变量 - 图1

每一次在for循环中调用函数func()时,它都打印不同的值。如果不使用关键字static,打印出的值总是‘1’。

static的第二层意思和前面的含义相关,即“在某个作用域外不可访问”。当应用static于函数名和所有函数外部的变量时,它的意思是“在文件的外部不可以使用这个名字”。函数名或变量是局部于文件的;我们说它具有文件作用域(file scope)。例如,编译和连接下面两个文件会引起连接器错误:

3.6.3 静态变量 - 图2

尽管在下面的文件中变量fs被声明为extern,但是连接器不会找到它,因为在FileStatic.cpp中它被声明为static。

3.6.3 静态变量 - 图3

3.6.3 静态变量 - 图4

static说明符也可能在一个类中使用。当在本书的后面了解了如何创建类的时候,再对此作出解释。