走進C 11(二)物件導向之enum 強型別列舉

2021-10-10 17:23:45 字數 2673 閱讀 5300

c++11 物件導向系列

總得來說,c++11標準是一群天才們制定的,每乙個標準的制定都有其應用改進的場景。

enum也不例外,這個c++11系列都會有小例子或者分析它解決了什麼痛點。

what is enum in c++98/c++11

我們在程式設計時有時想讓乙個變數的值只在規定範圍裡取值,那麼就會考慮使用enum型別。c++11之前的enum型別是繼承c的:

enum color ;
然後我們再用enum color來定義變數,並賦值,

enum color mycolor = green;
預設情況下,列舉值從0開始,依次加1。其好處就是在不指定專門值的情況下,列舉值基本不存在重複值,便於**的維護。若某些值超過列舉型別所能容納的範圍,編譯會產生warning警告,需注意。

how to use enum

語法:

enum class type4:type;//加class,具名,指定底層型別typeenum class type5;//不指定底層型別
進入c++11後,使用enum有三點要注意。

enum class day     //  限定作用域;
enum month     //  不限定作用域;
進入c++11以後我們可以制定enum的大小,進而優化記憶體。例如可以在enum的名字後面指定我們想該enum使用的型別,

enum class day : uint8_t     //  限定作用域;
why using c++11 enum《effective modern c++》中,scott meyers建議優先使用限定作用域的列舉型別,而非限定作用域的列舉型別。原因主要有以下幾個方面:

a. 限定作用域的列舉型別將名字空間汙染降低,如下:

auto day = sunday;  // sunday被限定在day作用域內auto day = day::sunday;  // okauto month = january;  // ok
非強型別作用域
enum type1;enum type2;
問題來了,兩種列舉型別都有a列舉常量,而且作用域相同,發生了衝突。強型別作用域就不會有這個問題

b. 限定作用域的列舉型別是強型別的,限定作用域的列舉型別無法通過隱式轉換到其他型別,而不限定的列舉型別可以自動轉換為整形。

int num = day::sunday;  //  限定作用域的列舉型別不會進行隱式轉換int num = month::january;  // ok
當然,可以使用強制型別轉換static_cast實現限定作用域的列舉型別轉換。

if(ttype2::b);                   //非同乙個enum型別,不能隱式轉換為int等值,不嗯呢該比較if((int)t > (int)type2::b)        //強制型別轉換,可以通過
c. 可以指定底層型別c語言下面,enum大小是乙個整型大小,但是c下整型有很多種,char、long int和short int等,具體哪一種呢?下面引用《c in a nutshell》裡的一句話來解釋下,

意思就是enum型別的大小是由編譯器根據定義值的大小來選擇合適的整數型別,所以enum型別的大小並不是固定的。

舉個例子:

#includeenum color1;enum color2;int main(void)
輸出如下,

enum color1: 4enum color2: 8
因為enum color2的大小已經超過了4個位元組,這樣編譯器就會把它的大小擴大。

這樣會有乙個潛在的弊端:如果我們定義了乙個結構體,其成員有enum型別,那麼就可能導致結構體大小發生變化,而我們卻沒有察覺,例如隨著**的更迭,我們加入了更多enum規定的範圍值,當超過某個值時,它的大小就產生了變化,這是比較危險的。

而且如果enum規定的範圍值超過了指定大小,編譯會報錯,如這種,

enum color1 : uint8_t;
出錯資訊如下:

走進C 11(十七)

是的你沒看錯,今天的題目就是 這。有啥好講的?其實經常用模板的人可能一不小心都吃過這個虧。對於c 程式設計師來說,是位右移操作符,但在一此應用中會涉及到需要連寫的情景,例如 模板和表示式轉換。在例項化模板時會出現連續兩個右尖括號,同樣static cast dynamic cast reinterp...

C 11 強型別列舉(enum)

c 11之前的enum型別是繼承c的,不溫不火 c 11對enum動刀了,加強了型別檢查,推出強型別enum型別,眼前一亮 使用過qt 的都知道,早就應該這麼做了,用的很爽!一 c中enum型別的侷限 1 非強型別作用域 enum type1 enum type2 問題來了,兩種列舉型別都有a列舉常...

走進C 11(五) 繼承構造

你的人生不會辜負你的。那轉錯的彎,流下的淚水,滴下的汗水,全都讓你成為獨一無二的自己。只是努力了一陣子,但一遇到困難就各種憂傷,好像自己努力了很久一樣。繼承構造 在繼承體系中,假設派生類想要使用基類的建構函式,必須要在建構函式中顯式宣告。舉個小例子 class basebase int value ...