C ++枚举数据结构

时间:2010-10-24 06:56:06

标签: c++ enums

有人可以实时了解枚举数据结构。如在一些可以使用它的真实系统中的示例?这种数据结构的原因是什么?给出的例子是

enum colors_t {black, blue, green, cyan, red, purple, yellow, white}; 

但我觉得,这类似于字符串数组。我试图理解这个功能被添加到C ++的概念。谢谢!

  • 此致 Sethu

5 个答案:

答案 0 :(得分:3)

例如,请考虑以下枚举:

enum ip_packet_type {
    ip = 0,
    icmp = 1,
    igmp = 2,
    tcp = 6,
    udp = 17,
    // many others
};

这表示IP数据包中的IP协议号。在数据包内部,协议编号由编号而不是名称(字节偏移9处的8位)标识。此枚举允许程序源引用icmptcp之类的名称而不是数字。该号码必须在IP数据包本身内使用。

答案 1 :(得分:2)

当您使用enum时,值(例如blackgreen等)是内部表示为整数的符号名称。

如果您使用了字符串数组,那么每次您想要使用其中一个值时,您需要复制字符串,进行字符串比较等。

此外,enum只能 包含预定义的值,这在大多数情况下都是可取的。如果你表示与字符串相同的东西,则没有这样的保证。

答案 2 :(得分:2)

枚举器(在您的示例中类似black)由整数表示;比较整数。比较字符串并不快。

此外,您还可以获得类型安全性。如果您使用"black""blue"这样的字符串,则无法保证在您期望颜色时有人不会通过您"hot dog"。如果你选择color_t,你可以保证获得有效的颜色(除非有人走了,做错了什么)。

答案 3 :(得分:1)

1)Enum vs Integers:枚举更容易阅读,因此代码更易于维护。

2)Enum vs Strings:Enums效率更高(alsmo和整数一样有效)。

增加了优势:枚举会自动限制为您预定义的值范围。这也意味着它们仅在值的范围很小时才有用。

答案 4 :(得分:1)

为了记录,Bjarne Stroustrup谈到了在 C ++的设计和解决方案一书中将enum带入C ++,声明“C枚举构成了一个奇怪的半生不熟的概念。枚举不是C的原始概念的一部分,并且显然不情愿地引入语言,作为对那些坚持获得比Cpp无参数宏更具实质性的象征常数的人的让步。 (第11.7节,“Cpp”指的是C预处理器,本节的其余部分记录了使每个enum成为C ++中的单独类型的决定,而不是所有这些类型都是int s,因为它们最初是在C和早期版本的C ++中。

enum主要是在早期版本的C中替换#define的方法。

// based on UNIX file permissions
#define EXECUTE 1
#define WRITE 2
#define READ 4

VS

const int EXECUTE = 1;
const int WRITE = 2;
const int READ = 4;

VS

enum File_perms {
    EXECUTE = 1;
    WRITE = 2;
    READ = 4;
};

Which to use is largely a matter of personal tasteenum确实提供了一种关于变量应该包含哪种值的文档形式:

int permissions = 4; // Was that file permissions, database permissions, or something else?
File_perms perms = 4;

这在功能签名中特别有用:

int fiddle_bits(int, int); // I can never remember if I pass the file permissions as the first or second parameter ...
File_perms fiddle_bits2(File_perms, int);
enum声明switch标签(case#define s)允许

const int

switch (perm) {
    case READ:
        ...
    break;
    ...
}

但是,请注意, 可以为没有标记值的enum分配数字(C ++ 0x添加enum class但不会允许这个):

File_perms perm = 7; // a.k.a., File_perms perm = EXECUTE | READ | WRITE;

如果您看到enum的显式值为2的幂,则几乎可以保证以这种方式使用它。