2012-09-11 129 views
0

說實話,我想問一些問題,但只會用到一個問題。靜態函數與類的靜態指針有什麼區別

通過我所見,靜態函數可以在外部訪問,而不需要創建類對象,所以我假設這些函數來自在程序初始化時創建的默認副本。當一個類通常具有單個用法的私有構造函數並且使用已知方法GetInstance時,指針將指向的靜態變量的地址被返回。問題是你可以多次調用GetInstance,但指針指向的地址總是相同的,爲什麼會發生這種情況,其次,它和直接靜態函數有什麼不同?我知道在GetInstance我可以訪問storage載體,因爲創建了一個「COPY」(參考上面的問題),而功能StoreB有一個this指針,這也引發了我的問題,爲什麼靜態函數沒有this指針,因爲沒有創建副本?

class store 
{ 
private: 
    store(){}; 
    ~store(){}; 

    std::vector<int>storage; 
public: 

    static void Store(int a); 
    void StoreB(int a); 

    static store* GetInstance() 
    { 
     static store obj; 
     return& obj; 
    } 
}; 

void store::StoreB(int a) 
{ 
    storage.push_back(a); 
} 

void store::Store(int a) 
{ 
    //storage.push_back(a); //can't 

} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    store::Store(2); 
    store::GetInstance()->Store(3 ); 

    store *a = store::GetInstance(); 
    store *b = store::GetInstance(); 

    cout << a << endl //points to the same address 
     << b << endl; //points to the same address 


} 
+1

'GetInstance'只用於創建一個對象。一個實現它的類通常是一個單例。 – chris

回答

3

您的假設是有缺陷的。靜態函數不使用在程序初始化時創建的一些私有默認副本。他們根本不使用任何副本。靜態函數實際上只是一個名稱空間函數,可以訪問類的靜態成員以及任何嵌套類型。當你說沒有this指針時,你是正確的,因爲沒有任何類的實例。

實際上,您可以將您的靜態方法實現爲全局函數,而不會改變任何行爲。只要將它從類中拉出來,將它標記爲類的朋友,然後使用類名稱空間限定符(例如store::)限定對靜態成員/嵌套類型的任何訪問。


至於問題有關GetInstance(),因爲它使用一個靜態變量,它總是返回相同的指針。靜態變量基本上是全局變量,只能在本地範圍內可見。所以對同一個靜態變量的訪問總是具有相同的值。

這被稱爲單例模式。

1

你已經偶然發現了單身模式。程序允許類store的單個實例,並且可以通過GetInstance()方法訪問。對象static store obj;僅初始化一次,並且每次調用GetInstance()時都會返回一個指向它的指針。

爲什麼靜態函數沒有這個指針,因爲沒有創建副本?

因爲它們沒有與類的實例關聯。

事情是你可以多次調用GetInstance,但指針指向的地址總是相同的,爲什麼會發生這種情況?

已經解釋過,它是同一個對象。

第二,它和直接靜態函數有什麼不同?

有沒有這樣的事情,直接靜態功能。

1

靜態函數沒有this指針,因爲它們無法訪問實例變量。這就是爲什麼你首先聲明它們是靜態的原因(在OO文獻中,C++的靜態函數通常被稱爲類函數)。

相同的指針從GetInstance返回的原因是,在方法內部變量存儲在靜態存儲指針,

static store obj; 

這意味着該方法的所有調用將得到相同的值。

您在調用實例函數時發生複製也是錯誤的。指針this指向對象本身,因此您對storage所做的更改將在實際對象上執行。

3

創建任何類型的靜態,成員或免費函數。作爲該計劃的一部分,它們都始終存在。它們不會隨着對象的創建而出現。這似乎是你最大的誤解。

相關問題