一开始认识的时候,很多人觉得static和const规定的变量是不是都不能改变,所以就无法区分这两个关键词
首先字面上理解,const是只读的意思,static是静态的,其次const只在变量声明中使用,而static很重要的一个作用就是规定作用域
我们将C++中的变量分为四个级别:全局变量、函数外static变量、函数内static变量、局部变量
1、全局变量:不仅在定义该变量的源文件中可用,而且在任一别的源文件中只要用 extern 声明它后也可以使用。
2、函数外static变量:函数外的static变量处于文件域中,只有定义它的源文件中可以使用。如果你看到一个static变量,那是作者在安慰你:哥们(妹子),这个变量不会在别的文件中出现。
3、函数内static变量:函数内static变量在函数的每次调用中可用(只初始化一次), 它同以上两种变量一样在程序运行期间一直存在,所以它的功能是局部变量无法实现的。
4、局部变量:在函数的一次调用中使用,调用结束后就消失了。
显然,作用域越小越省心,该是局部变量的就不要定义成全局变量,如果"全局变量"只在本源文件中使用那就加个static。
那么根据这个定义,我们可以认定所有的全局变量都是静态变量,因为作用域巨大!对于局部变量,只有声明了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可变