1. 程式人生 > >C++學習筆記之七 複合型別---列舉

C++學習筆記之七 複合型別---列舉

C++的enum工具提供了另一種建立符號常量的方式,這種方式可以代替const。使用enum的句法與使用結構相似,例如:enum spectrum { red,  orange , yellow,  green, blue,  violet,  indigo  ,ultraviolet};

這條語句有兩個含義:

(1)、讓spectrum成為新型別的名稱:spectrum被稱為列舉,就像struct變數被稱為結構一樣

(2)、將red 、orange、yellow等作為符號常量,它們對應的整數值0~7.這些常量叫做列舉量。

這個地方需要做一下說明:spectrum是型別名稱,就像int、long一樣,是型別的名稱,以後可以用這個型別名稱宣告變數。另外,用這個型別宣告的變數取值必須是大括號裡的值,其他值無效。而且預設的情況下,第一個列舉量的值為0,第二個為1,以此類推。也可以顯示的指定整數值來覆蓋預設值。

可以用列舉名來宣告這種型別的變數:spectrum  band;

下面介紹一下列舉變數的特殊屬性:

1、在不進行強制型別轉換的情況下,只能將定義列舉時使用的列舉量賦給這種列舉的變數。

band = blue;       //有效,因為blue是列舉量中的一個

band =2000;     //無效,2000不是列舉量

因此,spectrum變數受到限制,只有8個可能的值,試圖將非enum值賦給enum變量出現編譯器錯誤。

2、對於列舉,只定義了賦值運算子。具體來說,沒有為列舉定義算數運算子

band = orange;      //有效

++band;       //無效

band = orange +red;           //無效

3、列舉量是整型,可被提升為int型別,但是int型別不能自動轉換為列舉型別。

int color = blue;        //有效

band = 3;      //無效,雖然3對應的green,但是不能這麼賦值。除非經過強制型別轉換band = spectrum(3);

color = 3+ red;         //有效

4、當然,如果打算只使用常量,而不建立列舉型別的變數,則可以省略列舉型別的名稱。如下:

enum { red,  orange , yellow,  green, blue,  violet,  indigo  ,ultraviolet};

5、設定列舉量的值

可以使用賦值運算子來顯式的設定列舉量的值:

enum bits{ one  = 1,  two  =2,  four  =4, eight  =8};

指定的值必須是整數。也可以只顯式的定義其中一些列舉量的值:

enum  bigstep{ first,  second =100, third};

這裡first預設情況下是0,後面沒有被初始化的列舉量的值將比其前面的列舉量大1.因此,third的值為101。

另外,可以建立多個值相同的列舉量:

enum {zero, null = 0, one, numero_uno  =1};

其中,zero和null都為0,one和umero_uno都為1。

說明:其實列舉量可以作為一種建立整數與代表字元的對應關係。比如用在switch語句中,先用enum{one,two,three,...},在switch語句中就可以用case  one:  case  two:   ....了。

6、列舉的取值範圍

每個列舉值都有取值範圍,通過強制型別轉換,可以將取值範圍中的任何整數值賦給列舉變數,即使這個值不是列舉值。例如:

enum  bits{ one =1,  two = 2, four = 4,  eight = 8};

bits  myflag;

則下面的程式碼將是合法的:

myflag = bits(6);            //因為6在bits的範圍之內

取值範圍是這麼定義的:

(1)上限值:找到大於這個最大值的、最小的2的冪,將它減去1,得到的便是取值範圍的上限。例如,bitstep的最大值列舉值為101.在2的冪中,比這個數大的最小值為128,因此取值範圍的上限為127.

(2)下限值:需要知道列舉值的最小值,如果它不小於0,則取值範圍的下限為0;否則採用與尋找上限方式相同的方式,但加上負號。例如,如果最小列舉值是-6,而比它小的、最大的2的冪是-8(加上負號),因此下限是-7.

相關推薦

C++學習筆記 複合型別---列舉

C++的enum工具提供了另一種建立符號常量的方式,這種方式可以代替const。使用enum的句法與使用結構相似,例如:enum spectrum { red,  orange , yellow,  green, blue,  violet,  indigo  ,ultra

C++學習筆記複合型別結構體(struct)

結構宣告的位置很重要。可以有兩種宣告位置:一種是可以將宣告放在main()函式中,緊跟在開始括號的後面。另一種是將宣告放在main()函式的前面,這裡採用的就是這種方式,位於函式外面的宣告稱為外部宣告。對於只有一個主函式的程式來說放在外面和裡面沒有區別,但是如果有多個函式,外部宣告可以被其後面的任何函式使用,

c#學習筆記Application.DoEvents應用

box nbsp net replace 運算 技術 oop blank 假死 Visual Studio裏的摘要:處理當前在消息隊列中的所有 Windows 消息。 交出CPU控制權,讓系統可以處理隊列中的所有Windows消息 比如在大運算量循環內,加Applicati

[C#學習筆記異步編程模式2]BeginInvoke和EndInvoke方法 (轉載)

cti otf 函數返回 編程模式 catch 數值 gin 單線程 blog 為什麽要進行異步回調?眾所周知,普通方法運行,是單線程的,如果中途有大型操作(如:讀取大文件,大批量操作數據庫,網絡傳輸等),都會導致方法阻塞,表現在界面上就是,程序卡或者死掉,界面元素不動了,

C++學習筆記泛型算法

vector ace sort clu 算法 clas uniq bits 有時 先貼個代碼 有時間的再補筆記 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 //模板類在接收

ceph學習筆記 數據平衡

ceph sds 恢復 數據平衡 當在集群中新增一個OSD設備時,整個集群將會發生數據遷移使數據重新分布達到均衡。在Ceph集群中數據遷移的的基本單位是PG。其實在遷移過程中是將PG中的所有對象作為一個整體來進行遷移。數據遷移觸發流程: 1、當新加入一個OSD時,會改變系統的CRUSH Map

設計模式C++學習筆記十三(Decorator裝飾模式)

com img c++ 進行 done 設計 out set 筆記 裝飾模式,動態地給一個對象添加一些額外的職責。就增加功能來說,Decorator模式相比生成子類更為靈活。 13.1.解釋 main(),老爸 ISchoolReport,成績單接口 CFourthGrad

c++學習筆記)- lambda表達式 叠代器 算法

tex 參數 p s 刷題 algo 叠代器 裏的 blog 而且 關於lambda表達式: 刷題的時候遇到一句代碼不懂: char ch = *it;auto it2 = find_if(it, b.end(), [ch](char x){ return x != ch

R語言學習筆記

head ace row any type 分析 min 記錄 ted 摘要: 僅用於記錄R語言學習過程: 內容提要: 缺失值的識別與處理; 異常值與重復值的處理 正文: 缺失值的識別與處理 導讀: > x <- c(1,2,3,NA,NA,4)

Effective C++學習筆記explicit

rom const ack 聲明 col 這樣的 隱式轉換 轉換 類型 關鍵字:   explicit意思為“明確的”和“清楚的”,是C++的關鍵詞,意在阻止隱式類型的轉換; 使用原因:   有時候不合法的隱式轉換,會讓乖巧聽話的程序變得不可控。所以適當地使用expli

C++學習筆記

() 利用 在一起 忘記 構造函數 end 會同 筆記 允許 9.3.3為何所有的析構函數都應該聲明為 virtual 的?如果使用delete刪去一個實際指向派生類的基類指針,析構函數調用鏈就被破壞。這導致後面使用parent 的指針訪問child 對象並刪去對象時,就

C++ 學習筆記——輸入和輸出

根據 也會 指向 http 對象 是否 取消 成員函數 輸入輸出 在 C++ 中,我們通過調用輸入輸出流庫中的流對象 cin 和 cout 來實現輸入和輸出。 #include <iostream> using namespace std; int ma

Memcached學習筆記:memcached+magent+keepalived高可用叢集

上一篇我們說過memcached實現高可用以及防止單點故障可以通過magent來實現,接下來我們來配置一個高可用群集 magent代理伺服器:192.168.200.101 memcached節點:(可以在同一個伺服器上開啟三個memcached節點看前面介紹,也可以一臺伺服器一個) m

c++學習筆記多檔案操作

每天進步一點點,努力奮鬥的小菜鳥。 曾經搞了好多次的C語言多檔案操作,都沒搞成功,昨天晚上終於搞成功了,雖然是簡單到爆的操作,但我還是挺高興的,哈哈哈。貼出來一方面怕自己忘,一方面若有初學者看到希望能對他們有點小小的幫助。現代數字訊號處理快要考試了,現在慌得一批,估計兩週以內會減少程式設計的時間

c++學習筆記成員函式

學了c++才知道什麼是面向物件什麼是面向過程。幼稚的我曾經還覺得c++和C語言差不多,接觸之後才知道c++是多麼的難,光類和物件這個知識點就看了一天。什麼建構函式解構函式,物件陣列物件成員弄得我頭大,現在才知道為什麼老師說c++是最難的語言,學c++就是在地獄裡磨鍊,從地獄出來就是天堂,會有會當凌絕

C++ 學習筆記——檔案操作和檔案流

1. 檔案的概念 對於使用者來說,常用到的檔案有兩大類:程式檔案和資料檔案。而根據檔案中資料的組織方式,則可以將檔案分為 ASCII 檔案和二進位制檔案。 ASCII 檔案,又稱字元檔案或者文字檔案,它的每一個位元組放一個 ASCII 程式碼,代表一個字元。 二進位制檔案,又稱內部格式檔案或位元

Nordic nRF5 SDK 學習筆記, 功耗評估及電源優化

NORDIC 官方評估功耗線上測試 NORDIC Online Power Profiler,https://devzone.nordicsemi.com/power/ NORDIC 關於低功耗的官方部落格 https://devzone.nordicsemi.com

Object C學習筆記1-基本資料型別說明

Objective-C資料型別可以分為:基本資料型別、物件型別和id型別。基本資料型別有:int、float、double和char型別。物件型別就是類或協議所宣告的指標型別,例如:NSAutoreleasePool * pool,其中NSAutoreleasePool是一個類,NSAutoreleasePo

C# 學習筆記 實參與形參

學習筆記 ole ews 返回 它的 參數 參與 line 方法 一,形參   聲明是在方法的參數列表中,它的功能是:     ①可以返回一個或多個值給調用代碼;     ②在方法執行的時候就把數據傳入方法; 二,實參   實參位於方法調用的參數列表中,實參的值用來

C#學習筆記整理1--資料型別

什麼是資料型別(Data Type) A data type is a homogeneous collection of values, effectively presented, equiipped with a set of operations wh