导航

名字的作用域

Posted on 2021-01-26 17:26  抑或  阅读(130)  评论(0编辑  收藏  举报

不论程序的什么的位置,使用到的每个名字都会指向一个特定的实体:变量、函数、类型等。然而,同一个名字如果出现在程序的不同位置,也可能指向的是不同实体。

作用域(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;

            

1