값 및 기본값 및 제로 초기화에 대해 매우 혼란 스럽습니다. 특히 다른 표준 C ++ 03 및 C ++ 11 (및 C ++ 14 ) 을 위해 시작될 때 .
나는 누군가가 도움을 줄 수 있다면 많은 사용자에게 도움이 될 것이므로 더 일반적으로 만들기 위해 Value- / Default- / Zero- Init C ++ 98 및 C ++ 03 정말 좋은 답변을 인용하고 확장하려고 합니다. 언제 어떤 일이 발생하는지에 대한 좋은 개요를 얻기 위해 간격이 필요합니까?
한마디로 예제를 통한 전체 통찰력 :
때로는 new 연산자에 의해 반환 된 메모리가 초기화되고, 때로는 새로 만드는 유형이 POD (일반 이전 데이터) 인지 또는 POD 멤버를 포함하고있는 클래스 인지 여부에 따라 초기화되지 않을 수 있습니다. 컴파일러 생성 기본 생성자.
- 에서 1998 ++ C : 초기화의 2 종류가 있습니다 제로 및 기본 초기화는
- 에서 2003 ++ C 초기화의 제 3 유형의 값을 초기화가 추가되었습니다.
- 에서 C ++ 2011 / C ++ 2014 만 리스트 초기화를 첨가하고 규칙 부가가치 / default- / 제로 초기화가 조금 변경되었습니다.
취하다:
struct A { int m; };
struct B { ~B(); int m; };
struct C { C() : m(){}; ~C(); int m; };
struct D { D(){}; int m; };
struct E { E() = default; int m;}; /** only possible in c++11/14 */
struct F {F(); int m;}; F::F() = default; /** only possible in c++11/14 */
C ++ 98 컴파일러에서 다음이 발생해야합니다 .
new A
-불확실한 값 (A
POD 임)new A()
-제로 초기화new B
-기본 구성 (B::m
초기화되지 않음,B
POD가 아님)new B()
-기본 구성 (B::m
초기화되지 않음)new C
-기본 구성 (C::m
0으로 초기화 됨,C
POD가 아님)new C()
-기본 구성 (C::m
0으로 초기화 됨)new D
-기본 구성 (D::m
초기화되지 않음,D
POD가 아님)new D()
- 기본 구성? (D::m
초기화되지 않음)
C ++ 03 준수 컴파일러에서는 다음과 같이 작동해야합니다.
new A
-불확실한 값 (A
POD 임)new A()
-value-initializeA
, POD이므로 0으로 초기화됩니다.new B
B::m
-default -initializes ( 초기화되지B
않은 상태로두고 POD가 아님)new B()
- 값 초기화합니다B
사용자 정의 반대로 기본 ctor에 이후의 모든 필드를 제로 - 초기화 컴파일러가 생성됩니다.new C
C
-default -initializes , 기본 ctor를 호출합니다. (C::m
0으로 초기화 됨,C
POD가 아님)new C()
-C
기본 ctor를 호출하는 value-initializes . (C::m
0으로 초기화 됨)new D
-기본 구성 (D::m
초기화되지 않음,D
POD가 아님)new D()
- 가치 초기화 D? , 기본 ctor (D::m
초기화되지 않음) 를 호출합니다.
기울임 꼴 값 및? 불확실성이 있습니다.이 문제를 해결하는 데 도움을주세요 :-)
C ++ 11 준수 컴파일러에서는 다음과 같이 작동해야합니다.
??? (여기서 시작하면 어쨌든 잘못 될 것입니다)
C ++ 14 준수 컴파일러에서는 다음과 같이 작동해야합니다. ??? (여기서 시작하면 어쨌든 잘못 될 것입니다.) (답변에 따른 초안)
new A
-기본 초기화A
, 컴파일러 생성. ctor, (A::m
초기화되지 않은 상태) (A
POD 임)new A()
-값 초기화A
, [dcl.init] / 8의 2. 지점 이후 0으로 초기화 됨new B
-기본-초기화B
, 컴파일러 생성. ctor, (B::m
초기화되지 않은 리프 ) (B
is non-POD)new B()
- 값 초기화합니다B
사용자 정의 반대로 기본 ctor에 이후의 모든 필드를 제로 - 초기화 컴파일러가 생성됩니다.new C
C
-default -initializes , 기본 ctor를 호출합니다. (C::m
0으로 초기화 됨,C
POD가 아님)new C()
-C
기본 ctor를 호출하는 value-initializes . (C::m
0으로 초기화 됨)new D
-기본 초기화D
(D::m
초기화되지 않음,D
POD가 아님)new D()
-D
기본 ctor를 호출하는 value-initializes (D::m
초기화되지 않음)new E
-compE
를 호출하는 default-initializes . gen. ctor. (E::m
초기화되지 않음, E는 POD가 아님)new E()
-값-초기화E
, [dcl.init] / 8의E
2 포인트 이후 0으로 초기화 됨 )new F
-compF
를 호출하는 default-initializes . gen. ctor. (F::m
초기화되지 않음,F
POD가 아님)new F()
-value -initializesF
, 1부터 기본값으로 초기화F
됩니다. [dcl.init] / 8에서 지정합니다 (F
ctor 함수는 사용자가 선언하고 첫 번째 선언에서 명시 적으로 기본값이 설정되거나 삭제되지 않은 경우 사용자가 제공합니다. Link )