C C 中列舉型別 enum

2022-02-07 04:38:11 字數 2371 閱讀 2446

如果乙個變數你需要幾種可能存在的值,那麼就可以被定義成為列舉型別。之所以叫列舉就是說將變數或者叫物件可能存在的情況也可以說是可能的值一一例舉出來。

舉個例子來說明一吧,為了讓大家更明白一點,比如乙個鉛筆合中有一支筆,但在沒有開啟之前你並不知道它是什麼筆,可能是鉛筆也可能是鋼筆,這裡有兩種可能,那麼你就可以定義乙個列舉型別來表示它!

enum box;//這裡你就定義了乙個列舉型別的變數叫box,這個列舉變數內含有兩個元素也稱列舉元素在這裡是pencil和pen,分別表示鉛筆和鋼筆。

在這裡要說一下,如果你想定義兩個具有同樣特性列舉型別的變數那麼你可以用如下的兩種方式進行定義!

enum box;

enum box box2;//或者簡寫成box box2;

再有一種就是在宣告的時候同時定義。

enum box,box2; //在宣告的同時進行定義!

列舉變數中的列舉元素系統是按照常量來處理的,故叫列舉常量,他們是不能進行普通的算術賦值的,(pencil=1;)這樣的寫發是錯誤的,但是你可以在宣告的時候進行賦值操作!

enum box;

但是這裡要特別注意的一點是,如果你不進行元素賦值操作那麼元素將會被系統自動從0開始自動遞增的進行賦值操作,說到自動賦值,如果你只定義了第乙個那麼系統將對下乙個元素進行前乙個元素的值加1操作,例如

enum box;//這裡pen就是4系統將自動進行pen=4的定義賦值操作!

c++ 中的列舉型別繼承於 c 語言。就像其他從 c 語言繼承過來的很多特性一樣,c++ 列舉也有缺點,這其中最顯著的莫過於作用域問題——在列舉型別中定義的常量,屬於定義列舉的作用域,而不屬於這個列舉型別。例如下面的示例:

enum fileaccess ;

fileaccess access = ::read; // 正確

fileaccess access = fileaccess::read; // 錯誤

c++列舉的這個特點對於習慣物件導向和作用域概念的人來說是不可接受的。首先,fileaccess::read 顯然更加符合程式設計師的直覺,因為上面的列舉定義理應等價於如下的定義(實際上,.net 中的列舉型別便是如此實現的):

class fileaccess ;

其次,這導致我們無法在同乙個作用域中定義兩個同樣名稱的列舉值。也就是說,以下的**是編譯錯誤:

enum fileaccess ;

enum fileshare ;

如果這一點沒有讓你惱怒過的話,你可能還沒寫過多少 c++ ** :-)。實際上,在最新的 c++0x 標準草案中有關於列舉作用域問題的提案,但最終的解決方案會是怎樣的就無法未卜先知了,畢竟對於象 c++ 這樣使用廣泛的語言來說,任何特性的增刪和修改都必須十分小心謹慎。

當然,我們可以使用一些迂迴的方法來解決這個問題(c++ 總是能給我們很多驚喜和意外)。例如,我們可以把列舉值放在乙個結構裡,並使用運算子過載來逼近列舉的特性:

struct fileaccess ;

__enum _value; // 列舉值

fileaccess(int value = 0) : _value((__enum)value) {}

fileaccess& operator=(int value)

operator int() const

};

我們現在可以按照希望的方式使用這個列舉型別:

fileaccess access = fileaccess::read;

並且,因為我們提供了到 int 型別的轉換運算子,因此在需要 int 的地方都可以使用它,例如 switch 語句:

switch (access)

當然我們不願意每次都手工編寫這樣的結構。通過使用巨集,我們可以很容易做到這一點:

#define declare_enum(e) 

struct e

e& operator=(int value)

operator int() const

enum __enum ;

private:

__enum _value;

};

我們現在可以按如下的方式定義前面的列舉,並且不比直接寫 enum 複雜多少。

declare_enum(fileaccess)

read = 0x1,

write = 0x2,

end_enum()

declare_enum(fileshare)

read = 0x1,

write = 0x2,

end_enum()

C C 中列舉型別 enum

新手入門 c c 中列舉型別 enum 出處 pconline 2005 02 26 15 47 04 如果乙個變數你需要幾種可能存在的值,那麼就可以被定義成為列舉型別。之所以叫列舉就是說將變數或者叫物件可能存在的情況也可以說是可能的值一一例舉出來。舉個例子來說明一吧,為了讓大家更明白一點,比如乙個...

C C 中列舉型別 enum

如果乙個變數你需要幾種可能存在的值,那麼就可以被定義成為列舉型別。之所以叫列舉就是說將變數或者叫物件可能存在的情況也可以說是可能的值一一例舉出來。舉個例子來說明一吧,為了讓大家更明白一點,比如乙個鉛筆盒中有一支筆,但在沒有開啟之前你並不知道它是什麼筆,可能是鉛筆也可能是鋼筆,這裡有兩種可能,那麼你就...

C C 中列舉型別 enum 的使用解惑

列舉型別,顧名思義,枚 作為量詞,作 個 講,那麼列舉,就是乙個乙個的列舉,如果一件事情能夠被乙個乙個的列舉,那麼它的數量肯定就是有限的,否則是不能被一一枚舉出來的。所以列舉型別即為能被列舉的常量的乙個集合。在 生活中,列舉的例子隨處可見,比如禮拜幾,那麼就可以作為乙個列舉變數。這個變數所儲存的值,...