指向成员的指针对静态成员有意义吗?

时间:2013-10-07 11:27:27

标签: c++

C ++的指向成员的功能很有趣且功能强大,但我想知道它是否应该仅限于类的实例化对象,或者是否可以指向静态成员?对于静态或非静态使用该功能,用例对我来说并不明显,尽管它看起来非常有趣。

2 个答案:

答案 0 :(得分: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 :(得分: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;
}

获取静态成员数据和函数的地址没有错。正如您所看到的,该类永远不会在任何时候被实例化。