秩序

2013-05-03 68 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

每名是在程序文本的一些部分引入称为声明性区域,这是该名称是有效的,即该名称可以用作非限定名称来指 相同实体的 程序的大部分。一般而言,每个特定名称仅在程序文本 的一些可能不连续的部分内有效,称为其范围。为了确定声明的范围,有时可以方便地参考声明的潜在范围 。声明的范围是相同,作为其潜在范围,除非潜在范围包含另一个 声明具有相同名称。在这种情况下,内部(含有)声明性区域 区域中的声明的潜在范围从外部(包含)声明区域中的声明范围中排除。

这意味着潜在范围与声明的范围相同,除非发生另一个(内部)声明。如果发生,外部声明的潜在范围是删除只是内部声明的成立,所以你的全局变量是隐藏的。