为什么可以访问范围之外的枚举器?

时间:2017-05-06 23:06:17

标签: c++

为什么你可以访问范围之外的枚举数,而你不能直接访问结构的成员?在范围上,我指的是声明范围 - 如果我错了,请纠正我。

举个例子: 你可以这样做:

enum colors {red, blue, white};
int color = red;

但你不能这样做:

struct colors {red, blue, white};
int color = red;

谢谢!

2 个答案:

答案 0 :(得分:1)

好吧,正如另一条评论所说,这是因为这就是C ++的工作方式。

回到过去,我们用

之类的东西模拟了这样的东西
class Colors {
  public:
    static int RED = 0;
    static int GREEN = 1;
    static int YELLOW = 2;
}

然后添加了枚举,因此您无需编写Colors.RED。它基本上是语法糖。

<强>更新

范围只是名称可见的程序的一部分。规则可能很简单,复杂或怪异:C ++很复杂,JavaSccript很奇怪。您可以看到冗长的解释herehere,但这是一个基本概念。

在C ++中,这是一种来自Algol 60的块结构语言,在声明它的块中定义了一个名称。一种块是文件。如果在文件顶部声明了一个名称,那么它将在声明后的文件中的任何位置定义。

另一种块由一对大括号{}定义。在括号内声明的任何内容都是从声明到封闭的末端括号中定义的。所以

#include <stdlib>  // copies a bunch of code into the file
int foo = 0;       // declared here, visible to end.

int fn(){
  int bar = 2 ;
  if(bar == 2){
    foo = bar;
    cout << bar << nl;  // gives '2'
    cout << foo << nl;  // still gives '2'
  }
  cout << foo << nl ;  // gives '0'
  cout << bar << nl ;  // compile time error 'bar' not defined
}

为什么呢?内部foo隐藏了外部foo,因此这是在if块内打印的那个。 bar定义在if块的顶部,因此在大括号结束if块之后它不再可见(“不再在范围内”)

有更多规则,但我建议在其中一个链接或一本好的C ++书中阅读。

答案 1 :(得分:0)

没有范围在外面。 enum并未以struct的方式引入新范围。为什么?好吧,为什么不呢。它们是两个完全不同的东西,所以期望一个像另一个一样工作是空的。

enum class然而, 以这种方式工作;该功能被恰当地称为&#34;范围的枚举&#34;。