靜態成員函數 不能訪問非靜態成員函數

和靜態數據成員一樣,靜態成員函數是類的一部分,而不是對象的一部分如果要在類外調用公用的靜態成員函數,要用類名和域運算符“∷”。如
Box∷volume( );
實際上也允許通過對象名調用靜態成員函數,如
a.volume( );
但這並不意味着此函數是屬於對象a的,而只是用a的類型而已
靜態成員函數的作用是爲了能處理靜態數據成員
可以說,靜態成員函數與非靜態成員函數的根本區別是: 非靜態成員函數有this指針,靜態成員函數並不屬於某一對象,它與任何對象都無關,靜態成員函數沒有this指針。由此決定了靜態成員函數不能訪問本類中的非靜態成員。
在C++程序中,靜態成員函數主要用來訪問靜態數據成員,而不訪問非靜態成員。假如在一個靜態成員函數中有以下語句:
cout<<height<<endl;             //若height已聲明爲static,則引用本類中的靜態成員,合法
cout<<width<<endl;              //若width是非靜態數據成員,不合法


那有需要訪問怎麼辦?一是實例化一個類,比如staticfunc(a.getval)來調用,或者用指針,傳入自己的對象指針。

class A
{
public:
  static void func(A & obj);
  int getval() const; //non-static member function
private:
 int val;
};

靜態成員函數func()會使用參照obj來訪問非靜態成員val。

voidA::func(A & obj)
{
  int n = obj.getval();
}


靜態數據成員和普通數據成員區別較大,體現在下面幾點: 
  (1)普通數據成員屬於類的一個具體的對象,只有對象被創建了,普通數據成員纔會被分配內存。而靜態數據成員屬於整個類,即使沒有任何對象創建,類的靜態數據成員變量也存在。 

  (2)因爲類的靜態數據成員的存在不依賴與於任何類對象的存在,類的靜態數據成員應該在代碼中被顯示的初始化,一定要在類外進行,例如上例。 

  (3)外部訪問類的靜態成員只能通過類名來訪問,例如:test::getCount()。 
  (4)類的靜態成員函數無法直接訪問普通數據成員(可以通過類的指針等作爲參數間接訪問),而類的任何成員函數都可以訪問類的靜態數據成員。 

  (5)靜態成員和類的普通成員一樣,也具有public、protected、private3種訪問級別,也可以具有返回值、const修飾符等參數。

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