2009-10-28 4 views
2

Возможно ли доступ к доступу и использование статических членов в классе без предварительного создания экземпляра этого класса? Т.е. рассматривать класс как своего рода свалки для глобаловСтатические элементы C++ в классе

Джеймс

ответ

-1

Вы также можете вызвать статический метод с помощью нулевого указателя. Приведенный ниже код будет работать, но, пожалуйста, не используйте его :)

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

+0

Указатель/pFoo будет разыменован в случае доступа к члену. статическая функция не имеет доступа к элементам и нет членов. Даже не виртуальные методы могут быть вызваны с помощью нулевого указателя без исключения. они вылетают только при доступе к членам. Любой должен знать и принимать это, чтобы найти некоторые странные ошибки. –

0

Да:

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

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

Да, это именно то, что 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++. –

2

В Короче, да.

В течение длительного времени статический член можно назвать где угодно, вы просто рассматриваете имя класса как пространство имен.

class Something 
{ 
    static int a; 
}; 

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

Вы можете рассматривать имя класса как пространство имен только в контексте синтаксиса не любым другим способом. –

3

С другой стороны, это то, что пространства имен для:

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

только использование классов статических функций для политики классы.

Смежные вопросы