類中的靜態成員變量 非靜態成員變量的初始化問題

#include <iostream>
using namespace std;
struct a
{
 int m;
};

struct b : public a
{
  int n =8;
};

int n =8這行報錯,因爲類的非靜態成員不能在類中初始化。

1. 爲什麼類的靜態成員變量不能在類中初始化

 

在C++中,類的靜態成員(static member)必須在類內聲明,在類外初始化,像下面這樣

class A
{  
private:
    static int count ; // 類內聲明
};

int A::count = 0 ; // 類外初始化,不必再加static關鍵字

爲什麼?因爲靜態成員屬於整個類,而不屬於某個對象,如果在類內初始化,會導致每個對象都包含該靜態成員,這是矛盾的。

 

2.爲什麼類的非靜態成員也不能在類中初始化

 

定義類的時候並沒有分配內存這時候賦值的話值放在哪裏呢當用類構造對象的時候首先分配內存然後調用構造函數這時候纔可以初始化非靜態成員變量。

 

類的靜態成員變量和方法屬於類本身,在類加載的時候就會分配內存,可以通過類名直接去訪問;非靜態成員(變量和方法)

屬於類的對象,所以只有在類的對象產生(創建類的實例)時纔會分配內存,然後通過類的對象(實例)去訪問。

 

在一個類的靜態成員中去訪問其非靜態成員之所以會出錯是因爲在類的非靜態成員不存在的時候類的靜態成員就已經存在了,訪問一個內存中不存在的東西當然會出錯。(訪問的這個非靜態成員必須是屬於某個實例才行)

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章