秩序

2013-05-03 67 views
0

類聲明的名稱的評價有這樣的代碼:秩序

#include <iostream> 

const int c = 3; 

struct A { 
    static int f() { return c; } 
    static const int c = 2; 
}; 

int main() { 
    std::cout << A::f() << std::endl; // 2 
    return 0; 
} 

它是如何發生的變量c定義A在功能f使用可變c,而不是在全球範圍內,雖然定義首先聲明全局變量c

回答

1

不是聲明順序而是可變範圍的問題,所使用的變量被之前在當前的方法/功能中的類/結構和所述和在全球範圍內, 例如後搜尋:

#include <iostream> 

const int c = 3; 

struct A { 
    static void print() { 
     int c = 4 
     std::cout <<"Method Scope:"<< c << std::endl; // 4 
     std::cout <<"Class/Struct Scope:"<< A::c << std::endl; // 2 here you can use alse ::A::c 
     std::cout <<"Global Scope:"<< ::c << std::endl; // 3 
    } 
    static const int c = 2; 
}; 

struct B { 
    static void print() { 
     std::cout <<"Method Scope:"<< c << std::endl; // 2 
     std::cout <<"Class/Struct Scope:"<< B::c << std::endl; // 2 here you can use alse ::A::c 
     std::cout <<"Global Scope:"<< ::c << std::endl; // 3 
    } 
    static const int c = 2; 
}; 

struct C { 
    static void print() { 
     std::cout <<"Method Scope:"<< c << std::endl; // 3 
     //std::cout <<"Class/Struct Scope:"<< C::c << std::endl; //is inpossible ;) 
     std::cout <<"Global Scope:"<< ::c << std::endl; // 3 
    } 
}; 

int main() { 
    A::print(); 
    B::print(); 
    C::print(); 
    return 0; 
} 
3

首先聲明哪個變量無關緊要:如果一個類中有一個名稱相同的變量,該變量會勝過全局變量。否則,只需通過聲明一個名稱爲其成員變量之一的全局變量就可以獲得現有代碼的很多麻煩!

當然你的類可以使用範圍解析運算符來直接引用全球c

static int f() { return ::c; } 

現在your program will print 3 instead of 2

0

想象一下,你有很長的代碼使用了很多變量,你想讓它們從函數所屬的類中被調用嗎?聲明:

ab

意味着

this->a

this->b

,如果你想全局變量是可見的,你必須使用它像

::a::b這函數內部,所以通過:

static int f() { return ::c; } 

從標準文檔,二段3.3.1

每名是在程序文本的一些部分引入稱爲聲明性區域,這是該名稱是有效的,即該名稱可以用作非限定名稱來指 相同實體的 程序的大部分。一般而言,每個特定名稱僅在程序文本 的一些可能不連續的部分內有效,稱爲其範圍。爲了確定聲明的範圍,有時可以方便地參考聲明的潛在範圍 。聲明的範圍是相同,作爲其潛在範圍,除非潛在範圍包含另一個 聲明具有相同名稱。在這種情況下,內部(含有)聲明性區域 區域中的聲明的潛在範圍從外部(包含)聲明區域中的聲明範圍中排除。

這意味着潛在範圍與聲明的範圍相同,除非發生另一個(內部)聲明。如果發生,外部聲明的潛在範圍是刪除只是內部聲明的成立,所以你的全局變量是隱藏的。