const和static的作用辨析以及const和static的区别

一开始认识的时候,很多人觉得static和const规定的变量是不是都不能改变,所以就无法区分这两个关键词

首先字面上理解,const是只读的意思,static是静态的,其次const只在变量声明中使用,而static很重要的一个作用就是规定作用域

我们将C++中的变量分为四个级别:全局变量、函数外static变量、函数内static变量、局部变量

1、全局变量:不仅在定义该变量的源文件中可用,而且在任一别的源文件中只要用 extern 声明它后也可以使用。

2、函数外static变量:函数外的static变量处于文件域中,只有定义它的源文件中可以使用。如果你看到一个static变量,那是作者在安慰你:哥们(妹子),这个变量不会在别的文件中出现。

3、函数内static变量:函数内static变量在函数的每次调用中可用(只初始化一次), 它同以上两种变量一样在程序运行期间一直存在,所以它的功能是局部变量无法实现的。

4、局部变量:在函数的一次调用中使用,调用结束后就消失了。

  显然,作用域越小越省心,该是局部变量的就不要定义成全局变量,如果"全局变量"只在本源文件中使用那就加个static。


所谓的静态变量,并不是指的是该变量的值无法被改变,不能改变值的量叫做常量,我们可以用const来修饰,而之所以说它是静态变量,指的是不会随着函数的调用和退出而发生变化。

  那么根据这个定义,我们可以认定所有的全局变量都是静态变量,因为作用域巨大!对于局部变量,只有声明了static才是局部变量,对比两个程序,一个在Test函数中使用普通int变量,一个在Test函数中使用静态变量。

#include<stdio.h>
int  Test(){
         int c=5;
	 c++;
	 printf("%d\n",c);
}
int main(){
	Test();
	Test();
	return 0;
}

#include<stdio.h>
int  Test(){
static int c=5;
	 c++;
	 printf("%d\n",c);
}
int main(){
	Test();
	Test();
	Test();
	return 0;
}

前者输出6 6 6,后者出书6 7 8。对于普通变量而言,函数一旦结束,变量的空间就会被释放。而对于静态变量,其存储空间为内存的静态数据区,该区域中的数据在整个程序的运行期间都不被释放,也可以认为其内存地址是不变的,直到整个程序结束(属于静态存储方式的变量不都是静态变量,比如外部变量只有加上static之后才是静态变量)

我们对比两个程序可以发现,静态变量的第二次定义并没有生效,要注意的一点是,对于一般的变量,如果我们重复定义不仅仅不会忽略第二次定义,甚至还会报错。而对于静态变量则不是,系统只要看到了这是静态变量便会直接忽略第二次定义,前提当然要在定义域。

另外如果把上面的变量定义成const,那么程序是会报错的,显示read-only。

我们对比两个程序,不难发现除了保持”静态“之外,static其实也变相规定了变量的作用域,那么我们对比来看

在C++中,我们分变量、文件还有函数三种;类型来说明const和static的区别

1、对于变量而言

  const表示是只读变量,一切试图改变const变量的指令均会被报错;

  static规定此全局变量只在当前模块或者文件中可见

  

2、对于文件而言

  文件指针在C++中可以看作是一个变量,所以与变量类似

3、对于函数而言

  const返回只读变量的函数

  staitc规定此函数仅仅在当前模块中可见

特殊的,static const表示该变量既是只读的,又是只在当前模块中可见的。最后

//const表示指针
int const *a;  file://a可变,*a不可变
int *const a;  file://a不可变,*a可变 


  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值