2013-10-07 2 views
-2

C++의 포인터 - 투 - 회원 기능은 흥미롭고 강력하지만 클래스의 인스턴스화 된 객체에만 국한되어야하는지, 아니면 정적 멤버를 가리키는 것이 좋은지 궁금합니다. 매우 유익한 것처럼 보일지라도 사용 사례는 정적 또는 정적이 아닌 기능 사용에 대해 나에게 분명하지 않습니다.구성원에 대한 포인터가 정적 구성원에 적합한가?

+1

정적 멤버는 개체 종속적이지 않으므로 일반 변수와 비슷합니다. –

+3

정적 멤버에서 멤버로 포인터를 만들 수 없습니다. – Simple

답변

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

다음은 합법적 인 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; 
} 

정적 멤버 데이터 및 기능에 대한 주소 지정에 대해서는 아무런 문제가 없습니다. 보시다시피 클래스는 언제든지 인스턴스화되지 않습니다.

관련 문제