2013-10-07 46 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; 
} 

接受静态成员数据和函数的地址没有任何错误。正如你所看到的,这个类永远不会被实例化。