- Visual C++.NET 2010開發(fā)實踐:基于C++/CLI
- 鄭阿奇主編
- 1438字
- 2018-12-27 13:41:29
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;
- Oracle數(shù)據(jù)庫從入門到運維實戰(zhàn)
- Python應(yīng)用輕松入門
- JAVA程序設(shè)計實驗教程
- PHP編程基礎(chǔ)與實例教程
- Webpack實戰(zhàn):入門、進階與調(diào)優(yōu)
- Create React App 2 Quick Start Guide
- Visual Basic程序設(shè)計上機實驗教程
- Visual Basic程序設(shè)計習題與上機實踐
- OpenCV with Python By Example
- 區(qū)塊鏈項目開發(fā)指南
- Struts 2.x權(quán)威指南
- C語言程序設(shè)計
- Scrapy網(wǎng)絡(luò)爬蟲實戰(zhàn)
- PHP Microservices
- 3ds Max 2018從入門到精通