作用域与生命周期是描述了常量,变量,函数的等对象的使用范围,当程序代码中这些对象一旦超过了这个范围,那么将出现编译错误。下面我们来研究一下它;
局部作用域描述的是函数体中变量和函数的适用范围,每一个函数都有自己的局部作用域。在函数体中定义的变量,函数对于外部函数是不可见的看,因为他们在函数的局部作用域中,对函数复合语句定义的对象在语句外也是不可使用的,因为它也有自己的作用域;局部变量的生命期短,全局变量的生命期长;因为局部变量在定义后的生命在面对第一个大括号就结束了,而全局变量的生命周期将在main函数结束时才结束。
例如:
由上可以看到由于a在局部作用域中定义的在这个作用域外的就不可以使用,所以出现了编译错误。
而如果是:在main这个作用域中定义一个相同的变量名时。
#include<iostream>
using namespace std;
int main()
{
{
int a=10;
}
cout<<a<<endl;
}
同样在main函数中定义的变量在其他范围内也不行,如果使用了全局变量那么变量的作用域将覆盖整个函数
例如:
#include<iostream>
using namespace std;
//int a=30;
void show();
int main()
{
int a=20;
printf("局部作用域\n");
{
int a=10;
cout<<a<<endl;
}
printf("main作用域中\n");
cout<<a<<endl;
show();
return 0;
}
void show()
{
cout<<"全局"<<endl;
cout<<a<<endl;
}
如果将注释的解除,那么这个程序就可以运行了;
那么,接下来我们在看一个代码:
#include<iostream>
using namespace std;
int main()
{
int a=5;
{
cout<<a<<endl;
int a=10;
cout<<a<<endl;
}
cout<<a<<endl;
return 0;
}
大家可以看看这个代码的结果是,
5
10
5
这就是另外一个问题了,当在所在的定义域内找不到输出的定义,那么函数将向该定义域上层的定义域中寻找;同样,我们也可以看到作用域的长短了,在单独的作用域定义的变量,在作用域外无法使用了。