1.不考虑类,即在C语言中,关键字static主要用于修饰变量和函数。
-
修饰变量
修饰变量时,static可以使变量具有默认初始值0,包括未初始化的全局与局部静态变量。
静态全局变量:作用域仅限于变量被定义的文件内,即从定义之处开始知道本文件结束的区域,若在定义之前使用该静态变量,需要加关键字extern。
静态局部变量:作用域仅限于函数体内,但生存周期为整个程序(因为static修饰的变量位于静态存储区)。函数体内的静态变量使函数具有了”记忆性”,函数在下次被调用时,仍然具有上次调用结束时的值。 -
修饰函数
函数前面加static关键字,使函数成为静态函数,作用域仅局限于被定义的文件内,即对其他文件隐藏了该函数,使得不同文件中的函数可以重名,而不必担心命名冲突。
2.C++中对static的扩充,即在类中static的作用。
-
静态数据成员
static数据成员独立于该类的任意对象而存在,即静态的数据成员都是与类相关联的,为该类的所有对象所共用,不像非static数据成员存在于类类型的每一个对象中。
静态数据成员在类中只是引用型声明,而必须在类之外加以定义,同时予以初始化。之所以在类外加以定义,是因为需要以这种方式专门为它们分配空间。 -
静态成员函数
静态成员函数与静态数据成员一样,为类服务,而非类的各个具体的对象。普通成员函数总是属于某个类的具体对象,因此普通的成员函数一般隐藏了一个this指针,this指针指向该对象本身,但由于静态成员函数不属于具体的对象,因而没有此this指针,所以静态成员函数不能被声明为const,毕竟,将成员函数声明为const就是承诺不会修改该函数所属对象,而静态成员函数不属于任何对象。
static成员函数只能调用类的静态成员函数,只能访问类的静态数据成员。