문제

테스트 ::라는 클래스가있는 경우

class Test
{
    static std::vector<int> staticVector;
};

언제 정적 벡터 건설되고 언제 파괴됩니까?

테스트 클래스의 첫 번째 객체의 인스턴스화가 있거나 일반 정적 변수와 같습니다.

명확히하기 위해,이 질문은 프로그래밍 언어의 개념을 읽은 후 (Sebesta CH-5.4.3.1), 다음과 같이 말합니다.

때에 주목하십시오 공전 수정자는 C ++, Java 및 C#의 클래스 정의에서 변수 선언에 나타납니다. 변수의 수명과는 아무런 관련이 없습니다. 이러한 맥락에서 변수가 인스턴스 변수가 아닌 클래스 변수임을 의미합니다. 예약 된 단어를 여러 번 사용하면 특히 언어를 배우는 사람들에게 혼란 스러울 수 있습니다.

당신이 이해 한? :(

도움이 되었습니까?

해결책

일반 정적 (글로벌) 변수와 정확히 같습니다.

다른 팁

나는 Initializaton에 대한 텍스트를 쓰고 싶습니다. 나중에 링크 할 수 있습니다.


먼저 가능성 목록.

  • 네임 스페이스 공전
  • 수업 공전
  • 현지의 공전

네임 스페이스 정적

  • 두 가지 초기화 방법이 있습니다. 공전 (컴파일 시간에 발생하기위한 것) 및 동적 (런타임에 발생하도록 의도) 초기화.
  • 공전 초기화 전에 발생합니다 번역 단위 관계를 무시하고 동적 초기화.
  • 동적 초기화는 번역 단위로 주문되지만 정적 초기화에는 특정 순서가 없습니다. 동일한 번역 장치의 네임 스페이스 범위의 객체는 정의가 나타나는 순서로 동적으로 초기화됩니다.
  • 상수 표현식으로 초기화 된 POD 유형 객체는 정적으로 초기화됩니다. 그들의 값은 모든 객체의 동적 초기화에 의해 의존 할 수 있으며, 번역 장치 관계를 무시합니다.
  • 초기화가 예외를 던지면 std::terminate 호출됩니다.

예 :

다음 프로그램은 인쇄합니다 A(1) A(2)

struct A { 
  A(int n) { std::printf(" A(%d) ", n); } 
};

A a(1);
A b(2);

그리고 같은 클래스를 기반으로 다음은 인쇄합니다. A(2) A(1)

extern A a;
A b(2);
A a(1);

번역 장치가있는 척하자 msg 다음으로 정의됩니다

char const *msg = "abc";

그런 다음 다음 지문 abc. 주목하십시오 p 동적 초기화를받습니다. 그러나 정적 초기화 때문에 (char const* 포드 유형입니다 "abc" 주소 상수 표현)의 msg 그 전에 발생하면 괜찮습니다 msg 올바르게 초기화되도록 보장됩니다.

extern const char *msg;
struct P { P() { std::printf("%s", msg); } };
P p;
  • 동적 객체의 초기화는 모든 비용으로 메인 전에 발생할 필요가 없습니다. 그러나 초기화는 번역 장치의 객체 또는 함수를 처음 사용하기 전에 발생해야합니다. 이것은 동적로드 가능한 라이브러리에 중요합니다.

클래스 정적

  • 네임 스페이스 정적으로 행동합니다.
  • 컴파일러가 번역 장치 (메인 이후)의 기능 또는 객체의 첫 번째 사용에서 클래스 정적을 초기화 할 수 있는지 여부에 대한 버그 보고서가 있습니다. 표준의 문구는 현재 네임 스페이스 범위 객체에 대해서만 허용하지만 클래스 스코프 객체에 대해서도이를 허용하는 것 같습니다. 읽다 네임 스페이스 범위의 객체.
  • 템플릿의 구성원 인 클래스 통계의 경우 규칙은 사용 된 경우에만 초기화된다는 것입니다. 그것들을 사용하지 않으면 초기화에 도움이되지 않습니다. 어쨌든 초기화는 위에서 설명한 것처럼 발생합니다. 템플릿의 구성원이기 때문에 초기화는 지연되지 않습니다.

로컬 정적

  • 현지 정적의 경우 특별 규칙이 이루어집니다.
  • 일정한 표현식으로 초기화 된 포드 유형 객체는 정의 된 블록이 입력되기 전에 초기화됩니다.
  • 다른 로컬 정적 객체는 처음으로 제어가 정의를 통과하는 초기화됩니다. 초기화는 예외가 발생할 때 완료되는 것으로 간주되지 않습니다. 초기화는 다음에 다시 시도됩니다.

예 : 다음 프로그램 인쇄 0 1:

struct C { 
  C(int n) { 
    if(n == 0)
      throw n;
    this->n = n;
  }
  int n;
};

int f(int n) {
  static C c(n);
  return c.n;
}

int main() {
  try { 
    f(0); 
  } catch(int n) { 
    std::cout << n << " "; 
  }
  f(1); // initializes successfully
  std::cout << f(2);  
}

위의 모든 경우, 특정 제한된 경우에서 정적으로 초기화 할 필요가없는 일부 객체의 경우 컴파일러는 동적으로 초기화하는 대신 정적으로 초기화 할 수 있습니다. 이것은 까다로운 문제입니다 이 답변 더 자세한 예를 위해.

또한 파괴 순서는 물체의 구성 완료의 정확한 순서입니다. 이것은 일반적이며 C ++의 모든 상황에서 발생합니다.

전 세계 변수가 글로벌과 함께 구성되고 파괴되는 동시에 건설됩니다.

단순히 말하기 :
정적 멤버 변수는 글로벌 변수가 구성 될 때 구성됩니다. 글로벌 변수의 구성 순서는 정의되지 않지만 주 기능이 입력되기 전에 발생합니다.

전 세계 변수가 파괴 될 때 파괴가 발생합니다.

글로벌 변수는 그들이 건설 된 역 순서로 파괴됩니다. 주요 기능을 종료 한 후.

문안 인사,
난소

추신 : C ++-표준을 살펴 보는 것이 좋습니다.이 표준은 글로벌 또는 정적 멤버 변수가 어떻게 구성되거나 언제 파괴 될지 설명합니다.

PPS : 코드는 정적 멤버 변수 만 선언하지만 초기화되지는 않습니다. 초기화하려면 편집 장치 중 하나로 작성해야합니다.

STD :: 벡터 테스트 :: staticVector;
또는
std :: 벡터 test :: staticvector = std :: 벡터 (/ * ctor params here */);

당신이 사용하는 것과 같은 경우의 특정 VC ++ 정보는 다음과 같습니다.

  1. 정적 클래스 변수 구성은 다른 정적/글로벌 변수와 동시에 발생합니다.
  2. Windows에서 CRT 스타트 업 기능은이 구성을 담당합니다. 이것은 당신이 컴파일하는 대부분의 프로그램의 실제 진입 점입니다 (main/winmain 함수라고하는 함수). 또한 전체 C 런타임 지원을 초기화 할 책임이 있습니다 (예 : Malloc을 사용해야 함).
  3. 건설 순서는 정의되지 않았지만 Microsoft VC 컴파일러를 사용할 때 기본 유형의 건설 순서는 괜찮습니다. 예를 들어, 작성하는 것이 합법적이고 안전합니다.

Statics.h : ... MyClass 선언 ... 정적 const in a; 정적 int b; 정적 int ar []; } statics.cpp :

const int MyClass::a = 2;
int MyClass::b = a+3;
int MyClass::ar[a] = {1,2}

정적 클래스 멤버 변수는 동일한 클래스의 여러 객체가 있더라도 클래스의 모든 객체에 대해 변수가 동일합니다.

그래서, 나는 첫 번째 물체가 인스턴스화되고 마지막 물체가 내려갈 때 인스턴스화되고 파괴 될 때 구성됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top