为什么C ++允许通过指针访问枚举?

时间:2013-11-05 17:49:35

标签: c++

我正在研究一些类中有简单枚举的代码。另一段代码有一个指向该类的指针,并通过箭头指针访问枚举值。

该类如何以这种方式访问​​MY_VALUE1? 我虽然它只允许通过MyClass :: MY_VALUE1或MyClass :: MyEnum :: MY_VALUE1进行访问。

class MyClass {
public:
enum MyEnum{
    MY_VALUE0 = 0,
    MY_VALUE1 = 1
};
//getters, setters as appropriate
};

//Other class
MyClass* myClass = new MyClass();

//Compiles without C++11
if(getRandomEnum() == myClass->MY_VALUE1)
{
    //Do Stuff
}

3 个答案:

答案 0 :(得分:5)

->运算符(大部分)是dereference * )和selection)的缩写。换句话说,a->b(*(a)).b相同。 (§5.2.5/ 2;见下面的注释)。

语法是类成员访问,由§5.2.5[expr.ref]定义; 右侧的标识符可以是静态或非静态数据成员,函数或成员枚举器(引用部分的第4段)。它不能是嵌套类型。从这个意义上讲,成员枚举数在语法上与static const数据成员相似。

注意:

  1. 正如§13.5.6所阐明的那样,a->b受运营商超载的影响。如果a不是指针类型,则->可能会重载,在这种情况下,表达式将被解释为(a.operator->())->b。最终,重载->调用的序列必须产生指针类型,此时应用§5.2.5/ 2的解释。

  2. Class::membervalue.member之间的一个重要区别是,在第二种情况下,value将被评估,即使这不需要解析{的值{1}}

答案 1 :(得分:3)

来自C ++ ISO / IEC 2011

  

在类范围中声明的枚举器可以使用   类成员访问运算符(::,。(点)和 - >(箭头)),

答案 2 :(得分:2)

枚举值被视为静态成员 该类,可以通过两种方式访问​​:通过类 名称后跟范围解析运算符 (MyClass::MY_VALUE0),或任何其他成员 (instance.MY_VALUE0pointer->MY_VALUE0)。

请注意,在后一种情况下,左侧的操作数仍然是 评估,即使评估结果不是 用过的。换句话说,如果我写f()->MY_VALUE0(其中f() 返回MyClass*),函数将被调用,尽管如此 事实是它的返回值没有使用。