為什么static成員變量一定要在類外初始化?


為什么靜態成員不能在類內初始化?

在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就不行了 
};


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM