문제

내장 유형 배열은 초기화되는 반면 UDT 배열은 기본적으로 초기화된다는 것이 확실합니다.

int foo[5]; // will contain junk
Foo foo[5]; // will contain 5 Foo objects that are default initialized

이는 배열이 스택에 할당되었는지 힙에 할당되었는지에 관계없이 발생합니다.

그러나 이에 대한 권위 있는 출처를 찾기가 어렵습니다.Bjarne은 다음과 같이 말합니다.

"배열과 구조체의 멤버는 배열이나 구조체가 정적인지 여부에 따라 기본적으로 초기화되거나 초기화되지 않습니다." 이것은 실제로 나에게 너무 많은 것을 알려주지 않습니다.

나는 또한 표준에서 뭔가를 찾으려고 노력했지만 지금까지는 아무 소용이 없었습니다.

위 내용을 확인할 수 있는 권위 있는 출처를 아는 사람이 있나요?

도움이 되었습니까?

해결책

ISO C++03은 다음과 같이 권위가 있습니다.

POD-struct는 비POD-struct, 비POD-union(또는 그러한 유형의 배열) 또는 참조 유형의 비정적 데이터 멤버가 없고 사용자 정의 복사 할당 연산자가 없는 집계 클래스입니다. 사용자 정의 소멸자.마찬가지로, POD 공용체는 비POD 구조체, 비POD 공용체(또는 이러한 유형의 배열) 또는 참조 유형의 비정적 데이터 멤버가 없고 사용자 정의 복사 할당 연산자가 없는 집계 공용체입니다. 사용자 정의 소멸자는 없습니다.POD 클래스는 POD-struct 또는 POD-union인 클래스입니다.

산술 형식(3.9.1), 열거형 형식, 포인터 형식, 멤버 형식에 대한 포인터(3.9.2) 및 이러한 형식의 cv 한정 버전(3.9.3)을 총칭하여 스칼라 형식이라고 합니다.스칼라 유형, POD-struct 유형, POD-union 유형(9절), 이러한 유형의 배열 및 이러한 유형의 cv 정규 버전(3.9.3)을 집합적으로 POD 유형이라고 합니다.

T 유형의 객체를 0으로 초기화한다는 것은 다음을 의미합니다.

  • T가 스칼라 유형(3.9)인 경우 객체는 T로 변환된 0(영) 값으로 설정됩니다.
  • t가 비유니온 클래스 유형인 경우, 각 정적 데이터 멤버와 각 베이스 클래스 하위 객체는 0으로 초기화됩니다;
  • T가 공용체 유형인 경우 객체의 첫 번째 명명된 데이터 멤버는 0으로 초기화됩니다.
  • T가 배열 유형인 경우 각 요소는 0으로 초기화됩니다.
  • T가 참조 유형인 경우 초기화가 수행되지 않습니다.

T 유형의 객체를 기본 초기화한다는 것은 다음을 의미합니다.

  • T가 POD 클래스 유형이 아닌 경우(9절) T의 기본 생성자가 호출됩니다(T에 액세스 가능한 기본 생성자가 없으면 초기화는 잘못된 형식입니다).
  • T가 배열 유형인 경우 각 요소는 기본적으로 초기화됩니다.
  • 그렇지 않으면 개체가 0으로 초기화됩니다.

T 유형의 객체를 값 초기화한다는 것은 다음을 의미합니다.

  • T가 사용자 선언 생성자(12.1)가 있는 클래스 유형(9절)인 경우 T의 기본 생성자가 호출됩니다(T에 액세스 가능한 기본 생성자가 없으면 초기화는 잘못된 형식입니다).
  • T가 사용자 선언 생성자가 없는 비공용체 클래스 유형인 경우 T의 모든 비정적 데이터 멤버와 기본 클래스 구성 요소는 값으로 초기화됩니다.
  • T가 배열 유형이면 각 요소는 값으로 초기화됩니다.
  • 그렇지 않으면 객체가 0으로 초기화됩니다.

정적 저장 기간의 모든 개체는 다른 초기화가 발생하기 전에 프로그램 시작 시 0으로 초기화되어야 합니다.[메모:어떤 경우에는 나중에 추가 초기화가 수행됩니다.]

초기화가 빈 괄호 세트(예: ())인 개체는 값으로 초기화됩니다.

객체에 대해 초기화 프로그램이 지정되지 않고 객체가 POD가 아닌 클래스 유형(또는 그 배열)인 경우(cv 한정 가능) 객체는 기본적으로 초기화됩니다.객체가 const 한정 유형인 경우 기본 클래스 유형에는 사용자가 선언한 기본 생성자가 있습니다.그렇지 않고 비정적 개체에 대해 초기화 프로그램이 지정되지 않은 경우 개체와 해당 하위 개체(있는 경우)는 불확실한 초기 값을 갖습니다.객체 또는 해당 하위 객체 중 하나라도 const 한정 유형이면 프로그램의 형식이 잘못되었습니다.

귀하의 예를 들어, int 확실히 POD 유형이므로(산술 유형) 유형의 로컬 또는 필드입니다. int, 초기화 프로그램이 없으면 불확실한 값을 갖게 됩니다.을 위한 Foo, 이는 정의 방법에 따라 다릅니다. 대략적으로 말하면 생성자가 없고 모든 멤버가 POD 유형인 경우 자체가 POD 유형이며 초기화도 수행되지 않습니다.그렇지 않으면 기본 생성자가 호출됩니다.그렇다고 해도 그런 뜻은 아니다 회원 초기화됨 - 규칙은 재귀적이므로 해당 유형의 생성자가 (초기화 프로그램 목록에서) 특별히 수행하지 않는 한 POD가 아닌 유형의 POD 멤버는 초기화되지 않습니다.

정적 변수와 필드는 모든 경우에 0으로 초기화됩니다.이는 POD가 아닌 경우에도 적용됩니다. 즉, 클래스 유형의 정적 변수는 모든 필드를 다음과 같이 재귀적으로 설정해야 합니다. (T)0 생성자가 실행되기 전에도 마찬가지입니다.

집계 POD 유형을 기본 초기화하는 편리한 방법은 다음을 사용하는 것입니다. {} 초기화 프로그램에서 - 배열뿐만 아니라 구조체에서도 작동한다는 점에 유의하세요.

char s[10] = {}; // all elements default-initialized
Foo foo = {};    // all fields recursively default-initialized

다른 팁

8.5.9의 C ++ 표준에서 :

객체에 이니셜 라이저가 지정되지 않고 객체가 (CV-qualified) 비 POD 클래스 유형 (또는 그 배열) 인 경우, 객체는 기본적으로 이니셜 화해야합니다. 객체가 const- 자격 유형 인 경우, 기본 클래스 유형에는 사용자가 고추 된 기본 생성자가 있어야합니다. 그렇지 않으면, 비 정적 객체에 대해 이니셜 라이저가 지정되지 않은 경우, 객체 및 하위 목체는 불확실한 초기 값을 갖는다.

"배열 및 구조의 구성원은 기본적으로 초기화되었는지 또는 배열 또는 구조가 정적인지 여부에 따라 다르지 않습니다."

이것은 명확 할 수 있지만 권위있는 일입니다.

  • 배열 및 구조는 다음과 같이 선언되었습니다 static 0으로 초기화됩니다.
  • 내장 유형의 로컬 어레이 및 구조 ( 생성자가없는 유형)은 초기화되지 않습니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top