在文章开头先写总结吧,省的文章太长大家看的又晕。简单总结下来static关键字具有以下两点作用:改变变量的生命周期和限定作用域
1、改变变量的生命周期
我们都知道在函数中申明的局部变量在函数调用完成后即会被释放,但是由static申明的局部变量的生存周期是长于函数的,也就是说即使函数调用结束后该变量的内存也不会被释放。下面我们直接看代码:
#include
#include
void func()
{
int i = 1 ;
static int i_static = 1;
i ++ ;
i_static ++ ;
std::cout<
}
int main()
{
std::cout<
func();
std::cout<
func();
system("pause");
}
我们运行起来看结果:
first run:
i:2
i_staic:2
sencond run:
i:2
i_staic:3
这样就很清楚了吧:i是普通局部变量的申明方式,在每次函数调用时都会重新分配内存重新初始化,在函数结束后该内存就会被自动释放。但是static声明的局部变量随着第一次函数的调用而初始化,却不随着函数的调用结束而销毁,而是一直存在直至程序结束。具体原理是什么这个就牵涉到C++程序内存的分配原则了。有兴趣的朋友可以关注小编,下一篇为大家详细讲解。
2、限定作用域
用static申明的变量和函数作用域都仅限本文件。关于限定作用域必须得结合C++的另外一个关键字‘extern’来讲解(修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用。关于extern关键字的作用,关注小编后续为大家分享)。好,废话不多说直接上代码(程序猿就是这样,看代码比看文字舒服多了,嘿嘿)
这里有两个 .Cpp 文件其中a.cpp中代码如下:
#include
int test01 = 10 ;
static int test02 = 11 ;
void func1()
{
std::cout<
}
static void func2()
{
std::cout<
}
在这里定义了两个变量(一个静态一个非静态)和两个函数(一个静态一个非静态),然后再另外一个‘源.cpp’中引用他们,我们看运行结果是什么样的(注意看注释的代码)
using namespace std ;
extern int test01 ;
//extern int test02 ;
extern void func1();
extern void func2();
int main()
{
cout<
//cout<
func1();
//func2();
system("pause");
}
按照现在的代码运行结果是:
10
no static func"
但是当我将注释的代码放开然后编译运行就会报错:
![4f790f3c625125f3096da73258156c28.png](https://i-blog.csdnimg.cn/blog_migrate/5a81e74eec8a58fb2489505b06b32c61.jpeg)
这是因为在extern在寻找test02和func2的时候在a.cpp中被static给屏蔽掉(因为static的作用就是限定test02和func2的作用域只是作用于本文件即a.cpp文件)
好了,现在大家应该对于static的作用已经有了很全面的认识了吧!希望我的分享能够帮助大家,祝大家长发飘飘~~~