static 关键字
(1)static关键在普通变量中的应用,static在普通变量中,有两个作用:
第一个是限制全局变量以及函数的作用域(可见性),在全局作用域内定义的变量和函数前加static关键字修饰,那么变量和函数就只能在当前编译单元可见,别的编译单元不能再访问这些函数和变量
第二个作用是延长局部变量的生命周期,局部变量的生命周期一般是在所在可访问的区域的右大括号那里结束,如果局部变量被static 修饰,那么局部变量将被存储在静态存储区内,其生命周期也会延长到程序运行结束,并且如果静态局部变量被初始化,就有第一次调用时被初始化,后面再次调用将不会被初始化。
1 #include<iostream> 2 using namespace std; 3 4 void fun(){ 5 static int i=0; 6 i++; 7 cout<<i<<endl; 8 9 } 10 11 12 int main(){ 13 14 fun(); 15 fun(); 16 fun(); 17 return 0; 18 19 20 21 }
可以看到上述代码的运行结果是:1
2
3
static int i=0只有第一次fun调用时被执行了。
(2)局部静态类对象
静态类对象同样遵守一般的静态变量的规则,但是静态类对象的初始化操作,一般是由构造函数来进行的,而如果没有为一般的静态内建类型进行显示的初始化,编译器会对进行隐式的初始化操作,而静态对象要有构造函数进行初始化,无论是默认构造函数还是显示构造函数。并且构造函数只有第一次转到定义对象的地方才会调用构造函数。
1 #include<iostream> 2 using namespace std; 3 class X{ 4 int i; 5 public: 6 X(int ii=0):i(ii){ 7 } 8 ~X(){ 9 cout<<"X::~X()"<<endl; 10 } 11 void setI(int ii){i=ii;} 12 int getI()const{return i;} 13 void plusOne(){i++;} 14 }; 15 16 void fun(){ 17 static X x(10); 18 cout<<x.getI()<<endl; 19 x.plusOne(); 20 } 21 22 int main(){ 23 fun(); 24 fun(); 25 fun(); 26 return 0; 27 28 }
运行的结果是:10
11
12
X::~X()
所以在main函数中,虽然三次调用fun,但是只有第一次调用时产生了X的对象,由于最后只有一个析构函数被调用,可知值产生了一个对象。
(3)全局静态对象
静态对象的销毁和普通对象的销毁一样,也是按照初始化时相反的顺序销毁的,当然只有那些被创建的对象才能被销毁。静态对象的销毁都是在main函数退出时进行的。但是全局对象的构造函数调用,确是在main函数执行之前就被调用。