2013-10-07 65 views
-2

C++的指針成員特性非常有趣且功能強大,但是我想知道它是或僅應該僅限於類的實例化對象,還是可以指向靜態成員?用例對靜態或非靜態使用該特性並不明顯,儘管它看起來很有趣。指針到成員是否對靜態成員有意義?

+1

由於靜態成員不是依賴於對象的,它們就像常規變量一樣。 –

+3

您無法從靜態成員創建指向成員的指針。 – Simple

回答

1

靜態指針實際上是「正常」指針,例如,

class MyClass 
{ 
    public: 

    static int x; 

    static int f(int a) 
    { 
     return a+1; 
    } 

}; 

// ... 

int* pint = &MyClass::x; // pointer to static property 
int (*pfunc)(int) = &MyClass::f; // pointer to static method 

指向非靜態成員的指針是「特殊的」,因爲它們需要一個類實例來取消引用值。它們可以是,認爲是「在類實例內成員的偏移量」(這很粗糙,但不能應用於方法指針!)。

相比之下,靜態成員實際上非常像命名空間的全局變量,可能具有受限制的可見性。它們具有靜態內存地址,這些地址與類實例無關 - 所有實例共享一個靜態成員。

1

以下是合法的C++ 11代碼。

struct X 
{ 
    static void f() {} 
    static int i; 

    X() = delete; 
}; 

typedef void(*funcPtr)(); 

int main() 
{ 
    funcPtr g = &X::f; 
    int * j = &X::i; 
} 

接受靜態成員數據和函數的地址沒有任何錯誤。正如你所看到的,這個類永遠不會被實例化。