通關(guān)旅

          softgamer 的痕跡
          posts - 12, comments - 0, trackbacks - 0, articles - 1
          ?? 靜態(tài)數(shù)據(jù)成員很像是全局變量,但static數(shù)據(jù)成員有類作用域,靜態(tài)成員可以是public,private或protected.
          ?? 靜態(tài)數(shù)據(jù)成員在文件范圍內(nèi)必須進(jìn)行一次初始化。類的public靜態(tài)成員可以通過類的任何對(duì)象訪問,也可以用二元作用域分辨符通過類名進(jìn)行訪問。類的private和protected 靜態(tài)成員必須通過類的public成員函數(shù)或類的友元訪問即使類沒有對(duì)象,但仍然有靜態(tài)成員。類沒有對(duì)象時(shí),要想訪問public靜態(tài)類成員,只需在成員數(shù)據(jù)名前加上類名和二元作用域分辨符(::).要在類沒有對(duì)象時(shí)訪問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類在沒有對(duì)象時(shí),仍然可以引用count成員,但是只能通過調(diào)用靜態(tài)成員函數(shù)GetCount()完成.
          ?? 沒有實(shí)例化的對(duì)象,一定是用類名調(diào)用Test::GetCount(),如果有實(shí)例化的對(duì)象,則可以用pTest1->GetCount()
          調(diào)用。我們公司明確規(guī)定,所有靜態(tài)成員函數(shù)只能調(diào)用類名句柄,不能調(diào)用對(duì)象句柄,我覺得這樣很好。


          ?? 還有一點(diǎn),如果成員函數(shù)不訪問非靜態(tài)數(shù)據(jù)成員和成員函數(shù),可以將成員函數(shù)聲明為靜態(tài),與非靜態(tài)成員函數(shù)不同的是,靜態(tài)成員函數(shù)沒有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)試完成后刪除,只需在程序文件開頭(通常可以在編譯器選項(xiàng)中指定)插入語句
          #define NDEBUG


          主站蜘蛛池模板: 渝中区| 惠水县| 古田县| 渭源县| 循化| 五莲县| 辽源市| 莒南县| 长白| 海兴县| 沁阳市| 马龙县| 且末县| 景谷| 长白| 新巴尔虎右旗| 永昌县| 锡林浩特市| 杭锦后旗| 莒南县| 繁峙县| 通州区| 同心县| 五莲县| 平湖市| 嘉黎县| 平度市| 磐石市| 华坪县| 泰来县| 张家界市| 巴林左旗| 云龙县| 湾仔区| 龙岩市| 云安县| 冕宁县| 昆明市| 城固县| 麻江县| 丹寨县|