static作用

一、面向过程

静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间一直占用这些存储空间,内存地址不变,直到整个程序运行结束。静态变量虽在程序的整个执行过程中始终存在,但是在它作用域之外不能使用。(相反,auto自动变量,即动态局部变量,属于动态存储类别,占动态存储空间,函数调用结束后即释放)。

另外,属于静态存储方式的量不一定就是静态变量。 例如:外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。

static全局变量

静态全局变量即全局变量前加上static。静态全局变量有以下特点:

1、在全局数据区分配内存(静态变量都在全局数据区分配内存);

2、未经初始化的静态全局变量会被程序自动初始化为0

3、静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的;

static局部变量

静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。可用于两次函数调用之间对变量的值进行保存,有如下特点:

1、该变量也在全局数据区分配内存;

2、在程序刚开始运行时就完成初始化,以后函数调用时不再进行初始化,若没有显示初始化则被自动初始化为0;

3、始终驻留在全局数据区,直到程序运行结束。作用域为局部作用域,到定义它的函数或语句块结束为止;

总之,全局变量改造成static是改变了作用域,局部变量改造成static是改变了生存期;         

static函数

静态函数也称作内部函数,静态函数与普通函数不同,只能在声明它的文件当中可见,不能被其它文件使用;定义static函数的好处在于:不能被其它文件所用,其它文件可以定义相同名字的函数而不发生冲突。在定义函数时,如果没有加关键字static,或冠以关键字extern,表示此函数是外部函数

二、面向对象

static成员变量

对于非静态数据成员,每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员。无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷贝,由该类型的所有对象共享访问。也就是说,静态数据成员是该类的所有对象所共有的。所以,静态数据成员的值对每个对象都是一样的,它的值可以更新。

静态数据成员存储在全局数据区,在定义时要分配空间,所以不能在类声明中定义。它不属于特定的类对象,在没有产生类对象时其作用域就可见,即在没有产生类的实例时,我们就可以操作它;

int Myclass::Sum=0;  //初始化格式

通过类作用域操作符合和成员操作符都可以访问静态成员变量;使用static成员变量的好处在于,一是没有进入程序的全局名字空间,不存在与程序中其它全局名字冲突的可能性;二是可以实现信息隐藏,静态数据成员可以是private成员,而全局变量不能。 

 static成员函数

静态成员函数与静态成员变量一样,都是类的内部实现,属于类定义的一部分。普通成员函数隐含了一个this指针,this指针指向类的对象本身,因为普通成员函数总是具体地属于某个类的对象的。但是静态成员函数不与任何的对象相联系,因此不具有this指针,从这个意义上,它无法访问属于类对象的非static成员变量和非static成员函数,只能调用其余的static成员函数。

关于类的静态函数,总结如下:

1、出现在类体外的函数定义不能指定关键字static;

2、静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;

3、非静态成员函数可以任意地访问静态成员函数和静态数据成员;

4、因为没有this指针,静态成员函数不能访问非静态成员函数和非静态数据成员;

5、因为没有this指针的额外开销,静态成员函数和类的全局函数相比速度上有少许提升;

6、既可以使用类对象或类对象的指针通过成员访问操作符(. 或->)调用静态成员函数,也可以直接用类作用域操作符(::)调用静态成员函数。

posted @ 2015-08-12 15:26  treeland  阅读(169)  评论(0编辑  收藏  举报