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
語法:
進入c++11後,使用enum有三點要注意。enum class type4:type;//加class,具名,指定底層型別type
enum class type5;//不指定底層型別
enum class day // 限定作用域
;
進入c++11以後我們可以制定enum的大小,進而優化記憶體。例如可以在enum的名字後面指定我們想該enum使用的型別,enum month // 不限定作用域
;
why using c++11 enum《effective modern c++》中,scott meyers建議優先使用限定作用域的列舉型別,而非限定作用域的列舉型別。原因主要有以下幾個方面:enum class day : uint8_t // 限定作用域
;
a. 限定作用域的列舉型別將名字空間汙染降低,如下:
auto day = sunday; // sunday被限定在day作用域內
auto day = day::sunday; // ok
auto month = january; // ok
非強型別作用域
問題來了,兩種列舉型別都有a列舉常量,而且作用域相同,發生了衝突。強型別作用域就不會有這個問題enum type1;
enum type2;
b. 限定作用域的列舉型別是強型別的,限定作用域的列舉型別無法通過隱式轉換到其他型別,而不限定的列舉型別可以自動轉換為整形。
當然,可以使用強制型別轉換static_cast實現限定作用域的列舉型別轉換。int num = day::sunday; // 限定作用域的列舉型別不會進行隱式轉換
int num = month::january; // ok
c. 可以指定底層型別c語言下面,enum大小是乙個整型大小,但是c下整型有很多種,char、long int和short int等,具體哪一種呢?下面引用《c in a nutshell》裡的一句話來解釋下,if(ttype2::b); //非同乙個enum型別,不能隱式轉換為int等值,不嗯呢該比較
if((int)t > (int)type2::b) //強制型別轉換,可以通過
意思就是enum型別的大小是由編譯器根據定義值的大小來選擇合適的整數型別,所以enum型別的大小並不是固定的。
舉個例子:
輸出如下,#include
enum color1;
enum color2;
int main(void)
因為enum color2的大小已經超過了4個位元組,這樣編譯器就會把它的大小擴大。enum color1: 4
enum color2: 8
這樣會有乙個潛在的弊端:如果我們定義了乙個結構體,其成員有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 ...