目录
C语言中:
1、静态局部变量
静态局部变量和普通局部变量的对比:
(1)该变量在全局数据区分配内存 (局部变量在栈区分配内存);
(2)静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化(局部变量每次函数调用都会被初始化);
(3)静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0(局部变量不会被初始化);
(4)它始终驻留在全局数据区,直到程序运行结束。但其作用域不变,还是为局部作用域,也就是不能在函数体外面使用它(局部变量在栈区,在函数结束后立即释放内存);
2、静态全局变量
定义在函数体外,用于修饰全局变量,表示该变量只在本文件可见。用于文件隔离。
作用域:该文件内部, 生存期:整个程序运行期间
静态全局变量不能被其它文件所用(普通全局变量可以,需要extern);
其它文件中可以定义相同名字的变量,不会发生冲突(自然了,因为static隔离了文件,其它文件使用相同的名字的变量,也跟它没关系了);
C++关键字extern的用法:一个文件中的变量或函数在其他文件中调用
3、静态函数
静态函数的好处跟静态全局变量的好处就类似了:
1.静态函数不能被其它文件所用;(函数默认是extern的)
2.其它文件中可以定义相同名字的函数,不会发生冲突;
C++语言中:
当然以上的几种,也可以用在c++中。还有额外的两种用法:
1、静态成员变量
用于修饰 class 的数据成员,即所谓“静态成员”。这种数据成员的生存期大于 class 的对象(实体 )。静态数据成员是每个class 有一份,普通数据成员是每个对象实体有一份,因此静态数据成员也叫做类变量,而普通数据成员也叫做实例变量。
2、静态成员函数
用于修饰 class 的成员函数。静态函数属于类的,不属于某一个具体的对象。访问方式,可以通过对象调用,也可以用类名::函数名进行访问。
关于静态成员变量和函数例子见链接:4.2.8 静态成员 C++核心编程【从C语言到C++】
static详解:
static用来控制变量的存储方式和可见性
函数内部定义的变量,在程序执行到它的定义处时,编译器为它在栈上分配空间,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时,如何实现? 最容易想到的方法是定义一个全局的变量,但定义为一个全局变量有许多缺点,最明显的缺点是破坏了此变量的访问范围(使得在此函数中定义的变量,不仅仅受此 函数控制)。
需要一个数据对象为整个类而非某个对象服务,同时又力求不破坏类的封装性,即要求此成员隐藏在类的内部,对外不可见。
static的内部机制:
静态数据成员要在程序一开始运行时就必须存在。因为函数在程序运行中被调用,所以静态数据成员不能在任何函数内分配空间和初始化。
static被引入以告知编译器,将变量存储在程序的静态存储区而非栈上空间,静态数据成员按定义出现的先后顺序依次初始化,注意静态成员嵌套时,要保证所嵌套的成员已经初始化了。消除时的顺序是初始化的反顺序。
static的优势:
可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。静态数据成员的值对每个对象都是一样,但它的值是可以更新的。只要对静态数据成员的值更新一次,保证所有对象存取更新后的相同的值,这样可以提高时间效率。