首先要了解作用域与生存期。
作用域就是一个变量可以被引用的范围,如:全局作用域、文件作用域、局部作用域。
而生命周期就是这个变量可以被引用的时间段。
—— | 全局变量 | 静态全局变量 | 静态局部变量 | 局部变量 |
---|---|---|---|---|
作用域 | 文件作用域(多) | 文件作用域(单) | 局部作用域 | 局部作用域 |
生命周期 | 静态生命期 | 静态生命期 | 静态生命期 | 局部生命期 |
文件作用域:从说明点开始,延伸到源文件结束。也称为全局作用域。多:其他文件可见。单:只有当前文件可见。
局部作用域:从声明点开始,到块结束处为止。
静态生命期:与程序的运行期相同,只要程序一开始运行,变量就存在,程序结束,变量销毁。
局部生命期:开始于程序执行经过其声明点时,结束于其作用域结束处。
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)静态成员初始化与一般数据成员初始化不同: