2009-10-28 125 views
2

在沒有首先創建該類的實例的情況下,是否可以訪問並使用類中的靜態成員?即對待班級爲某種對全局類中的C++靜態成員

傾倒場詹姆斯

回答

-1

您還可以通過空指針調用靜態方法。下面的代碼將工作,但請不要使用它:)

struct Foo 
{ 
    static int boo() { return 2; } 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    Foo* pFoo = NULL; 
    int b = pFoo->boo(); // b will now have the value 2 
    return 0; 
} 
+1

從技術上講,這是未定義的行爲。出於任何原因你不能引用空指針。你可以用空指針做的唯一的事情是:a)爲它指定另一個指針,並且b)將它與另一個指針進行比較。 – KeithB 2009-11-30 16:43:36

+0

在訪問成員的情況下,該/ pFoo指針將取消引用。靜態函數不訪問成員,也沒有成員。即使非虛擬方法也可以毫無例外地通過空指針來調用。他們只在訪問成員時崩潰。任何人都應該知道並接受這個以尋找一些奇怪的錯誤。 – 2012-03-28 07:48:11

0

是的:

class mytoolbox 
{ 
public: 
    static void fun1() 
    { 
    // 
    } 

    static void fun2() 
    { 
    // 
    } 
    static int number = 0; 
}; 
... 
int main() 
{ 
    mytoolbox::fun1(); 
    mytoolbox::number = 3; 
    ... 
} 
6

是的,這恰恰意味着什麼static類成員:

struct Foo { 
    static int x; 
}; 

int Foo::x; 

int main() { 
    Foo::x = 123; 
} 
+0

此外,請參閱http://www.acm.org/crossroads/xrds2-4/ovp.html#SECTION00040000000000000000以獲取有關C++中靜態數據的有趣閱讀。 – 2009-10-28 21:52:27

2

在簡而言之,是的。

只要將一個靜態成員調用到任意位置,只需將該類名稱視爲一個名稱空間即可。

class Something 
{ 
    static int a; 
}; 

// Somewhere in the code 
cout << Something::a; 
+0

只能在語法上下文中將類名稱視爲命名空間,而不能以任何其他方式處理。 – 2009-10-28 21:47:52

3

在另一方面,這就是命名空間是爲:

namespace toolbox 
{ 
    void fun1(); 
    void fun2(); 
} 

的靜態函數的類的唯一用途是用於政策類。