c++11之前,只有靜態常量整型資料成員才可以在類中初始化是為什麼
阿新 • • 發佈:2019-01-06
為什麼靜態成員不能在類內初始化
在C++中,類的靜態成員(static member)必須在類內宣告,在類外初始化,像下面這樣。
class A
{
private:
static int count ; // 類內宣告
};
int A::count = 0 ; // 類外初始化,不必再加static關鍵字
為什麼?因為靜態成員屬於整個類,而不屬於某個物件,如果在類內初始化,會導致每個物件都包含該靜態成員,這是矛盾的。
什麼東西能在類內初始化
能在類中初始化的成員只有一種,那就是靜態常量成員。
這樣不行
class A { private: static int count = 0; // 靜態成員不能在類內初始化 }; 這樣也不行 class A { private: const int count = 0; // 常量成員也不能在類內初始化 };
三種類型必須通過初始化列表來初始化
1. 常量
2. 引用型別
3. 沒有預設建構函式的類型別
但是這樣可以
class A
{
private:
static const int count = 0; // 靜態常量成員可以在類內初始化
};
VS2010支援C++11之前的標準(C++98/C++03),只有靜態常量整型資料成員才可以在類中初始化。類定義只是一個框架,不是例項,不會分配儲存空間,不會給它的成員變數賦值。只有類被例項化時,即建立物件,才會分配記憶體,才會給其成員變數賦值。靜態常量整型資料成員是一個特例。
但這一點在C++11中有了變化,C++11允許就地初始化了。
一般當我們說到“分配空間”或者“分配記憶體”,都是指的對資料成員分配,而不是指成員函式。
從這個意義上來說,一個類只宣告但是沒有例項化,是不會給分配空間的。
既然樓主問到了“成員函式是否分配空間”,那就多羅索幾句。
成員函式的程式碼是要佔用空間的,但那是在程式碼段,我們通常說的分配空間都是資料段。
只要寫了一個類,有成員函式,就需要在程式碼段儲存程式碼,即使沒有例項化也需要。
另一方面,不管有多少例項,程式碼也只儲存一份,大家共用。
雖然類的函式的記憶體空間是獨立於類物件的,但是類函式是否佔有空間還是可能依賴於類物件。
沒有被使用的類的函式,不會被連結到程式裡;如果程式裡沒有類例項,很可能這個類相關的資訊(包括函式)都不會被保留。