C++ static 語義

一、類的static data member

1、永遠只有一份內存實體

static意味着該變量屬於這個類,而不是屬於該類的某個對象。這裏的屬於可以從存儲空間的角度理解,即產生一個新的類對象時,不會再爲該對象分配static data member的存儲空間。但對對象進行sizeof操作時,static data member的存儲空間還是要加上的。class的static data member存儲在程序的全局數據區中,在沒有產生類對象時就已經獲得存儲空間分配。static data member 和non-static data member一樣遵從public,protected,private訪問規則。static語義表明static data member一般用在一個類的所有對象任何時刻應該具有相同值時。

 

看最簡單的例子

class CBaseStatic
{
public:
 CBaseStatic(void);
 virtual ~CBaseStatic(void);
 void SetData1(int iData);
 int GetData1();
private:
 static int m_sData1;
 int m_iData2;
};

// 剛開始在類外初始化爲0

int CBaseStatic::m_sData1 = 0;

 

 TRACE(_T("--------------------------->%d\n"),sizeof(CBaseStatic));

 CBaseStatic obj1;

 CBaseStatic obj2;

 CBaseStatic obj3;

 TRACE(_T("--------------------------->%d\n"),sizeof(obj1));

 TRACE(_T("--------------------------->%d\n"),sizeof(obj2));

 TRACE(_T("--------------------------->%d\n"),sizeof(obj3));


 TRACE(_T("--------------------------->%d\n"),obj1.GetData1());

 TRACE(_T("--------------------------->%d\n"),obj2.GetData1());

 TRACE(_T("--------------------------->%d\n"),obj3.GetData1());

 obj1.SetData1(100);

 TRACE(_T("--------------------------->%d\n"),obj1.GetData1());

 TRACE(_T("--------------------------->%d\n"),obj2.GetData1());

 TRACE(_T("--------------------------->%d\n"),obj3.GetData1());

 

輸出結果爲:

--------------------------->8
--------------------------->8
--------------------------->8
--------------------------->8
--------------------------->0
--------------------------->0
--------------------------->0
--------------------------->100
--------------------------->100
--------------------------->100

結果驗證了上面所說的,通過obj1改變static data member的值,所有的都變了,表明只有一份內存實體。即使在派生類中也是“共享”基類的那份內存實體,不會分配新的存儲空間。

 

看下面代碼

class CDrivedStatic :
 public CBaseStatic
{
public:
 CDrivedStatic(void);
 virtual ~CDrivedStatic(void);
};

 

CDrivedStatic objDrived;
 objDrived.SetData1(200);

 TRACE(_T("--------------------------->%d\n"),obj1.GetData1());

 TRACE(_T("--------------------------->%d\n"),obj2.GetData1());

 TRACE(_T("--------------------------->%d\n"),obj3.GetData1());

 

輸出結果:

--------------------------->200
--------------------------->200
--------------------------->200

記住,static data member唯一的一份內存實體。

 

發佈了23 篇原創文章 · 獲贊 1 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章