转自:http://yuanyuanba.com/forum.php?mod=viewthread&tid=768
class F {
public:
int Famliy(int a) {
static int famliy = a;
std::cout << "in Famliy famliy:" << famliy << std::endl;
return famliy;
}
};
int main() {
F f;
std::cout << f.Famliy(2) << std::endl;
std::cout << f.Famliy(3) << std::endl;
std::cout << f.Famliy(4) << std::endl;
std::cout << f.Famliy(5) << std::endl;
cin.get();
}
输出:
in Famliy famliy:2
2
in Famliy famliy:2
2
in Famliy famliy:2
2
in Famliy famliy:2
2
对于所有的对象(不仅仅是静态对象),初始化都只有一次,而由于静态变量具有“记忆”功能,初始化后,一直都没有被销毁,都会保存在内存区域中,所以不会再次初始化。
存放在静态区的变量的生命周期一般比较长,一般与整个源程序“同生死、共存亡”,所以它只需初始化一次。而auto变量,即自动变量,由于存放在栈区,一旦调用过程结束,就会立刻被销毁。
分析以下程序代码:
#include<stdio.h>
void fun(int i)
{
static int value=i++;
printf("%d\n",value);
}
int main( )
{
fun(0);
fun(1);
fun(2);
return 0;
}
程序输出为
0
0
0
程序每次输出都为0,是因为 value 是静态类型(static),只会定义一次。也就是说,不管调用fun( )这个函数多少次,
static int value = i++ 这个定义语句只会在第一次调用的时候执行,由于第一次执行的时候i = 0,所以 value 也就被初始化成 0 了,以后调用fun( )都不会再执行这条语句的。
分析以下一段代码:
#include<stdio.h>
void fun(int i)
{
static int value=i++;
value = i++;
printf("%d\n",value);
}
int main( )
{
fun(0);
fun(1);
fun(2);
return 0;
}
程序输出为
1
1
2
上述代码之所以输出为1,1,2,是因为当调用fun(0)时,由于value被声明为static,所以定义语句只执行一次,此时value=i++,value的值为0,i的值变为1,执行第二行语句value=i++后,此时value的值为i的初值为1,接着i的值变为2,所以第一次输出为1。当调用fun(1)时,因为value是静态变量,具有记忆功能,所以会跳过定义语句,只执行value=i++语句,所以value的值为1,而此时i的值变为2,所以第二次调用时输出为1。当调用fun(2)的时候,也会跳过定义语句,只执行value=i++语句,所以value的值为2,i的值变为3,所以第三次调用时输出为2。