类中的C++静态成员

问题描述:

在没有首先创建该类的实例的情况下,是否可以访问并使用类中的静态成员?即对待班级为某种对全局类中的C++静态成员

倾倒场詹姆斯

您还可以通过空指针调用静态方法。下面的代码将工作,但请不要使用它:)

struct Foo 
{ 
    static int boo() { return 2; } 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    Foo* pFoo = NULL; 
    int b = pFoo->boo(); // b will now have the value 2 
    return 0; 
} 
+1

从技术上讲,这是未定义的行为。出于任何原因你不能引用空指针。你可以用空指针做的唯一的事情是:a)为它指定另一个指针,并且b)将它与另一个指针进行比较。 – KeithB 2009-11-30 16:43:36

+0

在访问成员的情况下,该/ pFoo指针将取消引用。静态函数不访问成员,也没有成员。即使非虚拟方法也可以毫无例外地通过空指针来调用。他们只在访问成员时崩溃。任何人都应该知道并接受这个以寻找一些奇怪的错误。 – 2012-03-28 07:48:11

是的:

class mytoolbox 
{ 
public: 
    static void fun1() 
    { 
    // 
    } 

    static void fun2() 
    { 
    // 
    } 
    static int number = 0; 
}; 
... 
int main() 
{ 
    mytoolbox::fun1(); 
    mytoolbox::number = 3; 
    ... 
} 

是的,这恰恰意味着什么static类成员:

struct Foo { 
    static int x; 
}; 

int Foo::x; 

int main() { 
    Foo::x = 123; 
} 
+0

此外,请参阅http://www.acm.org/crossroads/xrds2-4/ovp.html#SECTION00040000000000000000以获取有关C++中静态数据的有趣阅读。 – 2009-10-28 21:52:27

在简而言之,是的。

只要将一个静态成员调用到任意位置,只需将该类名称视为一个名称空间即可。

class Something 
{ 
    static int a; 
}; 

// Somewhere in the code 
cout << Something::a; 
+0

只能在语法上下文中将类名称视为命名空间,而不能以任何其他方式处理。 – 2009-10-28 21:47:52

在另一方面,这就是命名空间是为:

namespace toolbox 
{ 
    void fun1(); 
    void fun2(); 
} 

的静态函数的类的唯一用途是用于政策类。