static 的作用

来源:互联网 发布:互盾苹果数据恢复软件 编辑:程序博客网 时间:2024/06/07 00:35

对于一个完整的程序,在内存中的分布情况如下图:  

代码区 //low address  全局数据区   堆区   栈区 //high address

1、全局变量和全局静态变量的区别, example:

#include <iostream.h>void fn();int n; //定义静态全局变量void main(){ n=20;cout<<n<<endl;fn();} 

//File2#include <iostream.h>extern int n;void fn(){ n++;cout<<n<<endl;}

把int n改为static int n,测试。  这就是静态全局变量与全局变量的区别。

2、 静态局部变量(全局数据区分配内存,其作用域为局部作用域)

注意:

如果变量没有被显示初始化,那么,在函数体内声明的自动变量的值时随机的,在函数体外声明的自动变量的被初始化为0;

静态初始变量都被初始化为0;

3、静态函数

静态函数不能被其它文件所用; 其它文件中可以定义相同名字的函数,不会发生冲突;

二、面向对象的static关键字

1、静态数据成员定义时要分配空间,所以不能在类声明中定义。

初始化: int A::i = 10;

访问方式: A a;   a.i; 或 A::i;

静态数据成员主要用在各个对象都有相同的某项属性的时候。比如对于一个存款类,每个实例的利息都是相同的。所以,应该把利息设为存款类的静态数据成员。这 有两个好处,第一,不管定义多少个存款类对象,利息数据成员都共享分配在全局数据区的内存,所以节省存储空间。第二,一旦利息需要改变时,只要改变一次, 则所有存款类对象的利息全改变过来了;

静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其它全局名字冲突的可能性;   可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能; 

2,静态成员函数

但是与普通函数相比,静态成员函数由于不是与任何的对象相联系,因此它不具有this指 针。从这个意义上讲,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数


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

调用静态成员函数: A a; a.getX();  或 A::getX();


它被用来控制变量的存储方式和可见性


它的空间分配有三个可能的地方,一是作为类的外部接口的头文件,那里有类声明;二是类定义的内部实现,那里有类的成员函数定义;三是应用程序的main()函数前的全局数据声明和定义处。

不能将静态成员函数定义为虚函数


还有几项注意事项。




原创粉丝点击