曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 4774|回复: 0
打印 上一主题 下一主题

[CLI] 枚举

[复制链接]

716

主题

734

帖子

2946

积分

超级版主

Rank: 9Rank: 9Rank: 9

积分
2946
跳转到指定楼层
楼主
发表于 2013-7-3 22:44:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
CLI 中的枚举和标准 C++ 中有很大不同。在 CLI 中的枚举定义如:
enum class Pork { Ace, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King};
注意,在 CLI 中的声明枚举类型的关键字是 enum class ,它并不是 enum 和 class 这两个关键字的组合,而是一个整体。使用 enum class 关键字还说明了像枚举中定义的常量 Jack,King 等是对象,而不是标准 C++ 枚举中那样仅仅是基本类型的值。在默认情况下,它们是 Int32 类型的对象,在试图使用这样一个常量之前,必须先把它强制转换成基本的 int 类型。

将枚举值赋值给变量:
Poker pork = Pork::Jack
该语句将 Porker 枚举的值 Jack 赋值给 pork 变量。 Pork::Jack 这种形式表示 Jack 存在于枚举 Pork 的作用域内。

测试程序1:
[C++] 纯文本查看 复制代码
#include "stdafx.h"

using namespace System;

enum class Pork { Ace, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King};

int main(array<System::String ^> ^args)
{
    Pork pork = Pork::Jack;
    Console::WriteLine(L"{0}", pork);
    Console::ReadLine();


    return 0;
}

输出是 Jack 。注意,Console::WriteLine(L"{0}", pork); 这种直接的输出方式在 Visual C++ 2012  里是视为错误的,不会输出 Jack 这个字串。如果想要输出相应的枚举常量整数值,就需要进行显示转换,因此可以修改上述的语句为:Console::WriteLine(L"{0}", safe_cast<int>(pork)); 。

也可以用下面的方法指定枚举常量的类型,这些类型包括:short, unsigned, int, long, long long, signed char, char 等:
enum class Pork :  { Ace, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King };

在 Visual Studio 2010 里还支持如下的枚举常量运算,如:
[C++] 纯文本查看 复制代码
#include "stdafx.h"

using namespace System;

enum class Pork { Ace, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King};

int main(array<System::String ^> ^args)
{
    Pork pork = Pork::Jack;
        ++pork;
    Console::WriteLine(L"{0}", pork);
    Console::ReadLine();

    return 0;
}

输出为 Queen 。同样这样的运算方法不兼容 Visual C++ 2012 。

也可以对枚举值应用 + 或 - 运算符:
pork = pork - Pork::Two;
注意不能写成 pork = pork - 2 ,因为减法运算符的操作数属于不同的类型(一个是类,一个是整数)且不能自动转换。为了可以运行,需要进行类型的强制转换:
pork = safe_cast<Pork>(2);
上面将整数型强制转换为 Pork 类型,然后再参与运算是可行的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-4-29 05:18 , Processed in 0.063180 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表