static关键字详解

来源:互联网 发布:大麦盒子网络连接失败 编辑:程序博客网 时间:2024/06/05 18:17

在说明static之前,先说说计算机的内存存储分式


1、计算机存储分式

计算机内存存储分式主要分为以下5种

①静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。
②栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
③堆区:亦称动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或delete释放内存。动态内存的生存期可以由我们决定,如果我们不释放内存,程序将在最后才释放掉动态内存。 但是,良好的编程习惯是:如果某动态内存不再使用,需要将其释放掉,否则,我们认为发生了内存泄漏现象。

④代码区:存放函数体的二进制代码

⑤文字常量区 :常量字符串就是放在这里的。 程序结束后由系统释放

2、static局部变量和普通局部变量

作用域上相同: 静态局部变量和普通局部变量的作用域都是局部作用域。
存储域上不同:静态局部变量是存储在静态存储区,而且它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在。而普通局部变量存储在栈区域,当程序执行出了作用域后就介绍。

3、static全局变量和普通全局变量

存储域上相同:即两种变量都是存放在静态/全局区,都是在程序编译时就分配内存,直到程序运行结束后才释放。
作用域上不同:静态全局变量只能在声明的本文件中调用,不能被其他文件调用,而普通全局变量可以通过extern关键字被其他文件引用。

4、static函数和普通函数

    静态函数和普通函数主要不同是在作用域上,声明在静态函数只能被本文件使用,不能被其他文件调用,即属于内部函数,不会跟其他文件的同名函数冲突,而普通函数可以通过extern关键字被其他文件调用,属于外部函数。

5、类的static成员变量和普通成员变量

    静态数据成员属于类,普通数据成员属于某一对象,在类中不给静态数据成员分配内存空间,而是静态数据成员与静态变量一样,是在编译时创建并初始化,它在该类的任何对象被建立之前就存在,静态数据成员不能在类中进行初始化,必须在类外的其他地方为它提供定义;一般在main()开始之前、类的声明之后的特殊地带为它提供定义和初始化;私有静态数据成员不能被类外部函数访问,也不能用对象进行访问。


6、类的static成员函数和普通成员函数

    类的static成员函数属于类本身,不属于某个具体的对象,只能调用类的静态成员变量和成员函数,在静态成员函数中不存在this指针,在调用时直接通过类名引用。而普通成员函数则可以调用类的任意成员,没有限制。

原创粉丝点击