2012-12-13 3 views
0
#include "B.h" 

class A 
{ 
    public : 
     A() 
     { 
      s_b = new B(); 
      b = new B(); 
     } 

     static B *s_b; 

     B *b; 
}; 



#include<iostream> 

using namespace std; 

#include "A.h" 

int main() 
{ 
    cout<<"hello"; 
} 

위의 정적 객체를 본 적이 있습니다. 그러나 그것의 정확한 사용법과 일반적인 대상과 다른 점을 알 수는 없습니다. b가 수행하지 못하는 s_b로 할 수있는 것을 알아내는 데 도움을주십시오.클래스에서 정적 객체의 중요성과 일반 객체와 다른 점

+2

코드가 컴파일되지 않습니다. – Gorpik

+0

거기에'new'가 필요 없습니다. –

+0

@ Gorpik : 이것은 단지 의사 코드입니다. – Kenta

답변

3

s_b은 생성 된 A의 각 인스턴스에 대해 메모리를 차지하지 않지만 b은 발생합니다. sizeof(A)b으로 증가하지만 s_b은 증가하지 않습니다.

static은 클래스의 모든 인스턴스간에 공유되므로 전역처럼 작동합니다. 액세스 할 객체가 필요하지 않으므로 직접 A::s_b을 사용할 수 있습니다.

2

정적 멤버와 네임 스페이스 범위에서 정의 된 개체 또는 함수 간의 유일한 차이점은 액세스입니다. 정적 데이터 멤버는 private 일 수 있습니다.이 경우 클래스 외부에서 액세스 할 수 없습니다. 정적 함수 멤버는 네임 스페이스 범위에서 함수가 할 수없는 개인 데이터 멤버에 액세스 할 수 있습니다.

액세스 구문도 다릅니다. 클래스 외부에있는 경우 ClassName::memberName (또는 classInstance.memberName)을 사용하여 멤버에 액세스해야합니다. 그렇지 않으면 액세스 할 수있는 using이 없습니다.

1

일반적으로 정적 멤버는 C++ 11을 사용하지 않는 경우 상수 int 유형을 제외한 클래스 선언 외부에서 초기화해야합니다.

위에 게시 된 코드에 결함이 있습니다.

A::s_b = B(); 

외부 클래스 A {...}와 (과) 같은 성명이 필요합니다. 비 정적 생성자 내에서 정적 멤버를 초기화하려면 생성자가 객체를 생성하는 데 사용되지만 정적 멤버 은 객체에 속하지 않지만 클래스에 속하기 때문에 잘못되었습니다. 따라서 이러한 정적 멤버는 정적 멤버 함수를 통해 수정할 수 없습니다.

"클래스"를 "인간"으로, 해당 클래스의 객체를 "존 스미스"와 같은 특정인으로 생각하십시오. 필드가 있다면 "급여"입니다. 각 사람마다 다른 급여가 있으므로 비 정적 필드 여야합니다. 그러나 필드가있는 경우 "total_population"이 정적 멤버 여야합니다.이 필드는 의미 적으로 특정 사람에게 속하지 않고 전체 "인간"에 속하기 때문입니다.

+0

예. 알겠습니다. 나는 cpp 파일 안에 다음과 같이 s_b를 초기화해야한다. B * A :: s_b = NULL; 이 정적 객체의 필요성을 설명해 주시겠습니까? – Kenta

+1

글쎄, 당신은 클래스 A를 썼다. 우리는 그것이 무엇인지를 어떻게 말할 수 있습니까? A의 모든 인스턴스에는 고유 한 b가 있습니다. 그러나 그들은 모두 같은 s_b를 공유합니다. – TheMathemagician

+0

소멸자 내에서이 정적 객체를 삭제해도 괜찮습니까? 많은 개체가이 정적 개체를 공유 할 수 있기 때문에 정적 개체는 하나의 공통 메모리를 공유하므로 따라서 drestructor가 많은 시간 동안 호출 될 때 정적 객체는 여러 번 삭제되어 어설 션 오류가 발생합니다. 잘못하면 올바른지 확인하십시오. – Kenta

관련 문제