2017-08-12 35 views
1

我想從書中學習C++ Accelerated C++。在第一章結尾處有一個讓我感到沮喪的練習。從本質上講,我很奇怪,爲什麼下面的代碼編譯和運行完美:爲什麼我的C++代碼甚至用雙重聲明的變量編譯?

#include <iostream> 
#include <string> 

int main() { 
    { 
     const std::string s = "a string"; 
     std::cout << s << std::endl; 
     { 
      std::cout << s << std::endl; 
      const std::string s = "another string"; 
      std::cout << s << std::endl; 
     }; 
    } 
    return 0; 
} 

在我看來,我倍加聲明字符串s,從我的理解,這是非法的。你能幫助我更好地理解這一點嗎?謝謝。生成的輸出是:

a string 
a string 
another string 
+0

強相關/可能重複:https://stackoverflow.com/questions/4151203/why-is-this-c-working-variables-with-the-same-name –

回答

5

在C++中,您可以重新聲明嵌套作用域中的變量。在此範圍內,重新聲明的變量優先。

見[basic.scope.hiding]用於標準參考:

的名稱可以由相同的名稱的顯式聲明在嵌套聲明區域被隱藏或派生 類

+0

謝謝。我的理解是,內部範圍包含在外部範圍內,因此就第一個's'而言,它被宣佈了兩次。所以我認爲我對示波器的理解有些偏離。這個概念並不像我想象的那樣「線性」。 – teachMeCpp

+0

@teachMeCpp:的確如此。不過,這至少是合乎邏輯的。與PHP不同的是,在外層作用域中看起來像一個內層作用域的變量聲明可見(範圍的定義很奇怪) – AndyG

+0

我向下面的Filip問了下面的問題:我有點看出它是合乎邏輯的,但我沒有設想這個功能在什麼情況下會有用。你能評論這個嗎? – teachMeCpp

1

這些是兩個獨立的變量,因爲它們在不同的範圍內聲明。變量的範圍是可見的代碼的「區域」。

外部s在內部被s覆蓋。

+0

謝謝。正如我在對AndyG的評論中指出的那樣,我認爲我對範圍的理解是關閉的。我發現外面的'''被覆蓋在內部身體中,但只要代碼退出內部身體,外部's'被恢復。我想知道,這個功能有什麼用處?對於像我這樣的新手來說,它似乎絕對不是萬無一失的。 – teachMeCpp

+0

是的,因爲在體內的''''超出了範圍,所以只有外面的''':-) –

+0

哦,對,我同意,其他的''一定要恢復。我想知道在嵌套範圍內允許重新聲明的這個特性是否有用。這不會造成問題嗎? – teachMeCpp

相關問題