首先要了解作用域与生存期。
作用域就是一个变量可以被引用的范围,如:全局作用域、文件作用域、局部作用域。 而生命周期就是这个变量可以被引用的时间段。
——全局变量静态全局变量静态局部变量局部变量作用域文件作用域(多)文件作用域(单)局部作用域局部作用域生命周期静态生命期静态生命期静态生命期局部生命期文件作用域:从说明点开始,延伸到源文件结束。也称为全局作用域。多:其他文件可见。单:只有当前文件可见。
局部作用域:从声明点开始,到块结束处为止。
静态生命期:与程序的运行期相同,只要程序一开始运行,变量就存在,程序结束,变量销毁。
局部生命期:开始于程序执行经过其声明点时,结束于其作用域结束处。
Static 作用一、 隐藏
比如全局变量与静态全局变量:
全局变量可以被其他的源文件引用声明(extern),但静态全局变量只能在当前定义文件中使用,对于其他文件不可见。
对于函数,static只有隐藏功能。
Static作用二、保存变量内容 static变量只会初始化一次,然后就保存修改。比如;
#include<iostream.h> static int v;//静态全局变量 void addm(int m) { static int c;//静态局部变量 c++; cout<<"c="<<c<<endl; v++; cout<<"v="<<v<<endl; m++; cout<<"m="<<m<<endl; } void main() { static int m=1;//静态局部变量 cout<<"//"<<endl; addm(m); cout<<"//"<<endl; addm(m); }PS:如果作为static局部变量在函数内定义,它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。main函数中的变量m与 addm函数中的变量m不是一个,他们都是局部变量。
Static作用三、默认初始化为0(static变量)
Static作用四、C++中的类成员声明static
静态数据成员是类的成员,而不是对象的成员 (1)类的静态成员函数是属于整个类而非类的对象,所以它没有this指针,这就导致 了它仅能访问类的静态数据和静态成员函数。
(2)不能将静态成员函数定义为虚函数。
(3)由于静态成员声明于类中,操作于其外,所以对其取地址操作,就多少有些特殊 ,变量地址是指向其数据类型的指针 ,函数地址类型是一个“nonmember函数指针”。
(4)由于静态成员函数没有this指针,所以就差不多等同于nonmember函数,结果就 产生了一个意想不到的好处:成为一个callback函数,使得我们得以将C++和C-based X W indow系统结合,同时也成功的应用于线程函数身上。 (这条没遇见过)
(5)static并没有增加程序的时空开销,相反她还缩短了子类对父类静态成员的访问 时间,节省了子类的内存空间。
(6)静态数据成员在<定义或说明>时前面加关键字static。
(7)静态数据成员是静态存储的,所以必须对它进行初始化。 (程序员手动初始化,否则编译时一般不会报错,但是在Link时会报错误)
(8)静态成员初始化与一般数据成员初始化不同: