静态变量作用范围在一个文件内,如果其他文件需要访问,要事先extern。程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值。静态变量存放在静态变量区。
在C中引入关键字static是为了表示退出一个块后仍然存在的局部变量。随后,static在C中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。为了避免引入新的关键字,所以仍使用static关键字来表示这第二种含义。最后,C++重用了这个关键字,并赋予它与前面不同的第三种含义:表示属于一个类而不是属于此类的任何特定对象的变量和函数。
当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。我们要同时编译两个源文件,一个是a.c,另一个是main.c
//a.c内容 char a = 'A'; void msg() { printf("Hello\n"); } //下面是main.c的内容: int main(void) { extern char a;//能够被其他模块以extern修饰符引用到的变量通常是全局变量 printf("%c\n", a); (void)msg(); return 0; }
执行 gcc main.c a.c -o main
运行main
程序的运行结果是:
A
Hello
注:如果使用g++ main.c a.c -o main的话,msg函数也需要extern
static变量在程序开始时就已经有了空间,而不像局部变量,到达了定义时才会分配空间。下面是一个例子。例子中static只在函数中可以访问,隐藏了变量的同时也使得fun函数有了一个“全局变量”。
#include <stdio.h> int fun() { static int count = 10;//执行fun时不会执行这句声明 return count--; } int main() { printf("%d\n", fun()); printf("%d\n", fun()); return 0; }
程序输出为:
10
9
若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
静态成员的值对所有的对象是一样的。静态成员可以被初始化,但只能在类体外进行初始化。
静态成员仍然遵循public,private,protected访问准则。
静态成员函数只能访问静态成员函数,不能访问非静态成员函数。