Posted on 2007-02-10 09:10
softgamer 閱讀(619)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
學(xué)習(xí)日志
?? 靜態(tài)數(shù)據(jù)成員很像是全局變量,但static數(shù)據(jù)成員有類作用域,靜態(tài)成員可以是public,private或protected.
?? 靜態(tài)數(shù)據(jù)成員在文件范圍內(nèi)必須進(jìn)行一次初始化。類的public靜態(tài)成員可以通過(guò)類的任何對(duì)象訪問(wèn),也可以用二元作用域分辨符通過(guò)類名進(jìn)行訪問(wèn)。類的private和protected 靜態(tài)成員必須通過(guò)類的public成員函數(shù)或類的友元訪問(wèn)。即使類沒(méi)有對(duì)象,但仍然有靜態(tài)成員。類沒(méi)有對(duì)象時(shí),要想訪問(wèn)public靜態(tài)類成員,只需在成員數(shù)據(jù)名前加上類名和二元作用域分辨符(::).要在類沒(méi)有對(duì)象時(shí)訪問(wèn)private或protected 靜態(tài)類成員,則需要提供一個(gè)public靜態(tài)成員函數(shù),并在調(diào)用函數(shù)時(shí)在函數(shù)名前面加上類名和二元作用域分辨符。
#File Test.h
#ifndef TEST_H
#define TEST_H
class Test
{
?? public:
???????? Test( const char * , const char * );
???????? ~Test();
???????? const char *GetFstString() const;
???????? const char *GetLstString() const;
???????? static int GetCount();
? private:
???????? char * strFst;
???????? char * strLst;
???????? static int count;?
};
#endif
---------------------------------------------------------------------------------
#File Test.cpp
#include <iostream>
using std::cout;
using std::endl;
#include <cstring>
#include <cassert>
#include "Test.h"
int Test::count = 0;
int Test::GetCount() { return count ; }
Test::Test( const char * sFst, const char * sLst )
{
?? strFst = new char[ strlen( sFst ) + 1 ];
?? assert( strFst != 0 );
?? strcpy( strFst, sFst );
?
?? strLst = new char[ strlen( sLst ) + 1 ];
?? assert( strLst != 0 );
?? strcpy( strLst, sLst );?
?? count++; // inc static count
?? cout << " Test cons for " << strFst
??????? << "? " << strLst << " called. " << endl;
}
?
Test::~Test()
{
?? cout << " ~Test() called for " << strFst
??????? << " " << strLst << endl;
?? delete [] strFst;
?? delete [] strLst;
?? count--;
}
const char * Test::GetFstString() const
{
??? return strFst;
}
const char * Test::GetLstString() const
{
??? return strLst;
}
--------------------------------------------------------------------------------
#File: main.cpp
#include <iostream>
using std::cout;
using std::endl;
#include "Test.h"
int main()
{
?? cout << "before cons is "
??????? << Test::GetCount() << endl; // use class name
?? Test *pTest1 = new Test( "FstTest1", "LstTest1" );
?? Test *pTest2 = new Test( "FstTest2", "LstTest2" );
?? cout << "after cons is "
??????? << pTest1->GetCount();? //using instan
?? cout << "\n\nTest1: "
??????? << pTest1->GetFstString()
??????? << " " << pTest1->GetLstString()
??????? << "\nTest2:"
??????? << pTest2->GetFstString()
??????? << " " << pTest2->GetLstString() << "\n\n" << endl;
?? delete pTest1;
?? pTest1 = 0;
?? delete pTest2;
?? pTest2 = 0;
?? cout << "num after deletion is "
??????? << Test::GetCount() << endl;
?? return 0;
??????
}
-------------------------------------------------------------------------------------------
Result:
before cons is 0
?Test cons for FstTest1? LstTest1 called.
?Test cons for FstTest2? LstTest2 called.
after cons is 2
Test1: FstTest1 LstTest1
Test2:FstTest2 LstTest2
?~Test() called for FstTest1 LstTest1
?~Test() called for FstTest2 LstTest2
num after deletion is 0
?? Test類在沒(méi)有對(duì)象時(shí),仍然可以引用count成員,但是只能通過(guò)調(diào)用靜態(tài)成員函數(shù)GetCount()完成.
?? 沒(méi)有實(shí)例化的對(duì)象,一定是用類名調(diào)用Test::GetCount(),如果有實(shí)例化的對(duì)象,則可以用pTest1->GetCount()
調(diào)用。我們公司明確規(guī)定,所有靜態(tài)成員函數(shù)只能調(diào)用類名句柄,不能調(diào)用對(duì)象句柄,我覺(jué)得這樣很好。
?? 還有一點(diǎn),如果成員函數(shù)不訪問(wèn)非靜態(tài)數(shù)據(jù)成員和成員函數(shù),可以將成員函數(shù)聲明為靜態(tài),與非靜態(tài)成員函數(shù)不同的是,靜態(tài)成員函數(shù)沒(méi)有this指針,因?yàn)殪o態(tài)類數(shù)據(jù)成員和成員函數(shù)是獨(dú)立于類對(duì)象而存才的。
?
?? 關(guān)于斷言(assert) , assert類宏在cassert頭文件中定義。用于測(cè)試條件值,注意assert不運(yùn)行任何析構(gòu)函數(shù)即可中止程序執(zhí)行. assert不一定要在調(diào)試完成后刪除,只需在程序文件開(kāi)頭(通常可以在編譯器選項(xiàng)中指定)插入語(yǔ)句
#define NDEBUG