1. 程式人生 > >Modern C++(六)強型別列舉enum

Modern C++(六)強型別列舉enum

我們都知道在C++11前的列舉型別是預設為int型別,不是強型別的,所以毫無關係的兩個列舉型別可以進行比較

enum EnumA
{
    A = 1,
    B = 2
};

enum EnumB
{
    C = 1,
    D = 2
};

if (EnumA::A == EnumB::C)
{
    //...
}

並且還隱藏著另外一個問題,由於列舉型別的元素是完全暴露出來的,其作用域內不可以有同名元素,比如

enum EnumC
{
    E = 1,
    F = 2
};

enum EnumD
{
    E = 1,
    G = 2
};

//重定義,無法通過編譯,因為EnumC::E與EnumD::E被認定為同一變數

在C++11的標準中解決了這個問題,擁有了強型別列舉,從名字我們知道這裡解決了弱型別的問題,我們看看是如何使用的

enum class EnumA
{
    A = 1,
    B = 2
};

enum class EnumB
{
    C = 1,
    D = 2
};

我們再對EnumA和EnumB中的元素進行比較

if (EnumA::A == EnumB::C)
{
    //...
}

//編譯錯誤~

隨之,元素同名問題也解決了

enum class EnumC
{
    E = 1,
    F = 2
};

enum class EnumD
{
    E 
= 1, G = 2 }; //通過編譯~

同時,他們也將無法隱形轉換為int型別 EnumC::E = 5 將無法通過編譯,不過仍然相容以前的用法。並且也無法直接使用E,G,因為他們分別屬於各自列舉型別作用域中。

其他特性

enum並支援指定列舉型別的資料型別,預設型別為int

enum EnumA : int {};
enum class EnumB : long {};

由於可以指定enum的資料型別,所以enum支援前置宣告啦~但必須指定型別

enum class Enum : char;

void Test(Enum e)
{
    //...
}

enum class Enum : char
{
    A = 'A'
, B = 'B' };

獲取更多資訊

Copyright © EasyDarwin.org 2012-2016

EasyDarwin

相關推薦

Modern C++()型別列舉enum

我們都知道在C++11前的列舉型別是預設為int型別,不是強型別的,所以毫無關係的兩個列舉型別可以進行比較 enum EnumA { A = 1, B = 2 }; enum EnumB { C = 1, D = 2 };

Cocos2dx 3.0 過渡篇(二十八)C++11型別列舉

一朋友在微信朋友圈晒了張照片,隨手點開大圖,帶著讚賞的眼光掃了下,恩,幾個月不見。又美麗了...咦?等等,她戴的這是什麼? 酷炫的造型!金屬邊框!微型攝像頭! 這不是傳說中的谷歌眼鏡麼?土豪啊,還好我們已經是朋友了...我先給了她一個贊,然後直奔主題,霸氣回覆道:我過幾天去找你,你

C++11型別列舉

1.傳統列舉型別的缺陷 列舉型別是C/C++中使用者自定義的構造型別,它是由使用者定義的若干列舉常量的集合。列舉值對應整型數值,預設從0開始。比如定義一個描述性別的列舉型別。 enum Gender{Male,Female}; 其中列舉值Male被編譯器預設賦值為0,Fem

c++11】 enum class: 型別列舉

#include <iostream> int _tmain(int argc, _TCHAR* argv[]) {     // 1、列舉型別的定義:     // 普通列舉常量作用域提升至外圍(main函式之內)並且可以整型提升     enum Numb

C++11:型別列舉enum

// C++11之前的enum型別是繼承C的,不溫不火; // C++11對enum動刀了,加強了型別檢查,推出強型別enum型別,眼前一亮 // 使用過QT 的都知道,早就應該這麼做了,用的很爽!! // 一、C中enum型別的侷限 // 1、非強型別作用域 enum

C++中傳統列舉型別列舉的區別?

傳統列舉型別定義舉例: enum Animal  //列舉型別名字 {        monkey, //列舉中的元素值        horse,        lion,        eleph

C++列舉型別EnumC++11列舉型別用法

列舉常常和switch配合使用,用一個程式碼片段來說明: //W A S D 前、後、左、右行走\nQ E 左、右轉頭\nF 復位\nG H 暫停、繼續、重播例項\nY 停止例項\nB 刪除例項\nSPACE 刪除所有例項 enum Keydown{ Forward='w', Back

C++11 列舉型別的應用

一貫的風格,為什麼c++ 11為什麼要引入強列舉型別,主要是為了解決什麼問題? 在此之前我們來看看平時我們的列舉用法: enum是我們編譯器內建的型別. 首先列舉型別是不安全的,為什麼不安全? //體重 namespace T { enum Type {

Cocos2d-x3.1中C++11列舉型別

轉載自:http://blog.csdn.net/star530/article/details/24273309 在cocos2dx 3.0的文件裡有這麼一句話: 以 k 開頭的常量和列舉量,通常被定義為 int 或者簡單的 enum 型別,現在已經被強型別列舉(enum

C++中列舉enum詳解

轉載部落格地址:https://blog.csdn.net/bruce_0712/article/details/54984371     眾所周知,C/C++語言可以使用#define和const建立符號常量,而使用enum工具不僅能夠建立符號常量,還能定義新

Java 列舉(enum)型別 常見7種用法 詳解

JDK1.5引入了新的型別——列舉。在 Java 中它雖然算個“小”功能,卻給我的開發帶來了“大”方便。 用法一:常量 在JDK1.5 之前,我們定義常量都是: public static final.... 。現在好了,有了列舉,可以把相關

C++筆記 第C++中的型別識別(新內容的最後一課)---狄泰學院

如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。 學習C++編譯環境:Linux 第六十六課 C++中的型別識別(新內容的最後一課) 1.型別識別 在面向物件中可能出現下面的情況 基類指標指向子類物件 基類引用成為子類物件的別名 靜態型別-變數(物件)自

列舉enum型別

轉載:https://www.cnblogs.com/shrimp-can/p/5171110.html 一、列舉型別的定義 enum 型別名 {列舉值表}; 型別名是變數名,指定列舉型別的名稱。 列舉值表也叫列舉元素列表,列出定義的列舉型別的所有可用值,各個值之間用“,”分開。 語法結構:&nbs

共用體union與列舉enumC++)

一、共用體: 共用體(union)是一種資料格式,它能夠儲存不同的資料型別,但只能同時儲存其中的一種型別。也就是說,結構可以同時儲存int、long和double,共用體只能儲存int、long或double。共用體的句法與結構相似,但含義不同。例如: union one

C# 列舉 Enum 常用操作

1.定義 public enum Musics{    音樂1 = 1,    音樂2 = 2,    音樂3 = 3,    音樂4 = 4,    音樂5, 音樂6, 音樂7, 音樂8=10

PostgreSQL中的列舉型別Enum

    在PostgreSQL中,需要先使用create type 建立列舉型別。 1.建立列舉型別 create type week as enum('Sun','Mon','Tues','Wed','Thur','Fri','Sat'); 2.建立表 create

列舉Enum通過int值或文字轉為對應的列舉型別

1.數值轉列舉 如果列舉型別繼承了數值型別,可以直接強制轉換 public enum SourceType : byte { YC = 0, TS = 1, QK = 2, ZQ = 3 } //轉換方式 i

java中關於列舉enum型別的用法

JDK1.5引入了新的型別——列舉。在 Java 中它雖然算個“小”功能,卻給我的開發帶來了“大”方便。 用法一:常量 在JDK1.5 之前,我們定義常量都是: public static fianl.... 。現在好了,有了列舉,可以把相關的常量分組到一個列舉型別裡,而且列舉提供了比常量更多的方法

c++11 類型枚舉 enum class

整數 枚舉類 name 相同 space ios enum 大小 include 在標準C++中,枚舉類型不是類型安全的。枚舉類型被視為整數,這使得兩種不同的枚舉類型之間可以進行比較。C++03 唯一提供的安全機制是一個整數或一個枚舉型值不能隱式轉換到另一個枚舉別型。 此外

C++11 併發指南(atomic 型別詳解一 atomic_flag 介紹)

C++11 併發指南已經寫了 5 章,前五章重點介紹了多執行緒程式設計方面的內容,但大部分內容只涉及多執行緒、互斥量、條件變數和非同步程式設計相關的 API,C++11 程式設計師完全可以不必知道這些 API 在底層是如何實現的,只需要清楚 C++11 多執行緒和非同步程