2010-05-10 16 views
16

在C++中,shadowed變量名稱的作用域分辨率(「優先順序」)是多少?我似乎無法在網上找到簡明的答案。在C++中,陰影變量名稱的作用域分辨率(「優先順序」)是什麼?

例如:

#include <iostream> 

int shadowed = 1; 

struct Foo 
{ 
    Foo() : shadowed(2) {} 

    void bar(int shadowed = 3) 
    { 
     std::cout << shadowed << std::endl; 
      // What does this output? 

     { 
      int shadowed = 4; 
      std::cout << shadowed << std::endl; 
       // What does this output? 
     } 
    } 

    int shadowed; 
}; 


int main() 
{ 
    Foo().bar(); 
} 

我想不出任何其他範圍內,其中一個變量可能會發生衝突的。如果我錯過了一個,請告訴我。

bar成員函數中,所有四個shadow變量的優先順序是什麼?

+0

你可以在'bar()'裏面有一個聲明'shadowed'的代碼塊。 – 2010-05-10 17:34:09

+0

「範圍分辨率」 – 2010-05-10 17:35:43

+0

添加了bar()內的代碼塊的情況。 – 2010-05-10 17:37:26

回答

31

你的第一示例輸出3.您的第二輸出端4.

一般的經驗法則是從「最本地」該查找轉移至「至少局部」變量。因此,這裏的優先級是塊 - >本地 - >類 - >全局。

您也可以訪問大多數版本明確的陰影變量:

// See http://ideone.com/p8Ud5n 
#include <iostream> 

int shadowed = 1; 

struct Foo 
{ 
    int shadowed; 
    Foo() : shadowed(2) {} 
    void bar(int shadowed = 3); 
}; 

void Foo::bar(int shadowed) 
{ 
    std::cout << ::shadowed << std::endl; //Prints 1 
    std::cout << this->shadowed << std::endl; //Prints 2 
    std::cout << shadowed << std::endl; //Prints 3 
    { 
     int shadowed = 4; 
     std::cout << ::shadowed << std::endl; //Prints 1 
     std::cout << this->shadowed << std::endl; //Prints 2 
     //It is not possible to print the argument version of shadowed 
     //here. 
     std::cout << shadowed << std::endl; //Prints 4 
    } 
} 

int main() 
{ 
    Foo().bar(); 
} 
5

應該打印出來3.基本規則主要是通過文件你的工作方式落後到最近的定義編譯器會看到(編輯:它沒有超出範圍),這就是它使用的。對於某個類的局部變量,除了之外,您還遵循相同的,即所有類變量都視爲在類定義的開始處定義的那樣。請注意,這對於類來說或多或少是獨一無二的。例如,給定這樣的代碼:

int i; 

int x() { 
    std::cout << i << '\n'; // prints 0; 
    int i=1; 
} 

即使有i這是本地的功能,看到最近的定義在使用cout是全球性的,所以這是在表達i指至。但是,如果這是在一個類:

int i; 

class X { 
    void y() { std::cout << i << "\n"; } 

    X() : i(2) {} 

    int i; 
}; 

然後cout表達式將參考X::i即使它的定義還沒有見過的,當y被解析。

+0

+1關於變量尚未申報的好處。 – 2010-05-10 17:50:04

+0

「對類是局部的變量」更好地說:變量是類的_members_。 – Melebius 2017-03-14 07:13:55

相關問題