什么是static
static是C/C++中常用修饰符,也常被称为“静态”
static存在的目的
在程序当中,变量的存在类型大致分为全局变量、静态变量、局部变量
程序中所定义的函数,在调用执行的时候,编译器会给他分配空间,但在函数执行结束后,空间就会被释放,那么函数中定义的局部变量就会丢失;
如果我们需要保留函数中变量的值,那么就不能使用局部变量;
可以采取的方式有两个:
1.使用全局变量
全局变量存在一个问题,他使该变量全局可见,在其他源文件中也可以访问全局变量,这可能会带来不便
2.使用静态变量
在程序中,静态变量的存储是有特定区域的,存储区分为两个段,DATA段和BSS段,其中DATA段是用来放置初始化完成的全局变量和静态变量;BSS段存放还未初始化的全局变量和静态变量,因为未初始化,所以BSS段变量全为0;
上述存储过程在程序执行时就会进行,因此在程序执行过程中全局与静态变量值一直存在;而局部变量在函数调用时生成,函数结束时销毁;
static变量作用
static变量只会执行一次初始化,程序结束时才会释放
while(1)
{
static int a = 10;
a--;
printf("%d", a);
}
上述代码中,变量a的值只会初始化一次,那么输出即为9,8,7,6,5,4,3,2,1,0.............;
static变量可以被隐藏起来
假设存在两个源文件a.c和b.c
内容分别为:
//a.c
int a = 10;
void hello
{
printf("hello\n");
}
//b.c
int main()
{
extern int a;//首先声明一下为外部变量
printf("%d", a);
hello();
return 0;
}
a.c中所定义的全局变量可以在b.c中使用,如果将a.c中变量a定义为静态变量,那么变量a就无法在其他文件中调用,也就是说不同文件中可以存在相同名字的变量,并且程序运行时可以保存该变量的值;
静态函数
同样也存在静态函数的概念,但和静态变量存在不同;
在一个类中,我们会定义很多函数,成员函数的使用需要首先实例化类,才能调用该成员函数,但类中所定义的静态函数就可以直接调用;例如:
class MyClass
{
public void instance_func()
{
printf("This is instance function");
}
public static void staic_func()
{
printf("This is static function");
}
}
调用静态函数与非静态函数的方式:
//调用静态函数,直接调用
MyClass.static_func();
//调用非静态函数,需要实例化
MyClass abc = new MyClass();
abc.instance_func();
因为静态方法属于类的范畴,而不是类的实例,可以通过类名来直接调用静态方法,无需实例化;