对于一个程序,内存分配情况如下:
============================
| 代码区 |
--------------------------------------------------
| 全局数据区 |
-------------------------------------------------
| 堆区 |
--------------------------------------------------
| 栈区 |
=============================
一般程序采用new 产生的动态数据存放在堆区,函数内部的自动变量存放在栈区。全局变量和static 修饰的变量放在 全局数据区。
static 的作用:
1. 扩展了生存期
2. 限制了作用域
3. 实现了唯一性
一。 面向过程设计中的 static
1.【静态数据全局变量】 在全局变量前加关键字 static
静态全局变量特点;
1.该变量在全局数据区分配内存
2.未经初始化得静态全局变量被初始化为0
3.静态全局变量在初始它的文件中是可见的,而在文件之外是不可见的
定义全局变量就可以实现变量在文件中共享,但是定义静态全局变量还有以下好处;
静态全局变量不能被其他文件所用。
其他文件中可以定义相同的名字,不会发生冲突。
2. 【静态局部变量】 在局部变量前加关键字 static
通常情况,在函数体内定义变量, 每当程序运行到该语句是, 局部变量会分配栈区内存, 当函数体结束时,系统会回收栈区内存,局部变量也就消失。
但有时希望在两次调用函数体是, 局部变量的值给予保存。 这样 静态局部变量就可以解决这个问题。
静态局部变量保存在 全局数据区, 特点如下:
1.该变量在全局数据区分配内存
2.静态局部变量在程序执行到该对象的声明处初始化,以后函数运行到此不必初始化。
3.静态局部变量一般在声明处初始化,若不初始化,默认初始化为0
4.它始终驻留在全局数据区, 知道程序运行结束。 其作用域是局部作用域,当其定义的函数体结束时, 其作用域也就结束
3【静态函数】 在函数返回类型前加上static
特点:
1. 只能在它声明的文件中可见, 不能被其他文件使用
2.其他文件可定义相同名函数, 不发生冲突
二。面向对象设计中的static (类中的static)
1【静态数据成员变量】 在类内的成员变量前加上static, 该数据成员变量是类的静态数据成员变量。
特点:
1.静态数据成员被当做类的成员,无论这个类的对象被定义了多少个,静态数据成员变量只有一份拷贝,由该类型的所有对象所共享访问。
2.静态数据成员变量存放在全局数据区, 属于本类的所有对象共享。 所以它不属于某个类对象,在没有产生类对象时其作用域就可见,
即在没有产生类的实例前, 就可以操作它。
相对于全局变量,静态成员变量特点;
1.静态数据成员变量没有进入程序的全局名字空间, 不存在与程序中其他全局变量名字冲突的可能
2.可以实现信息的隐藏。 加上关键字 private 等, 全局变量则不能
2.【静态成员函数】
它为类的全部服务,而不是为某个类的具体对象拂服务。与普通函数相比, 静态成员函数由于不是与任何的对象相联系,故它不具备this指针,
从这个意义上讲, 它无法访问类的其他非静态成员函数,也无法访问类的非其他静态成员变量,只能调用其他的静态成员函数。
特点;
1.出现在类体外的函数定义前不能有static 关键字。
2. 静态成员函数可以相互访问。 静态成员函数以及静态成员变量
3. 非静态成员函数可以随便的访问 静态成员函数以及静态数据成员变量
4.静态成员函数不能访问非静态成员函数以及非静态数据成员变量。