2009-10-28 4 views

답변

-1

null 포인터를 통해 정적 메서드를 호출 할 수도 있습니다.

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

정적 함수의 클래스 만 사용 정책입니다 : 아래 코드는 작동하지만 다른 한편으로

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 포인터는 멤버에 액세스 할 때 역 참조됩니다. 정적 함수는 멤버에 액세스하지 않으며 멤버가 없습니다. 비 가상 메소드조차도 예외없이 null 포인터를 통해 호출 될 수 있습니다. 회원에게 액세스 할 때만 충돌합니다. 이상한 버그를 찾기 위해서는 누구든지이 사실을 알고 받아 들여야합니다. –

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

그것을 :) 사용하지 마십시오, 그것은을 위해 무엇을 네임 스페이스의 수업.