前言
这篇文章是总结整理static在C#/C++中的用法
static意义:
中文翻译为“静态的”,在C语言中主要用来修饰变量和函数。其中c++对用法进行了补充。
static用法与基础回顾:
static的用法主要体现在两个方面:面向过程中的static和面向对象中的static。
面向过程的static主要包括静态全局变量、静态局部变量和静态函数。
面向对象的static主要包括静态成员变量、静态成员函数。(c++补充)
这里阐述一下全局变量和局部变量:
引用来源:http://c.biancheng.net/view/1858.html
局部变量:
定义在函数内部的变量称为局部变量(Local Variable),它的作用域仅限于函数内部, 离开该函数后就是无效的,再使用就会报错。例如:
int f1(int a){
int b,c; //a,b,c仅在函数f1()内有效
return a+b+c;
}
int main(){
int m,n; //m,n仅在函数main()内有效
return 0;
}
几点说明:
-
在 main 函数中定义的变量也是局部变量,只能在 main 函数中使用;同时,main 函数中也不能使用其它函数中定义的变量。main 函数也是一个函数,与其它函数地位平等。
-
形参变量、在函数体内定义的变量都是局部变量。实参给形参传值的过程也就是给局部变量赋值的过程。
-
可以在不同的函数中使用相同的变量名,它们表示不同的数据,分配不同的内存,互不干扰,也不会发生混淆。
-
在语句块中也可定义变量,它的作用域只限于当前语句块。
全局变量
在所有函数外部定义的变量称为全局变量(Global Variable),它的作用域默认是整个程序,也就是所有的源文件,包括 .c 和 .h 文件。例如:
int a, b; //全局变量
void func1(){
//TODO:
}
float x,y; //全局变量
int func2(){
//TODO:
}
int main(){
//TODO:
return 0;
}
a、b、x、y 都是在函数外部定义的全局变量。C语言代码是从前往后依次执行的,由于 x、y 定义在函数 func1() 之后,所以在 func1() 内无效;而 a、b 定义在源程序的开头,所以在 func1()、func2() 和 main() 内都有效。
1.修饰静态局部变量
引用来源:https://blog.csdn.net/weixin_60804760/article/details/127467571
static修饰局部变量时,会改变局部变量的存储位置,从而使得局部变量的生命周期变长,但是不改变作用域
可以简单理解为static可以使得局部变量一直保持,但是不能改变局部变量应用的范围,比如外部文件应用。
用一段代码来阐述:
void test()
{
int x = 0;
x++;
printf("%d ", x);
}
int main()
{
int i = 0;
while (i < 10)
{
test();
i++;
}
return 0;
}
这段代码每次调用text()的时候都会令x = 0,然后每次print也都是1,因为每次调用text的时候都会创建局部变量x并且赋值为0,当结束text()程序后自动清除。
当加入static的时候,相当于使局部变量x成为静态的,每次text()结束后不会清除,再次调用text的时候还会保留上面的值
其本质是:普通的局部变量创建后是放在栈区中,这种局部变量进入作用域时创建,出了作用域就销毁;但static修饰后的局部变量则放在静态区中,它改变了局部变量的存储位置,从而使得变量的生命周期延长,延长至程序结束才销毁
2.修饰静态全局变量
引用来源:https://blog.csdn.net/weixin_60804760/article/details/127467571写的很详细了,这里借助他的图,
全局变量的作用域十分的广,只要在一个源文件中定义后,这个程序中的所有源文件、对象以及函数都可以调用,生命周期更是贯穿整个程序。文件中的全局变量想要被另一个文件使用时就需要进行外部声明(以下用extern关键字进行声明)。
借用了Max羊羊的图,可以看到全局变量x在自己的文件可以直接使用,但是如果在另一个文件就不能直接使用,需要用extern关键字声明
(extern关键字可以看这篇文章,写的很详细了https://blog.csdn.net/qq_27664167/article/details/82859852)
但是加入static的时候,extern就无法进行调用。
其本质是:
全局变量本身是具有外部链接属性的,在A文件中定义的全局变量,在B文件中可以通过【链接】来使用;但如果全局变量被static修饰,那这个外部链接属性就会被修改成内部链接属性,此时这个全局变量就只能在自己的源文件中使用
3.修饰静态函数
static对函数的修饰与修饰全局变量十分相似,修饰函数时会改变函数的链接属性,从而使得函数的作用域变小。
也就是说加入了static后无法进行调用
面向对象的static
静态成员变量
这里还没学会,先放下