在不同的范围访问具有相同名称的变量

时间:2011-03-03 23:22:50

标签: c++ scope

使用

#include <iostream>
using namespace std;

        int a = 1;

int main()
{
        int a = 2;

        if(true)
        {
                int a = 3;
                cout << a 
                     << " " << ::a // Can I access a = 2 here?
                     << " " << ::a << endl;
        }
        cout << a << " " << ::a << endl;
}

有输出

3 1 1
2 1

有没有办法在if语句中访问等于2的'a',其中'a'等于3,输出

3 2 1
2 1

注意:我知道应该不能完成(并且代码不应该到达我需要询问的地方)。这个问题更“可以完成”。

2 个答案:

答案 0 :(得分:9)

不,你不能,a(2)被隐藏。

参考:3.3.7 / 1

  

名称可以通过显式隐藏   在a中声明同名   嵌套的声明区域或派生的   class(10.2)。

参考:3.4.3 / 1

  

类或命名空间的名称   会员可以在::之后提及   范围解析运算符(5.1)   应用于嵌套名称说明符   提名其类或命名空间。   在查找之前的名称期间   :: scope resolution运算符,   对象,函数和枚举器名称   被忽略了。如果找到的名称不是   一个类名(第9条)或   namespace-name(7.3.1),程序是   不良形成。

答案 1 :(得分:0)

简答:不。您基本上覆盖了本地的继承范围,并且它将使用该本地副本而不是任何继承的范围。

基本上就像覆盖父对象的函数或变量的子对象一样,无论父对象是什么,它都会使用它的副本。