C++類常量和類枚舉
文章轉自公眾號: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++類常量和類枚舉的文章就介紹到這瞭,更多相關C++類常量和類枚舉內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Java枚舉學習之定義和基本特性詳解
- C++11 關鍵字 const 使用小結
- java語法糖之jdk迭代的新特性匯總
- Bootstrap5的斷點與容器的具體使用
- C++ RTTI與4種類型轉換的深入理解