1 C语言中
在C语言中,static有三个明显作用:
- 函数体内static变量,不会随函数结束而消亡。再次调用该函数时,该变量且不再初始化,其值为最后一次操作后的结果。
- 在模块内,如果一个变量被声明为static,则该模块所有函数皆可访问,但其作用域仅限于本文件中。
- 内部函数(静态函数)只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用。
2 C++类内成员
2.1 静态数据成员
使用规则:
- 对于非静态成员,每个类都有自己的拷贝,而静态数据成员是类成员,存储在全局数据区,不论类有多少对象,都只有一份拷贝,即使无类实例,也可使用。
2) 静态数据成员和普通成员一样遵从public、protected、private访问规则。
3) static成员变量初始化在类外,此时不能带上static关键字。protected、private的static成员虽然在类外初始化,但在类外不能访问。
与全局变量相比,静态数据成员具有以下两点优势:
- 静态数据成员没有进入程序全局名字空间,因此不存在与程序其他全局名字冲突的可能性。
- 可实现信息隐藏。静态数据成员可以是private,而全局变量则不能。
2.2 静态成员函数
使用规则:
- 与静态数据成员相似,是类的一部分,为所有对象共享。
- 由于无this指针,所以不能访问类非静态数据成员和非静态成员函数。
3 为什么static变量只初始化一次?
实际上,对于所有对象,不仅仅是静态对象,初始化都只有一次。
静态对象存放在静态区,其生命周期较长,通常与整个源程序相同,初始化后一直保存在内存区域中,故不会再次初始化。auto变量存放在栈区,一旦调用过程结束,则被自动销毁。
4 在头文件中定义静态变量,是否可行?
不可行。如果在头文件中定义静态变量,使用了该头文件的每个C语言文件,按照编译规则都将单独存在一个静态变量,从而引起空间的浪费和程序错误。
所以不建议在头文件定义任何变量,包括静态变量。