为什么可以访问范围之外的枚举器?
Why can you access enumerators outside the scope?
为什么可以访问范围之外的枚举器,而不能直接访问结构的成员?通过范围,我的意思是声明范围 - 如果我错了,请纠正我。
举个例子: 您可以这样做:
enum colors {red, blue, white};
int color = red;
但你不能这样做:
struct colors {red, blue, white};
int color = red;
谢谢!
好吧,好吧,正如另一条评论所说,这是因为这就是C++的工作方式。
回到过去,我们用类似的东西模拟了这样的东西
class Colors {
public:
static int RED = 0;
static int GREEN = 1;
static int YELLOW = 2;
}
然后添加了枚举,因此您无需编写Colors.RED
。它本质上是句法糖。
更新
作用域只是程序中名称可见的部分。规则可以是简单的,复杂的或奇怪的:C++复杂,JavaSccript则奇怪。你可以在这里和这里看到冗长的解释,但这里有一个基本的概念。
在 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++书中阅读它。
没有范围可以超出。enum
不会像struct
那样引入新的范围。为什么?好吧,为什么不呢。它们是两个完全不同的东西,所以期望一个与另一个相同是空洞的。
然而,enum class
确实以这种方式工作;该功能恰如其分地称为"作用域枚举"。
相关文章:
- 如何正确实现和访问运算符的各种自定义枚举器
- 访问在 C++ 结构中声明的枚举变量
- 如何确保 Visual C++ 不允许作用域枚举访问?
- 通过包装器从 C 访问C++ API 时,如何访问枚举类型
- 从类访问枚举成员
- 如何通过索引访问枚举类
- 在类访问混淆中声明的枚举类型
- 如何访问 VTK 的类枚举字段
- C++ 如何访问内部枚举类?
- 如何将枚举类写入文件并在C++中访问它?
- 访问向量字段的键 - 枚举类还是命名空间中的枚举?
- 枚举范围无法通过 C++ 中的类中的结构访问
- 为什么 clang 不允许通过实例访问嵌套枚举类?
- 通过进程模块C 枚举时,访问被拒绝
- 访问在C++类中声明的枚举
- 我的私有方法如何在C++中访问公共枚举
- C++中枚举访问语义背后的基本原理
- 不同类中的枚举访问
- 通过作用域和类型化枚举访问元组值失败
- 是否可以使用枚举访问数组