官术网_书友最值得收藏!

1.4 C++/CLI枚舉

1.4.1 枚舉的定義

與標準C++中定義枚舉的方式不同,C++/CLI通過enum class組合關(guān)鍵字定義枚舉類型。例如:

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

C++/CLI枚舉類型的變量只能夠被賦值為該枚舉定義中的值。并且在訪問該變量時,必須通過枚舉類型名稱限定當前使用的枚舉值。例如:

        Suit suit = Suit::Diamonds;

然而需要注意的是,在C++/CLI枚舉中定義的所有常量都是對象,而標準C++枚舉中枚舉值為基本數(shù)據(jù)類型的值。實際上,C++/CLI枚舉中的值都默認是System::Int32類型的對象,其中封裝了int類型的值。

另外,可以在C++/CLI程序中使用與標準C++枚舉相同的語法,它們的行為將與在本地C++程序中的行為相同。本地C++枚舉的語法在C++/CLI程序中得到了擴充,并允許顯式地指定枚舉常量的類型。但是,在C++/CLI程序中最好還是使用C++/CLI枚舉。

【例1.7】 C++/CLI枚舉的使用示例。定義一個枚舉值,并將這些枚舉值強制轉(zhuǎn)換為與其對應(yīng)的整型值并輸出。代碼如下:

        // Ex1_7.cpp : 主項目文件
        #include "stdafx.h"
        using namespace System;
        enum class Suit {Clubs, Diamonds, Hearts, Spades};
        int main(array<System::String ^> ^args)
        {
            Suit suit = Suit::Clubs;
            int value = safe_cast<int>(suit);
            Console::WriteLine(L"Suit為: {0},且值為: {1}", suit, value);
            suit = Suit::Diamonds;
            value = safe_cast<int>(suit);
            Console::WriteLine(L"Suit為: {0},且值為: {1}", suit, value);
            suit = Suit::Hearts;
            value = safe_cast<int>(suit);
            Console::WriteLine(L"Suit為: {0},且值為: {1}", suit, value);
            suit = Suit::Spades;
            value = safe_cast<int>(suit);
            Console::WriteLine(L"Suit為: {0},且值為: {1}", suit, value);
            return 0;
        }

當Ex1_7程序運行后,枚舉中的每個常量都對應(yīng)了一個常量值,其中第一個枚舉常量默認值為0,而其他枚舉常量的值依次遞增。Ex1_7項目的運行結(jié)果如圖1.11所示。

圖1.11 Ex1_7項目的運行結(jié)果

1.4.2 枚舉的常量

雖然C++/CLI枚舉中的值都默認是System::Int32類型的對象,但是還可以將其指定為如表1.5所示的任意一種基本類型。

表1.5 C++/CLI枚舉常量可用的數(shù)據(jù)類型

在指定枚舉常量的類型時,可以在定義枚舉的類型名稱之后通過冒號(“:”)來說明常量的類型。例如,下面的代碼將枚舉中的常量指定為System::Char類型,那么其對應(yīng)的基本類型為char類型。

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

一般情況下,在指定枚舉常量的類型后,枚舉中第一個枚舉常量的默認值為0,而后面的枚舉常量依次遞增。當然,也可以為枚舉類型中的一個或全部枚舉常量都指定對應(yīng)的值。例如,如果將Face枚舉中Acer常量指定為1,那么后面枚舉常量的值將都依次加1。

        enum class Face1 : char { Ace=1, Two, Three, Four, Five, Six,
                                  Seven, Eight, Nine, Ten, Jack, Queen, King };
        enum class Face2 : char { Ace=14, Two=2, Three, Four, Five, Six,
                                  Seven, Eight, Nine, Ten, Jack,Queen,King};

1.4.3 枚舉常量的運算

由于在定義C++/CLI枚舉時為枚舉常量指定了對應(yīng)的值,所以可以對枚舉常量進行各種運算(枚舉常量類型為bool類型時除外)。

例如,可以通過“++”或“--”運算符對枚舉常量進行遞增或遞減運算,從而改變枚舉常量的值。但是,通過遞增或遞減后的枚舉變量完全不會對運算結(jié)果進行有效性驗證,因此需要在程序中確保其對應(yīng)的枚舉值。

        Face card = Face::Ten;         // card的值為Face::Ten
        card++;                         // card的值為Face::Jack

同時,還可以對枚舉常量進行算術(shù)運算,如加、減、乘和除等。但是,不能直接將枚舉常量與其他非枚舉類型的常量進行運算,這是因為算術(shù)運算兩端的操作數(shù)的類型不同,并且它們也不能自動轉(zhuǎn)換成相同的類型,所以需要通過類型強制轉(zhuǎn)換來進行算術(shù)運算。例如:

        card = card – Face::Two;           // card的值為Face::Eight
        card = card – safe_cast<Face>(2);  // card的值為Face::Six

同樣,還可以通過關(guān)系運算符比較兩個枚舉常量的值,其比較結(jié)果將產(chǎn)生一個bool類型的值。例如:

        if (card < Face::Eight) Console::WriteLine(L"Card的值小于8點");
        if (card > Face::Eight) Console::WriteLine(L"Card的值大于8點");
        if (card != Face::Eight) Console::WriteLine(L"Card的值不等8點");
        if (card == Face::Eight) Console::WriteLine(L"Card的值等于8點");

另外,還可以將枚舉定義成為標識位,這種標識位可用其中的某些位記錄一種或多種事件。在將枚舉定義成為表示標識位時,需要通過[Flags]屬性修飾。其中,屬性是添加到程序語句中的附加信息,用于指示編譯器以何種方式修改代碼或插入代碼。例如,定一個枚舉標識位的方式如下:

        [Flags]enum class FlagBits{Ready=1,ReadMode=2,WriteMode=4,EOF=8,Disable=16};

對于表示標識位的枚舉常量,可以通過位運算符對這些常量進行運算。例如,可以使用或運算符(“|”)組合標識位,或者通過取反運算符(“~”)獲得某個標識位取反的值。

        FlagBits status = FlagBits::Ready | FlagBits::ReadMode | FlagBits::EOF;
        status = status &~FlagBits::Ready;
主站蜘蛛池模板: 固阳县| 定远县| 崇文区| 荃湾区| 五大连池市| 奉贤区| 福海县| 公主岭市| 镇安县| 德安县| 策勒县| 海门市| 博白县| 温宿县| 武乡县| 阿荣旗| 铜鼓县| 潜江市| 内黄县| 兴文县| 古蔺县| 盐津县| 山东| 临西县| 镶黄旗| 商河县| 朝阳市| 绥化市| 肥西县| 彭泽县| 江源县| 舟曲县| 南充市| 五台县| 龙胜| 秦安县| 西林县| 克东县| 外汇| 安义县| 永城市|