2012-09-11 2 views
0

솔직히 말해서 묻고 싶은 몇 가지 질문이 있지만 질문을 하나만 사용합니다.정적 함수와 정적 포인터의 차이점은 무엇입니까

정적 함수는 외부에서 클래스 개체를 만들지 않고도 액세스 할 수 있으므로이 함수는 프로그램 초기화시 만들어진 기본 복사본에있는 것으로 가정합니다. 클래스가 일반적으로 일회용 전용 생성자를 가지고 있고 알려진 메서드 GetInstance이 사용되면 포인터가 가리킬 정적 변수의 주소가 반환됩니다. 문제는 GetInstance 번으로 여러 번 호출 할 수 있지만 포인터가 가리키는 주소가 항상 같은 이유입니다. 왜 이것이 발생하고 두 번째 이유는 무엇이며 그 차이점은 무엇이며 직접 정적 함수입니까? 나는 GetInstance에 대해서 알고있다. "COPY"가 만들어 졌기 때문에 (위의 질문 참조) 함수 StoreBthis 포인터가 있기 때문에 정적 함수에 왜 this이 없는지 알 수 있었기 때문에 storage 벡터에 액세스 할 수있다. 포인터가 생성되지 않으므로?

class store 
{ 
private: 
    store(){}; 
    ~store(){}; 

    std::vector<int>storage; 
public: 

    static void Store(int a); 
    void StoreB(int a); 

    static store* GetInstance() 
    { 
     static store obj; 
     return& obj; 
    } 
}; 

void store::StoreB(int a) 
{ 
    storage.push_back(a); 
} 

void store::Store(int a) 
{ 
    //storage.push_back(a); //can't 

} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    store::Store(2); 
    store::GetInstance()->Store(3 ); 

    store *a = store::GetInstance(); 
    store *b = store::GetInstance(); 

    cout << a << endl //points to the same address 
     << b << endl; //points to the same address 


} 
+1

'GetInstance'는 오직 하나의 객체 만 갖기 위해 사용됩니다. 그 클래스를 구현하는 클래스는 일반적으로 싱글 톤입니다. – chris

답변

3

귀하의 가정에 결함이 있습니다. 정적 함수는 프로그램 초기화시 생성 된 일부 개인 기본 복사본을 사용하지 않습니다. 그들은 단순히 사본을 전혀 사용하지 않습니다. 정적 함수는 실제로 클래스의 정적 멤버 및 중첩 된 유형에 액세스 할 수있는 네임 스페이스가 적용된 함수입니다. this 포인터가 없다고 말하면 올바른 것입니다. 왜냐하면 클래스의 인스턴스가 전혀 없기 때문입니다.

실제로 정적 메서드는 동작을 변경하지 않고 전역 함수로 구현할 수 있습니다. 클래스에서 클래스 이름을 빼고 클래스의 친구로 표시 한 다음 클래스 네임 스페이스 한정자 (예 : store::)를 사용하여 정적 멤버/중첩 유형에 대한 액세스를 한정합니다. 그것은 정적 변수를 사용하고 있기 때문에 항상 같은 포인터를 반환 질문에 대한 GetInstance(),에 관해서는


. 정적 변수는 기본적으로 로컬 범위에서만 볼 수있는 전역 변수입니다. 따라서 동일한 정적 변수에 대한 모든 액세스는 항상 동일한 값을가집니다.

이것은 싱글 톤 패턴이라고합니다.

1

싱글 톤 패턴을 우연히 발견했습니다. 프로그램을 통해 store 클래스의 단일 인스턴스가 허용되며 GetInstance() 메소드를 통해 액세스 할 수 있습니다. static store obj; 개체는 한 번만 초기화되며 GetInstance()을 호출 할 때마다 포인터가 반환됩니다.

왜 사본이 생성되지 않으므로 정적 함수에 this 포인터가없는 이유는 무엇입니까?

클래스의 인스턴스와 연결되어 있지 않기 때문에.

GetInstance를 여러 번 호출 할 수 있지만 포인터가 가리키는 주소가 항상 같은 이유는 무엇입니까?

이미 설명했듯이 동일한 대상입니다.

두 번째, 직접 정적 함수와 그 차이점은 무엇입니까?

직접적인 정적 기능은 없습니다.

1

정적 함수에는 인스턴스 변수에 대한 액세스 권한이 없으므로 this 포인터가 없습니다. 그래서 처음에 정적으로 선언 한 이유가 있습니다 (C++의 정적 함수 인 OO 문헌에서 종종 클래스 함수이라고 함).

다음은 동일한 포인터 GetInstance에서 반환되는 이유에있어서의 내부 변수가 정적 스토리지의 포인터를 저장하는 점이다

static store obj; 

하는 방법의 모든 호출이 동일한 값을 얻는 것을 의미한다.

인스턴스 함수를 호출 할 때 발생하는 복사에 대해서도 잘못된 것입니다. this 포인터는 개체 자체를 가리키므로 storage에 대한 변경 내용은 실제 개체에서 수행됩니다.

3

정적, 구성원 또는 무료 정렬 기능이 생성되지 않습니다. 그들은 모두 프로그램의 일부로 항상 존재합니다. 그들은 객체의 생성과 함께 존재하지 않습니다. 그게 당신의 가장 큰 오해 인 것 같습니다.

관련 문제