2014-06-06 2 views
1

저는 C++을 객체 지향 프로그래밍에 사용하기 시작했고 정적 멤버 변수를 발견했습니다. 중요하지만, 어떤 예처럼 유효하지 않는 것이 정말정적 멤버 변수

private: 
    const static string DEFAULT_PATH; 
    static string path; 

: 내 특정 경우

, 나는 내 헤더 파일 (Class.hpp)에 다음있다.

그래서 적절한 초기화 작업을 수행하려면 클래스 바디에서 수행 할 수없고 소스 (Class.cpp) 파일에서 수행해야한다는 것을 알아야합니다. 내 소스 파일에 다음을 추가했습니다.

const string Class::DEFAULT_PATH = "./"; 
string Class::path = DEFAULT_PATH; 

나는 직관력이 떨어지지 만 처리하려했습니다. 그럼 궁금 해서요 :

  • 언제 컴파일러가이 초기화 코드를 호출 했습니까? 이 필드에 언제 값이 있다고 가정 할 수 있습니까? 나는 그곳에서 일어나는 일을 정말로 이해하지 못하고 알고 싶습니다.

  • 내게 가장 흥미로운 점은 class.hpp를 포함 할 때 어떤 기호가 Class.cpp에서 볼 수 있습니까? 그리고 왜 그 선언문이 계급 체외와 다른 파일에 있는가?

+0

'main' 전에 초기화됩니다. 그 전에 어떤 명령도 세지 마십시오. 그리고 * 정의 *는 .cpp에 들어가야 당신이 One Definition Rule을 위반하지 않아야합니다. – chris

+0

컴파일러는 .cpp 파일을보고.을 포함하는 파일은 .h 파일 내용이있는 .cpp 파일의 선행 처리기로 대체됩니다. – 101010

+0

가능한 복제본 : http://stackoverflow.com/q/1421671/1227469 – JBentley

답변

3
  • 정적 멤버는 메인 시작하기 전에 초기화됩니다, 그래서 그들은 이미 주에 초기화됩니다. 클래스의 정적 멤버가 아닌 멤버는 생성자에서 초기화됩니다.
  • 하나의 변수가 다른 변수를 참조하기 때문에 초기화 순서를 적용하려면 함수를 사용하여 C++ static initialization order 함수를 초기화하십시오.
  • boost :: call_once (또는 해당 C++ 11 상당)가 도움이 될 수 있습니다. http://www.boost.org/doc/libs/1_31_0/libs/thread/doc/once.html
  • 표준은 클래스 정의 외부 어딘가에 initalized되어야한다, 그래서 일반적으로 당신은 CPP 파일에 그것을 할 수 있음을 알려줍니다
  • 이것은 당신이 클래스 :: static_member와 변수에 액세스 할 수 있습니다 완료되면