一、 static 关键字
static定义变量的使用: 一、静态局部变量: 1、Static类内部变量同auto自动变量(即未加 Static 声明的局部变量)一样,是某个特定函数的局部变量,即只能在定义该变量的函数内使用该变量,2者作用域相同;两者的不同在于:auto自动变量会随着函数被调用和退出而存在和消失,而static类局部变量不会,它不管其所在的函数是否被调用,都将一直存在;不过,尽管该变量还继续存在,但不能使用它。倘若再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值。换言之,Static类型的内部变量是一种只能在某个特定函数中使用,但一直占据存储空间的变量。 2、函数体内如果在定义静态变量的同时进行了初始化,则以后程序不再进行初始化操作(出现在函数内部的基本类型的的静态变量初始化语句只有在第一次调用才执行)。而对自动变量赋初值是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。 3、静态局部变量的初始化表达式必须是一个常量或者常量表达式。即使局部静态变量定义时没有赋初值,系统会自动赋初值0(对数值型变量)或空字符(对字符变量);静态变量的初始值为0。而对自动变量auto来说,如果不赋初值则它的值将是个不确定的值。 4、当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。 注:局部静态变量占用内存时间较长,并且可读性差,因此,除非必要,尽量避免使用局部静态变量。 二、静态全局变量 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。 全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。 这两者的区别虽在于: 1、非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 2、静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。 由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。 从以上分析可以看出———— 把局部变量改变为静态变量后是改变了它的存储方式,即改变了它的生存期。 把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。 因此static这个说明符在不同的地方所起的作用是不同的。应予以注意。
1.第一种面向对象的静态成员变量,在类成员变量的声明前加上static关键字,就是静态成员变量了。静态成员变量有以下特点,①静态成员变量是该类所有对象所共有的,无论这个类的对象被定义了多少个,静态成员变量只分配一次内存,它的值对每个对象都一样,而且可以更新。②.不属于特定的类对象,不占对象的内存,它的内存在全局数据区③.内存空间的分配不是声明类时分配也不是实例化对象时分配,是在初始化时分配,静态成员变量必须初始化(是否赋初始值无所谓,默认为0),而且只能在类外初始化。④.可以通过类和对象访问⑤.sizeof()不会计算静态成员变量。它比全局变量的优势是不存在和其他全局命名变量冲突的问题,而且可以实现信息隐藏,可以将其定义为private,它和普通成员变量一样遵循public/private等访问规则。
2.面向对象的静态成员函数。有以下几个特点,①.为类服务,而不是为某个对象服务。因为不作用于对象,所以该函数内不存在指向对象本身的this指针,无法访问类的非静态成员变量和非静态成员函数,只能调用其余静态成员。②.可以通过类和对象来调用该函数。不能将虚函数定义为静态成员函数,因为虚函数调用时要通过this指针来控制虚函数表指针。
3.面向过程的静态全局变量(应用于普通的变量和函数,不涉及类)有以下特点①.该变量在全局数据区分配内存②.未经初始化的静态全局变量初始化为0。③.静态全局变量在声明它的整个文件可见,在文件之外不可见。比起全局变量的好处是其他文件可以定义相同名字的变量不会发生冲突。要注意的是不要在头文件声明静态全局变量,会造成重复定义。
4.静态局部变量,特点①.在全局数据区分配内存。②.首次执行到该对象的声明处进行初始化,后面再次调用该函数不再进行初始化(默认初始化为0)。③.驻留在全局数据域,直到程序运行结束。但是作用域为局部作用域,所以当它的函数或语句块结束时,作用域也随之结束。
5.面向过程的静态函数:只能在声明它的文件可见,不能被其他文件使用。