1. 程式人生 > >c++11之前,只有靜態常量整型資料成員才可以在類中初始化是為什麼

c++11之前,只有靜態常量整型資料成員才可以在類中初始化是為什麼

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

在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允許就地初始化了。

一般當我們說到“分配空間”或者“分配記憶體”,都是指的對資料成員分配,而不是指成員函式。
從這個意義上來說,一個類只宣告但是沒有例項化,是不會給分配空間的。

既然樓主問到了“成員函式是否分配空間”,那就多羅索幾句。
成員函式的程式碼是要佔用空間的,但那是在程式碼段,我們通常說的分配空間都是資料段。
只要寫了一個類,有成員函式,就需要在程式碼段儲存程式碼,即使沒有例項化也需要。
另一方面,不管有多少例項,程式碼也只儲存一份,大家共用。

雖然類的函式的記憶體空間是獨立於類物件的,但是類函式是否佔有空間還是可能依賴於類物件。
沒有被使用的類的函式,不會被連結到程式裡;如果程式裡沒有類例項,很可能這個類相關的資訊(包括函式)都不會被保留。