網站首頁 編程語言 正文
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
相關推薦
- 2022-07-09 python?監控某個進程內存的情況問題_python
- 2022-10-21 C++?ffmpeg硬件解碼的實現方法_C 語言
- 2022-12-09 shell腳本實現Hbase服務的監控報警和自動拉起問題_linux shell
- 2022-06-12 教你十行代碼實現python向手機推送通知功能_python
- 2023-01-03 python實現線性插值的示例_python
- 2023-01-01 淺析C++中static的一些用法_C 語言
- 2022-07-26 msSQL中having的用處詳解_MsSql
- 2024-01-09 Certificate used to sign the license is not signed
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支