枚举类(Enumerated types)介绍

一、枚举类介绍

枚举类Enumerated types是一种用户自定义的类型,用户自定义标识符identifers)作为类型的名称,然后设置一系列枚举子enumerators作为类型的可赋值。枚举类的对象可以选这些enumerator作为其的值。

语法:

enum type_name {
  value1,
  value2,
  value3,
  .
  .
} object_names;

或者

// unscoped enum:
enum [identifier] [: type] {enum-list}; 

// scoped enum:
enum [class|struct] [identifier] [: type] {enum-list};

举例:

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

colors_t mycolor;
mycolor = blue;
if (mycolor == green) mycolor = red;

二、enum定义方法

用enum定义的类型中的值总是被隐式自动赋予int类型的值,相当于这些enumerator的别名。如果没有特别说明,那么第一个enumerator被赋值0,第二个被赋值1,以此类推。如果给enumerator设值,而其后一个enumerator没有被赋值,那么这一位的值就是前一位的用户赋值+1。


举例A:

enum months_t { january=1, february, march, april,
                may, june, july, august,
                september, october, november, december} y2k;

在这里,january到december的值的区间为1-12。注意,1和january在这个枚举类型中没有差别,作用是一样的。


举例B:

enum Suit { Diamonds = 5, Hearts, Clubs = 4, Spades };

DiamondsHeartsClubs, 和 Spades 的值分别是 5, 6, 4, and 5。


举例C:

int类型不能被转换为enum类型:

int account_num = 135692;
Suit hand;
hand = account_num; // error C2440: '=' : cannot convert from 'int' to 'Suit'

但是enum类型可以被转换为int类型:

int account_num = Hearts; //OK if Hearts is in a unscoped enum

三、enum class定义方法

1.可以创建不被隐式转换为int类型的枚举类,用来保证类型的安全性。创建方法使用的是enum class而不是enum关键字。

举例:

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

使用这种方法定义后,在用到enumerator值时必须标明到该类型空间中(enum定义方法也可如此使用):

Colors mycolor;
 
mycolor = Colors::blue;
if (mycolor == Colors::green) mycolor = Colors::red;


2.用enum class定义的枚举类型对于其隐式类型有更好的可控性。可以设置为int类型,char类型,short类型等,不同类型使得枚举类型占用的空间也不同。

举例:

enum class EyeColor : char {blue, green, brown};

这样定义之后,EyeColor就是一个和char类型有相同大小的独立类型。


3.使用例子:

namespace CardGame_Scoped
{
    enum class Suit { Diamonds, Hearts, Clubs, Spades };

    void PlayCard(Suit suit)
    {
        if (suit == Suit::Clubs) // Enumerator must be qualified by enum type
        { /*...*/}
    }
}

namespace CardGame_NonScoped
{
    enum Suit { Diamonds, Hearts, Clubs, Spades };

    void PlayCard(Suit suit)
    {
        if (suit == Clubs) // Enumerator is visible without qualification
        { /*...*/
        }
    }
}


注:原文转自http://www.cplusplus.com/doc/tutorial/other_data_types/http://msdn.microsoft.com/en-us/library/2dzy4k6e.aspx,翻译的时候有删改,仅供自己参考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值