为什么你可以在作用域外访问枚举类型,而不能直接访问结构体的成员?这里的作用域是指声明作用域 - 如果我说错了,请纠正。
举个例子:
你可以这样做:
enum colors {red, blue, white};
int color = red;
但您不能这样做:
struct colors {red, blue, white};
int color = red;
谢谢!
为什么你可以在作用域外访问枚举类型,而不能直接访问结构体的成员?这里的作用域是指声明作用域 - 如果我说错了,请纠正。
举个例子:
你可以这样做:
enum colors {red, blue, white};
int color = red;
struct colors {red, blue, white};
int color = red;
谢谢!
class Colors {
public:
static int RED = 0;
static int GREEN = 1;
static int YELLOW = 2;
}
后来添加了枚举,所以你不需要再写Colors.RED
了。这本质上是一种语法糖。
更新
作用域就是程序中可见名称的部分。规则可以简单、复杂或奇怪:C++选择了复杂,JavaScript选择了奇怪。你可以在这里和这里看到详细的说明,但这里有一个基本概念。
在C++中,名称在声明它的块中定义。一种块是文件。如果一个名称在文件顶部被声明,那么在声明之后的整个文件中都可以使用。
另一种块由一对大括号{}
定义。在大括号内声明的任何东西都会从声明开始一直到封闭的右括号为止被定义。
#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
确实可以这样工作;这个特性被恰当地称为“作用域枚举”。
enum class colors { red, blue, white };
,然后标识符将被限定在枚举名称中。 - M.M