2010-02-18 60 views
7

我有一個關於靜態和非靜態函數和變量的問題。非靜態與靜態函數和變量

1)非靜態函數訪問靜態變量。

沒關係!

class Bar 
{ 
public: 

    static int i; 

    void nonStaticFunction() { 

     Bar::i = 10; 

    } 

}; 

int Bar::i=0; 

2)非靜態函數訪問非靜態變量

絕對OK!

3)靜態函數訪問靜態變量&功能可按

絕對OK!

4)靜態函數訪問非靜態函數

這是確定的

class Bar 
{ 
public: 
    static void staticFunction(const Bar & bar) 
    { 
     bar.memberFunction(); 

    } 

    void memberFunction() const 
    { 

    } 

} 

5)靜態函數訪問非靜態變量

這是確定的還是不正常?我對此感到困惑!

怎麼樣這個例子

class Bar 
{ 
public: 
    static void staticFunction(Bar & bar) 
    { 
     bar.memberFunction(); 

    } 

    void memberFunction() 
    { 

     i = 0; 
    } 

    int i; 

}; 

回答

9

靜態函數訪問非靜態變量

這是確定的還是不正常?我對此感到困惑 !

當調用時,靜態函數沒有綁定到類的實例。類實例(對象)將成爲持有「非靜態」變量的實體。因此,從靜態函數中,如果沒有實際傳遞或存儲其他地方的特定實例以進行操作,您將無法訪問它們。

所以是的,你最後一個例子中的代碼是有效的,因爲你在一個實例中傳遞。但是,您不能這樣做:

static void staticFunction() 
{ 
    // error, this function is static, and is therefore 
    // not bound to a specific instance when called 
    i = 5; 


} 
1

這也不行。靜態函數可以在沒有類的實例的情況下訪問,因此無法訪問需要實例確定的信息。例如,你不需要一輛車就能知道它有多少個車輪,一般汽車的藍圖就足夠了(這可能是靜態信息),但是你不知道汽車的顏色是什麼,再參考特定的汽車(該信息需要的對象的特定實例。)

7

靜態意味着它與該類的特定實例無關。靜態方法無法訪問this指針。這就是您需要使用類名稱給他們打電話的原因。

當您調用靜態方法時,甚至可能沒有定義類的任何實例。

非靜態意味着一個實例,並且可能會因不同的實例而有所不同。

所以,基本上,從靜態方法訪問非靜態成員是沒有意義的。

1

爲此,您需要了解什麼是靜態的。

靜態數據成員對於整個類都存在一次,而不是非靜態數據成員,它們在每個類的每個實例中單獨存在。它們將具有類範圍,並且不受類的實例限制。

訪問類的靜態成員,我們使用的格式如下 ::

如果你創建了一個類的10個對象。 假設您可以訪問類的靜態成員中的非靜態變量,當調用靜態函數時,需要更改哪個對象的成員?