1.修饰局部变量
static 修饰局部变量时, 这个变量成为静态变量, 存储在静态区, 生命周期和程序相同, 这个变量在 main 函数之前初始化,在程序退出的时候销毁.
即使在退出函数之后,这个变量也不会被销毁.
-
修饰全局变量
全局变量本来就在静态区,但是 static 可以限制他的连接属性,被 static 修饰的全局变量只能被被包含该定义的文件访问. 因此可以将变量的声明和定义放在头文件中,从而被多个(非常不推荐,使用 extern更好) -
修饰函数
static 修饰的函数只能在该函数定义的文件中被调用.其定义和声明需要放在同一个文件中. -
类成员修饰
- 静态成员函数属于同一个类,而不是某一个成员,不能是虚函数,能节省子类的内存空间
- 静态数据成员必须初始化,要在类外初始化,静态数据成员属于整个类,而不是任何一个类的成员. 但是 const static 是可以在类内初始化的,因为这个值是固定的,编译器不会尝试多次初始化(**类外定义,类内声明)
初始化时不要加上
static
作用
- 隐藏(作用域)
修饰全局变量和函数的时候,只有在包含他们定义的地方,才能被调用,对于其他. c 文件,他们是不可见的. - 确定生存周期(static 有记忆功能,仅仅初始化一次)
全局变量和静态变量都存储在静态区,静态变量可以控制可见范围.局部变量的生存周期和整个程序相同(初始化在 main 之前,退出所在函数后不销毁,但是不能访问因为作用域的原因.)
#include <stdio.h>
int fun(){
static int count = 10; //在第一次进入这个函数的时候,变量a被初始化为10!并接着自减1,以后每次进入该函数,a
return count--; //就不会被再次初始化了,仅进行自减1的操作;在static发明前,要达到同样的功能,则只能使用全局变量:
}
int count = 1;
int main(void)
{
printf("global\t\tlocal static\n");
for(; count <= 10; ++count)
printf("%d\t\t%d\n", count, fun());
return 0;
}
输出为
图片.png
结论
局部变量->静态变量: 生存期和初始化方式
全局变量->静态变量: 作用域(静态变量只能在定义的文件中可以被调用)
-
默认初始化为0
-
修饰成员函数和成员变量
静态成员属于整个类而不是任何一个对象,只存储一份供给所有对象共享
- 类成员可以调用静态成员函数和静态成员对象
- 静态成员函数不能调用非静态成员变量,因为静态成员函数属于整个类,在实例化之前就已经分配空间,但是成员变量必须实例化之后才能存在
- 非静态成员函数可以调用静态成员函数,反之不行
网友评论