-1

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

4

2 回答 2

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

指向非静态成员的指针是“特殊的”,因为它们需要一个类实例来取消引用一个值。它们可以被认为是“类实例中成员的偏移量”(不过,这非常粗略,不能应用于方法指针!)。

相比之下,静态成员实际上很像命名空间的全局变量,可能具有受限的可见性。它们具有独立于类实例的静态内存地址——所有实例共享一个静态成员。

于 2013-10-07T11:35:32.237 回答
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;
}

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

于 2013-10-07T11:36:45.637 回答