C ++的指向成员的功能很有趣且功能强大,但我想知道它是否应该仅限于类的实例化对象,或者是否可以指向静态成员?对于静态或非静态使用该功能,用例对我来说并不明显,尽管它看起来非常有趣。
答案 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;
}
获取静态成员数据和函数的地址没有错。正如您所看到的,该类永远不会在任何时候被实例化。