日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C++11中強類型枚舉的使用_C 語言

作者:Shawn-Summer ? 更新時間: 2023-04-01 編程語言

1.C/C++98中的枚舉的缺陷

枚舉在C語言中是狠古老的類型,它分為匿名枚舉和具名枚舉,如果是匿名枚舉,那么它的用法只有一種:

//方法一:
enum {Male,Female};

//方法二:
#define Male 0
#define Female 1

//方法三:
static const int Male=0;
static const int Female=1;

如上三種方法實現的效果是差不多的,不過采用宏方法會引起一些不必要的糾紛。方法一和方法三在實現效果上幾乎完全一致,方法一和方法三等價替換。

對于具名枚舉來說,一般用法就是聲明一個變量是枚舉類型的,然后該變量只能由枚舉成員初始化和賦值

enum Gender{Male,Female};
Gender a=Male;
a=Female;
a=1;//錯誤

C/C++98中的枚舉的缺陷主要是三個:

  • 對全局名稱空間的污染
  • 枚舉成員(或變量)可以隱式轉化為整型
  • 枚舉成員(或變量)的底層類型,即整型由編譯器決定

在C++11中,我們引入了名稱空間的概念,我們同樣希望枚舉成員能夠采用名字::成員的方式進行訪問,而不是直接將大量的枚舉成員暴露在當前名稱空間中。
此外.我們更希望枚舉類型獨立于整型,或者說,至少它不應該自動轉化為整型,例如下面這樣。

    enum Gender{Male,Female};
    Gender a=Male;
    int b=a;
    int c=Female;

我們看最后一個缺陷,即枚舉成員(或變量)的底層類型一般是整型,但是不同的編譯器的設定不同,有可能一些是有符號整型,而另一種就是無符號整型。

enum Gender{Male=-1000,Female=9999};//這段代碼可能在某些編譯器中報錯

2.強類型枚舉的使用

強類型枚舉(strong-typed enum)或者稱之為枚舉類,主要是針對上述三個缺陷進行了修補。

#include<iostream>
using namespace std;
enum class Type {General,Light,Medium,Heavy};
enum struct Category{General=1,Pistol,MachineGun,Cannon};

int main()
{
? ? Type t=Type::Light;
? ? t=General;//編譯錯誤
? ? if(t==Category::General)//編譯錯誤
? ? ? ? cout<<"A"<<endl;
? ? if(t> Type::General)//編譯通過
? ? ? ? cout<<"B"<<endl;
? ? if(t>0)//編譯錯誤
? ? ? ? cout<<"C"<<endl;
? ? cout<<is_pod<Type>::value<<endl;//1
? ? cout<<is_pod<Category>::value<<endl;

}

我們總結出

  • 強類型枚舉中的成員,只能采用名字::成員的方式進行訪問
  • 強類型枚舉類型的變量,只能和同是強類型枚舉的值進行比較
  • 強類型枚舉中的class關鍵詞,可以用struct進行等價替換
#include<iostream>
using namespace std;
enum class C: char{C1=1,C2=2};
enum class D: unsigned int {D1=1,D2=2,Dbig=0xfffffff0u};
int main()
{
    cout<<sizeof(C::C1)<<endl;
    cout<<(unsigned int)D::Dbig<<endl;
    cout<<sizeof(D::D1)<<endl;
    cout<<sizeof(D::Dbig)<<endl;
}

而且我們在聲明強類型枚舉的同時,可以顯式定義它的底層類型,enum class C: char,為了通用性,C++11也對C風格枚舉進行了這個優化,即允許C風格枚舉規定底層類型.

實際上,強類型枚舉也存在匿名類型,不過如果它是匿名的,你就無法訪問它的枚舉成員了,不過你可以使用decltype來找到名稱,不過也是多此一舉的,所以匿名強類型枚舉沒啥用。

原文鏈接:https://blog.csdn.net/m0_71009069/article/details/128805190

欄目分類
最近更新