static在C中有两个作用:
1.在函数内修饰一个静态局部变量,该变量在函数调用时保持值不变
2.修饰一个静态全局变量,给全局变量只在当前源文件内可见
关于第一点,静态局部变量举两个例子:
#include <stdio.h> void foo() { int a = 10; static int sa = 10; a += 5; sa += 5; printf("a = %d, sa = %d\n", a, sa); } int main() { int i; for (i = 0; i < 10; ++i) foo(); }
输出:
a = 15, sa = 15 a = 15, sa = 20 a = 15, sa = 25 a = 15, sa = 30 a = 15, sa = 35 a = 15, sa = 40 a = 15, sa = 45 a = 15, sa = 50 a = 15, sa = 55 a = 15, sa = 60
用汉诺塔为例,使用递归调用很容易解决汉诺塔问题,如果递归调用的时候我们希望一个变量记录调用次数,也就是移动盘子的次数,那么这个变量就要用static修饰:
// move n plates from a to c by b void hannoi(int n,char a,char b,char c) { static int step=1; if(n==1) { printf("step %d : move %d from %c to %c\n",step++,n,a,c); return; } hannoi(n-1,a,c,b); printf("step %d : move %d from %c to %c\n",step++,n,a,c); hannoi(n-1,b,a,c); } int main() { hannoi(10,'A','B','C'); return 0; }
static修饰的成员变量称为静态成员变量。与普通的成员变量不同,静态成员变量不需要实例化就已经存在,而且类的所有对象共享这个静态成员变量。需要注意的是不能再类中对静态成员变量初始化,如果当这个类的定义放在头文件中,那么甚至不能在这个头文件中初始化静态成员变量。对静态成员变量初始化放在.cpp文件中进行。
static修饰的成员变量称为静态成员函数。静态成员函数可以用类名直接调用,而不需要实例化对象。因为静态成员函数不属于任何一个类的实例,所以静态成员函数只能操作静态成员变量。