sha*_*oth 14 c++ enums constants
定义在函数内使用的整数常量的典型方法是:
const int NumbeOfElements = 10;
Run Code Online (Sandbox Code Playgroud)
在课堂上使用相同:
class Class {
...
static const int NumberOfElements = 10;
};
Run Code Online (Sandbox Code Playgroud)
然后它可以用作固定大小的数组绑定,这意味着它在编译时是已知的.
很久以前编译器不支持后一种语法,这就是使用枚举的原因:
enum NumberOfElementsEnum { NumberOfElements = 10; }
Run Code Online (Sandbox Code Playgroud)
现在几乎所有广泛使用的编译器都支持函数内const int
和类内static const int
语法,有没有理由为此目的使用枚举?
Pav*_*aev 26
原因主要是简洁.首先,一个enum
可以是匿名的:
class foo {
enum { bar = 1 };
};
Run Code Online (Sandbox Code Playgroud)
这有效地引入bar
了一个整数常数.请注意,上述内容短于static const int
.
此外,&bar
如果它是enum
会员,没有人可以写.如果你这样做:
class foo {
static const int bar = 1;
}
Run Code Online (Sandbox Code Playgroud)
然后你班级的客户这样做:
printf("%p", &foo::bar);
Run Code Online (Sandbox Code Playgroud)
那么他将得到一个foo::bar
未定义的编译时链接器错误(因为,作为一个左值,它不是).在实践中,根据标准,因为它目前为,在任何地方bar
使用其中不整数表达式中需要(即,其中它仅允许),它需要一个外的类定义foo::bar.
在需要这样的表达是该地方:enum
初始值设定项,case
标签,类型中的数组大小(除外new[]
)和整数类型的模板参数.因此,bar
在技术上使用其他任何地方都需要定义.有关详细信息,请参阅C++核心语言活动问题712 - 目前尚无提议的解决方案.
实际上,现在大多数编译器都对此更加宽容,并且可以让您static const int
在不需要定义的情况下使用变量的大多数"常识"使用.然而,角落的情况可能会有所不同,因此很多人认为使用匿名更好enum
,因为一切都很清楚,并且根本没有歧义.
直接在类定义中定义静态常量是C++的后续添加,许多人仍然坚持使用enum
for 的旧解决方法.甚至可能还有一些旧的编译器仍在使用,它们不支持在类定义中直接定义的静态常量.
在你的情况下,我也使用常量.但是,在其他情况下,我可能会添加其他相关常量.像这样:
const int TextFile = 1; // XXX Maybe add other constants for binary files etc.?
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我立即使用一个枚举值,如下所示:
enum FileType {
TextFile = 1
// XXX Maybe add other values for binary files etc.?
}
Run Code Online (Sandbox Code Playgroud)
原因是当我在switch表达式中使用常量值时,编译器可以发出警告,如:
FileType type;
// ...
switch ( type ) {
case TextFile:
// ...
}
Run Code Online (Sandbox Code Playgroud)
如果我决定添加另一个与现有值相关的常量值(在本例中为不同类型的文件),几乎所有编译器都会发出警告,因为在switch语句中没有处理新值.
如果我使用'int'和常量,编译器将没有机会发出警告.
使用"枚举黑客"的唯一原因是旧编译器不支持类内const定义,正如您在问题中所说的那样.因此,除非您怀疑您的代码将被移植到旧的编译器,否则您应该使用const到期的const.
小智 5
使用枚举有一个优点.枚举类型是一种类型,因此如果您定义,例如:
enum EnumType { EnumValue1 = 10, EnumValue2 = 20 ... };
Run Code Online (Sandbox Code Playgroud)
你有一个像这样的功能:
void Function1(EnumType Value)
Run Code Online (Sandbox Code Playgroud)
编译器检查您是否将枚举EnumType的成员传递给函数,因此只有参数Value的有效值为EnumValue1和EnumValue2.如果使用常量并将函数更改为
void Function1(int Value)
Run Code Online (Sandbox Code Playgroud)
编译器检查您是否正在向函数传递int(任何int,常量,变量或文字).
枚举类型适用于分组相关的const值.对于只有一个const值,我没有看到任何优势.