static 的作用

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

代码区 //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()函数前的全局数据声明和定义处。

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


还有几项注意事项。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值