对于一个完整的程序,在内存中的分布情况如下图:
代码区 //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()函数前的全局数据声明和定义处。
不能将静态成员函数定义为虚函数
还有几项注意事项。