C#/C++中static的总结(个人笔记)

前言

这篇文章是总结整理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;
}

几点说明:

  1. 在 main 函数中定义的变量也是局部变量,只能在 main 函数中使用;同时,main 函数中也不能使用其它函数中定义的变量。main 函数也是一个函数,与其它函数地位平等。

  2. 形参变量、在函数体内定义的变量都是局部变量。实参给形参传值的过程也就是给局部变量赋值的过程。

  3. 可以在不同的函数中使用相同的变量名,它们表示不同的数据,分配不同的内存,互不干扰,也不会发生混淆。

  4. 在语句块中也可定义变量,它的作用域只限于当前语句块。
    全局变量
    在所有函数外部定义的变量称为全局变量(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羊羊的图
在这里插入图片描述
在这里插入图片描述

借用了Max羊羊的图,可以看到全局变量x在自己的文件可以直接使用,但是如果在另一个文件就不能直接使用,需要用extern关键字声明
(extern关键字可以看这篇文章,写的很详细了https://blog.csdn.net/qq_27664167/article/details/82859852)
但是加入static的时候,extern就无法进行调用。

其本质是:
全局变量本身是具有外部链接属性的,在A文件中定义的全局变量,在B文件中可以通过【链接】来使用;但如果全局变量被static修饰,那这个外部链接属性就会被修改成内部链接属性,此时这个全局变量就只能在自己的源文件中使用

3.修饰静态函数

static对函数的修饰与修饰全局变量十分相似,修饰函数时会改变函数的链接属性,从而使得函数的作用域变小。

也就是说加入了static后无法进行调用

面向对象的static

静态成员变量

这里还没学会,先放下

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值