為什么靜態成員不能在類內初始化?
在C++中,類的靜態成員(static member)必須在類內聲明,在類外初始化,像下面這樣。
class A
{
private:
static int count ; // 類內聲明
};
// 類外定義並初始化,不必再加static關鍵字
int A::count = 0 ;
或者只進行定義不賦初始值,但是默認值是否是0,可能會與具體的編譯器有關吧?
// 只進行定義不賦初始值,但默認值視編譯器而定
int A::count;
為什么?
因為靜態成員屬於整個類,而不屬於某個對象,如果在類內初始化,會導致每個對象都包含該靜態成員,這是矛盾的。
如果不增加int A::count = 0 ;
//變量定義,在編譯的時候將會報出:‘A::count’未定義的引用”錯誤。這是因為靜態成員變量count未定義,也就是還沒有分配內存,顯然是不可以訪問的。
《c++primer》里面說在類外定義和初始化是保證static成員變量只被定義一次的好方法。 但為什么static const int
就可以在類里面初始化呢?
想起C中一個函數里定義一個static變量是為了保證只初始化一次。
那么,是否可以這樣理解: static數據成員在類外定義和初始化是為了保證只被定義和初始化一次,這樣編譯器就不必考慮類的函數里面第一個對static變量的’=’操作是賦值還是初始化了。 static const int
可以在類里面初始化,是因為它既然是const的,那程序就不會再去試圖初始化了。
什么靜態成員能在類內初始化
能在類中初始化的靜態成員只有一種,那就是靜態常量成員。
//這樣不行
class A {
private:
static int count = 0; // 靜態成員不能在類內初始化
};
//這樣也不行
class A {
private:
const int count = 0; // 常量成員也不能在類內初始化
};
//但是這樣可以
class A {
private:
static const int count = 0; // 靜態整型常量成員可以在類內初始化,但是 static const float count就不行了
};