一、類的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唯一的一份內存實體。