定義屬於這個類范圍的常量
class test
{
private:
enum {Months = 12};
};
這種聲明枚舉不會創建類數據成員,這里枚舉只是為了創建類數據成員,因此不用提供枚舉名。類似上面的例子還有ios_base::fixed
等。
擴充:c++11作用域內的枚舉
enum egg {Small, Medium, Large, Jumbo};
enum t_shirt {Small, Medium, Large, Xlarge};
編譯器提示重復定義Small
、Medium
、Large
和Jumbo
。因為egg Small和t_shirt Small位於相同的作用域內。
c++11提供了一種新的枚舉,它的作用域為類。可以使用關鍵字class
或者struct
。
enum class egg {Small, Medium, Large, Jumbo};
enum class t_shirt {Small, Medium, Large, Xlarge};
egg choice = egg::Large;
t_shirt Floyd = t_shirt::Large;
const常量
class test
{
private:
const int n;
public:
test():n(100){}
}
類的聲明只是聲明了類的形式,並沒有創建對象,因此,在創建對象前,將沒有用於儲存值的空間。
c++98與c++11的區別
在C++98標准里,只有static const聲明的整型成員能在類內部初始化,並且初始化值必須是常量表達式。這些限制確保了初始化操作可以在編譯時期進行。
class X {
static const int m1 = 7; // 正確
const int m2 = 7; // 錯誤:無static
static int m3 = 7; // 錯誤:無const
static const string m5 = “odd”; //錯誤:非整型
};
C++11的基本思想是,允許非靜態(non-static)數據成員在其聲明處(在其所屬類內部)進行初始化。這樣,在運行時,需要初始值時構造函數可以使用這個初始值。現在,我們可以這么寫:
class A {
public:
int a = 7;
};
//它等同於使用初始化列表:
class A {
public:
int a;
A() : a(7) {}
};
c++11這樣的好處就是當構造函數需要多個初始化時就會變得很簡潔。