2017-01-25 49 views
2

最近我看到這個代碼cppreference:C++嵌套的作用域訪問

string str="global scope"; 

void main() 
{ 
    string str="main scope"; 
    if (true){ 
     string str="if scope"; 
     cout << str << endl; 
    } 
    cout << str << endl; 
} 

,輸出:

if scope 
main scope 

這是好的,我明白了整個嵌套範圍的事情,我知道, if語句中的'str'將在語句結束時解除堆棧時被銷燬,所以在此之後它不會被使用,因此第二次打印將主'str'作爲它的參數。

但是,我知道主要'str'實際上在IF內部可用,或者至少應該是這樣,但問題是如何從IF語句內部訪問主'str'?

我怎樣才能從主內部和/或內部訪問全局'str'?

我知道使用不同的名稱會更簡單,但這個問題不是針對特定的實際應用,而是爲了更好地理解C++範圍。

+0

cppreference永遠不會有 「無效的主要」。這甚至不會編譯。 – Cubbi

+0

取決於您的編譯器 – J3STER

+0

它不會在使用gcc和clang的cppreference.com上編譯。 – Cubbi

回答

4

這是一個名稱隱藏問題。並且

我怎樣才能從IF語句中訪問主'str'?

不幸的是,這是不可能的。沒有辦法訪問這些隱藏的本地名字。

我怎樣才能從主內部和/或內部訪問全局'str'?

您可以使用scope resolution operator ::,例如, ::str,它是指在全球範圍內的名稱str

+0

謝謝,你是100%肯定它的不可能的(第一個問題)> – J3STER

+1

@ J3STER是的,我是。沒有辦法訪問這些隱藏的本地名字。 – songyuanyao

+0

我會再次指出,局部變量對於範圍之外的所有內容都是不可訪問的。另外局部變量在範圍退出時被銷燬,所以我不知道如何訪問該對象? – PaulHK

3

if塊不能引用main()中定義的str變量,除非更改其中一個變量的名稱。不可能訪問與內部變量同名的外部變量。

但是,可以使用::運算符訪問全局變量。

雖然,周圍的工作可能是使用指針:

string str = "global-scope"; 

void main() 
{ 
    string str = "main scope"; 
    string *ptrOfStr = &str; 
    if (true){ 
     string str = "if scope"; 
     cout << str << endl; 
     cout << "Value of str in main block : " << *ptrOfStr; 
    } 
    cout << str << endl; 
}