關(guān)于C++11中限定作用域的枚舉類(lèi)型的問(wèn)題
枚舉類(lèi)型是將一組有限的整數(shù)常量組織在一起用以描述變量可取值范圍的一種數(shù)據(jù)類(lèi)型。C++中有兩種類(lèi)型的枚舉:不限定作用域的枚舉類(lèi)型和限定作用域的枚舉類(lèi)型。限定作用域的枚舉類(lèi)型是C++11標(biāo)準(zhǔn)引入的新類(lèi)型。
● 限定作用域枚舉類(lèi)型是為了彌補(bǔ)不限定作用域枚舉類(lèi)型的不足而出現(xiàn)的,不限定作用域的枚舉類(lèi)型不是類(lèi)型安全的,主要表現(xiàn)在如下幾個(gè)方面:
● 不限定作用域的枚舉類(lèi)型中的枚舉成員被視為整數(shù),兩種不同的枚舉類(lèi)型之間可以進(jìn)行比較。兩種不同類(lèi)型的數(shù)據(jù)進(jìn)行比較,可能帶來(lái)數(shù)據(jù)類(lèi)型轉(zhuǎn)換,引起數(shù)據(jù)表示不完整。
● 不限定作用域枚舉所使用的整數(shù)類(lèi)型及其大小都由實(shí)現(xiàn)方法定義,皆無(wú)法明確指定。
● 不限定作用域枚舉類(lèi)型的枚舉成員與枚舉類(lèi)型外部數(shù)據(jù)處在同一個(gè)作用域范圍內(nèi),多個(gè)枚舉類(lèi)型不能有同名的枚舉成員。
C++11標(biāo)準(zhǔn)引入的限定作用域的枚舉類(lèi)型,其定義方式如下所示:
enum class 枚舉類(lèi)型名稱(chēng) {枚舉成員1, 枚舉成員2, …, 枚舉成員n};
相對(duì)于不限定作用域的枚舉類(lèi)型,限定作用域的枚舉類(lèi)型定義的枚舉成員在枚舉類(lèi)型作用域外不可訪(fǎng)問(wèn)。
//定義不限定作用域枚舉類(lèi)型 enum color {red, yellow, green}; //錯(cuò)誤,不限定作用域枚舉成員不能與其它枚舉類(lèi)型成員同名 enum stoplight{red, yellow, green}; //正確,限定作用域枚舉成員的作用域限定在類(lèi)型內(nèi) enum class newcolor {red, yellow, green}; //正確,不限定作用域的枚舉類(lèi)型外可以使用枚舉成員 color e_color = green; //錯(cuò)誤,限定作用域的枚舉成員在類(lèi)型外不可訪(fǎng)問(wèn) //雖然color類(lèi)型的green成員可訪(fǎng)問(wèn),但是color與newcolor類(lèi)型不同,不可賦值 newcolor ec_color = green;
在舊標(biāo)準(zhǔn)中,枚舉變量可以使用整數(shù)常量進(jìn)行賦值,但在C++11標(biāo)準(zhǔn)中,要想初始化枚舉類(lèi)型對(duì)象或?qū)γ杜e對(duì)象賦值,必須使用該類(lèi)型的一個(gè)枚舉成員或該類(lèi)型的一個(gè)對(duì)象。示例代碼如下所示:
enum color {red, yellow, green}; enum class newcolor {red, yellow, green}; color e_var1 = 1; //錯(cuò)誤,1不是枚舉類(lèi)型值 color e_var2 = red; //正確,red是color類(lèi)型的枚舉值 color e_var3 = e_var2; //正確,同類(lèi)型數(shù)據(jù)之間的賦值 newcolor e_nvar1 = newcolor::red; //正確,red是newcolor類(lèi)型的枚舉值
不限定作用域的枚舉類(lèi)型對(duì)象或枚舉成員可以自動(dòng)轉(zhuǎn)化為整型,因此可以在需要整數(shù)的地方使用它們,限定作用域的枚舉類(lèi)型卻沒(méi)有此特點(diǎn)。示例代碼如下所示:
int i = color::red; //正確,不限定作用域的枚舉成員可轉(zhuǎn)化為整數(shù) int j = newcolor::red; //錯(cuò)誤,限定作用域的枚舉成員不可轉(zhuǎn)化為整數(shù)
C++11新標(biāo)準(zhǔn)除了增加了限定作用域枚舉類(lèi)型外,還改進(jìn)了原有的不限定作用域枚舉類(lèi)型的定義形式:
1、枚舉類(lèi)型中枚舉成員的類(lèi)型可以顯式指定,指定方式是在枚舉類(lèi)型名稱(chēng)后加冒號(hào)和枚舉成員類(lèi)型。
enum intvalues:unsigned long long{ chartype = 255, shorttype = 65535, inttype = 4295967295, longtype = 4294967295ul, longlongtype = 18446744073709551615ul };
若不指定枚舉成員類(lèi)型,限定作用域枚舉類(lèi)型成員默認(rèn)為int,不限定作用域枚舉類(lèi)型成員不存在默認(rèn)類(lèi)型,能夠確定的是成員類(lèi)型足夠大到能容納所有成員。指定了枚舉成員類(lèi)型后,若某一枚舉成員值超出了該類(lèi)型所能容納的范圍,將引發(fā)錯(cuò)誤。
2、在C++11 中,可以提前聲明enum。enum的前置聲明必須指定枚舉成員類(lèi)型,隱式指定或顯式指定均可。
enum etype1; //錯(cuò)誤,不限定作用域枚舉類(lèi)型的前置聲明應(yīng)指定成員類(lèi)型 enum etype2:unsigned int; //正確 enum class etype3; //正確,限定作用域枚舉類(lèi)型成員有默認(rèn)類(lèi)型int enum class etype4:unsigned int; //正確,前置聲明指定枚舉成員類(lèi)型
與所有的聲明語(yǔ)句一樣,枚舉的聲明和定義中描述的成員類(lèi)型必須一致,另外不能在同一個(gè)上下文中先聲明一個(gè)不限定作用域的枚舉類(lèi)型再聲明一個(gè)同名的限定作用域枚舉類(lèi)型。
enmu class Clolor:char; //前置聲明枚舉類(lèi) void Foo(Color*p); //前置聲明的使用 //.................... enum class Color:char{RED,GREEN,BLACK,WHITE}; //前置聲明的定義
參考鏈接:
C++11強(qiáng)類(lèi)型枚舉——枚舉類(lèi)
限定作用域的枚舉類(lèi)型 - C語(yǔ)言學(xué)習(xí)教程_C語(yǔ)言程序_ c語(yǔ)言編程_ c語(yǔ)言入門(mén)
到此這篇關(guān)于C++11:限定作用域的枚舉類(lèi)型的文章就介紹到這了,更多相關(guān)C++11作用域枚舉類(lèi)型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MFC實(shí)現(xiàn)學(xué)生選課系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了MFC實(shí)現(xiàn)學(xué)生選課系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02C語(yǔ)言超詳細(xì)講解數(shù)據(jù)結(jié)構(gòu)中的線(xiàn)性表
線(xiàn)性表,數(shù)據(jù)結(jié)構(gòu)中最簡(jiǎn)單的一種存儲(chǔ)結(jié)構(gòu),專(zhuān)門(mén)用于存儲(chǔ)邏輯關(guān)系為"一對(duì)一"的數(shù)據(jù)。線(xiàn)性表是基于數(shù)據(jù)在實(shí)際物理空間中的存儲(chǔ)狀態(tài),又可細(xì)分為順序表(順序存儲(chǔ)結(jié)構(gòu))和鏈表2022-05-05C/C++?Qt?數(shù)據(jù)庫(kù)與TreeView組件綁定詳解
本篇文章主要介紹了QT數(shù)據(jù)庫(kù)與View組件的綁定,通過(guò)數(shù)據(jù)庫(kù)與組件關(guān)聯(lián)可實(shí)現(xiàn)動(dòng)態(tài)展示數(shù)據(jù)庫(kù)中的表記錄。感興趣的小伙伴可以了解一下2021-12-12C++中線(xiàn)性代數(shù)計(jì)算Eigen庫(kù)的使用教程詳解
Eigen是一個(gè)基于線(xiàn)性代數(shù)的C++模板庫(kù),主要用于矩陣、向量、數(shù)值求解和相關(guān)算法,本文主要為大家簡(jiǎn)單聊聊Eigen庫(kù)的使用,希望對(duì)大家有所幫助2023-12-12C語(yǔ)言如何實(shí)現(xiàn)循環(huán)輸入
這篇文章主要介紹了C語(yǔ)言如何實(shí)現(xiàn)循環(huán)輸入問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02