Static主要用在五个地方,修饰全局变量,修饰局部变量、修饰普通函数、修饰类成员变量、修饰类成员函数。下面逐个说明。
Static修饰全局变量,也就是静态全局变量,它在全局数据区分配内存,而且静态全局变量默认初始化为0,非静态变量默认初始化时随机的,此外,静态全局变量只能在本文件中使用,其他文件不能使用它,就算是extern也不行,也正因这个,不同文件命名相同名字的静态全局变量也不会冲突。
Static修饰局部变量也被成为静态局部变量,静态局部变量也在全局数据区分配内存,它只能被初始化一次,也就是在首次运行到该变量时。静态局部变量默认的初始化也是0。还有,静态局部变量只在它的作用域里有效。比如我在while循环里定义一个静态局部变量,它只初始化一次,且只作用域循环体内。
Static修饰函数时,该函数就成了静态函数,静态函数只能做在本文件中使用,因此,其他文件定义同名的静态函数也不会冲突。
再来就是static修饰类成员变量。Static成员变量分分配的内存也是在全局数据区。因为这个,它必须在类外定义,而不能再类内定义,类内定义的变量只有在构造对象时才会分配空间,而static成员变量时对象构造前就已经存在的。同理,由于它在全局数据区,所有对象共享一个同一个static成员变量的副本。与全局变量相比,static成员变量未进入全局命名空间,因此不会与全局变量发生命名冲突,而且static成员变量也遵从访问权限控制。
最后一个是类的static成员函数,static成员函数为整个类服务,而不是只为单个对象服务。同样,static成员函数也要在类内声明,类外定义。此外,普通的类成员函数在传参时会隐式传递一个this指针,但是static成员函数不会,因此,他不能访问对象的成员变量,只能访问static成员变量,同样是因为这个,static成员函数不能被定义为虚函数。