不论程序的什么的位置,使用到的每个名字都会指向一个特定的实体:变量、函数、类型等。然而,同一个名字如果出现在程序的不同位置,也可能指向的是不同实体。
作用域(scope):是程序的一部分,在其中名字有其特定的含义。c++语言中大多数作用域都以花括号{}分搁。同一个名字在不同的作用域中可能指向不同的实体。名字的有效区域始于名字的声明语句,以声明语句所在的作用域末端为结束。
例如:
#include<iostream>
int main()
{
int sum=0;
for(int val=1;val<=10;val++){
sum+=val;
}
std::cout<<"Sum of1 to 10 inclusive is"
<<sum<< std::endl;
return 0;
}
这段程序定义了3个名字:main、sum、和val,同时使用了命名空间名字std,该空间提供了2个名字cout和cin供程序使用。
名字main定义于所有花括号之外,它和其他大多数定义在函数体之外的名字一样拥有全局作用域(global scope)。一旦声明过后,全局作用域内的名字在整个程序的范围之内都可使用。名字sum定义于main函数所限定的作用域之内,从声明sum开始到main函数结束为止都可以访问它,但是出了main函数所在的区域就无法访问了,因此说变量sum拥有块作用域(block scope)。名字val定义于for语句内,在for语句内可以访问val,但是在main函数的其他部分就不能访问它了。
嵌套的作用域 作用域能彼此包含,被包含(或者说被嵌套)的作用域称为内层作用域(inner scope),包含着别的作用域的作用域称为外层作用域(outer scope)。
作用域中一旦声明了某个名字,它所嵌套着的所有作用域中都能访问该名字。同时,允许在内层作用域中重新定义外层作用域已有的名字。
例如:
该程序仅用于说明:函数内部不宜定义与全局变量相同的新变量
int val= 42;//val拥有全局作用域
int main(){
int val=0;新建局部变量val,覆盖了全局变量val。
std::cout<<val<<std::endl;//使用局部变量val,输出 0;
std::cout<<::val<<std::denl;//显式地访问全局变量val,输出42(使用了作用域操作符::来覆盖默认的作用域规则,因为全局变量本身没有名字,所以当作用域操作符的左侧为空时,向全局作用域发出请求获取作用域操作符右侧名字对应的变量。)
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步