網站首頁 編程語言 正文
文章轉自公眾號:Coder梁(ID:Coder_LT)
1.類常量
有的時候, 我們希望能給類當中定義一些常量,可以給所有類的對象使用。
比如說我們在類當中定義一個數組,希望可以定義一個常量,用來初始化數組的長度。既然是用來初始化數組長度的,那么這個值自然也不會改變,我們定義成const
是否可行呢?
比如這樣:
class P { ? ? private: ? ? ?const int N=15; ? ? ?int costs[N]; ? ? ... }
很遺憾,這樣不行,編譯器會拋出一個錯誤:
說我們non-static
變量N用的不對,看到了吧?報錯信息里的描述是non-static
變量,也就是說我們這里定義的N不是一個static
類型的,所以不能用來初始化數組。
那怎么樣才算對了呢?很簡單,我們可以定義成static
變量就對了。
class P { ? ? private: ? ? ?static const int N=15; ? ? ?int costs[N]; ? ? ... }
也就是在const int
前面加上了static
關鍵字,表示這是一個static
即靜態變量。這個常量會和其他靜態變量存儲在一起,而不是存儲在對象里,這樣的話也就被所有對象共享了。
對于像是Java
、Python
等其他語言來說,類中的靜態變量是可以通過類名直接訪問的,而C++中不行。
除了定義靜態變量之外,還有一種方法就是定義類枚舉:
class P { ? ? private: ? ? ?enum {N=15}; ? ? ?int costs[N]; ? ? ... }
這樣也能運行,看起來非常不可思議。
通過這種方式聲明并不會創建類數據成員,對于類的對象來說,并不包含枚舉,這里的N只是一個符號名稱。在類當中遇到它的時候,編譯器會用15來代替。
也正是因為我們只是為了創建符號常量,而不是創建枚舉類型的變量,所以不需要提供枚舉名。有一些C++的類庫當中也用到了這種方法,比如ios_base::fixed
等。
2.類枚舉
傳統的枚舉類型變量存在一定的問題,最大的問題是當兩個枚舉定義中的枚舉量重名的時候,就會發生沖突:
enum A {small, big, medium}; enum B {small, large, xlarge};
這兩個枚舉類型當中都有small
,如果位于相同的作用于,那么就會發生沖突。
為了避免這個問題,C++11
當中提供了一種新枚舉,它的作用域為類,聲明類似這樣:
enum class A {small, big, medium}; enum class B {small, large, xlarge};
和上面的代碼幾乎是一樣的,只不過多了一個關鍵字class
,換成struct
也是可以的。
當我們使用的時候,需要加上解析運算符:
A choice = A::small; B c = B::large;
另外我們前面說過,常規的枚舉將自動轉化為整型,比如賦值給int變量或者是用于比較表達式的時候。而作用域內枚舉不會隱式地轉換類型。
- 上一篇:C++this指針詳情_C 語言
- 下一篇:C++抽象數據類型介紹_C 語言
相關推薦
- 2023-08-12 thinkadmin 單頁面多個富文本初始化
- 2022-04-17 論一次 taro小程序分包優化經歷,小程序體積過大的優化
- 2022-02-10 linux后臺運行任務命令(nohup: 忽略輸入并把輸出追加到“nohup.out“)
- 2022-04-09 Nginx1.21.6生產環境升級步驟_nginx
- 2022-12-24 Android設置Padding和Margin(動態/靜態)的方法實例_Android
- 2022-12-24 C++中類的三種訪問權限解析:private、public與protect_C 語言
- 2022-07-25 .Net行為型設計模式之訪問者模式(Visitor)_基礎應用
- 2022-11-24 詳解Linux中atime,mtime,ctime的使用場景_linux shell
- 最近更新
-
- 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同步修改后的遠程分支