2011-03-03 76 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