5

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

这个类究竟是如何以这种方式访问​​ 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
}
4

3 回答 3

6

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

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

笔记:

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

  2. Class::member和之间的一个重要区别value.member是,在第二种情况下,即使不需要解析 的值value,也会对 进行评估。member

于 2013-11-05T18:34:00.897 回答
3

来自 C++ ISO/IEC 2011

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

于 2013-11-05T18:02:54.940 回答
2

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

请注意,在后一种情况下,左侧的操作数仍会被评估,即使评估的结果未被使用。换句话说,如果我写f()->MY_VALUE0(where f() returns a MyClass*),该函数将被调用,尽管它的返回值没有被使用。

于 2013-11-05T18:33:16.290 回答