2011-03-03 71 views
4

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

#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 

是否有访问的“a”等于2的if语句里面,其中有一种方法的 'a' 等于3,与输出

3 2 1 
2 1 

注意:我知道ŧ他的应该没有完成(和代码不应该达到我需要问的地步)。这个问题更多“可以它完成”。

+0

我不知道是否有语法(我怀疑它),但请注意,在实践中,因为两个变量都在同一个函数中,您将*总是*控制它们两个,所以你可以自由只需重命名其中一个... –

+0

简单。重命名变量a1 a2 a3重建它现在可以工作。严重的是,即使它被允许,它也会出现在每个编码标准的不良练习部分。为每个变量使用唯一的名称。 –

回答

8

不,你不能隐藏(2)。

价:3.3.7/1

名称可以通过显式 声明相同名称的在 嵌套声明性区域被隐藏或派生 类(10.2)。

价:3.4.3/1

一个类或命名空间 成员的名称可被称为后:: 范围解析操作者施加到嵌套名(5.1) - 指定者 ,提名其类或名称空间。 在查找 之前的名称期间,:: scope resolution操作符 对象,函数和枚举器名称 被忽略。如果找到的名称不是 的类名称(第9条)或 名称空间名称(7.3.1),则程序为 不合格。

0

简答:没有。你基本上覆盖了本地的继承范围,它将使用本地副本来继承任何继承的本地副本。

基本上像一个子对象重写父对象的函数或变量,它将使用它的副本,而不管父对象是什么。

+0

它不像类级别范围 - 在这种情况下,有一种语法可以明确引用其他范围。 – Keith

+0

是的,但我只是指默认行为。 – rayman86