在C语言中的作用
- 如果一个变量被声明为静态的,那么该变量可以被当前文件内所有函数访问,但不能被其他文件中的函数访问。
- 一个被声明为静态的变量只会被初始化一次,在这一函数被调用的过程中其值维持不变。
在C++中的作用
- 包含了在C语言中的作用
- 类内数据成员的也可以被定义为static,在这种情况下,该数据成员就是类的静态数据成员
- 静态数据成员被当作是类的成员,只会存在唯一的副本,且被所有对象共享
- 静态成员变量属于类而不属于对象,即使没有实例化的对象,也可以使用静态变量
- 静态数据成员和普通数据成员一样遵从public、protected、private访问规则
- 被private或protected修饰的static成员可以在类外初始化,但是不能在类外被访问
- 被static修饰的函数是类的静态成员函数,静态成员函数属于类,而不属于某一个特定对象,被所有对象共享。静态成员函数没有this指针,所以无法访问对象成员,也无法访问普通成员函数,它只能访问静态成员函数或静态成员
静态数据成员的优势
- static变量的作用范围是这个变量所在的文件。static变量与全局变量(全局变量的作用范围是整个工程)相比,减少了命名冲突的可能性。
- 可以实现信息隐藏。静态数据成员可以被private修饰,而全局变量不能
能否在头文件中定义静态变量?
不能。如果在头文件中定义静态变量,使用了该头文件的每个C语言文件,按照编译的步骤,都会单独存在一个静态变量,从而会引起空间浪费或者程序错误。
举个栗子
#include <stdio.h>
void func(int v){
static int snum = 1; // 定义一个静态变量并初始化
snum += v;
printf("%d\n", snum);
}
int mian() {
func(1); // 输出 2,静态变量被创建并初始化
func(2); // 输出 4,静态变量已经存在,func 中第一个语句不再执行
func(3); // 输出 7
}