language_default_initialization
language_default_initialization (기본 초기화)
초기화자가 없는 상태로 객체를 생성할 때 수행되는 초기화예요. 변수 선언이나 new 표현식에서 초기화자를 생략하면 일어나요.
출처: cppreference
본문
문법
T object; // (1)
new T // (2)
설명
기본 초기화는 세 가지 상황에서 수행돼요.
-
- 자동·정적·스레드-로컬 저장 기간을 가진 변수가 초기화자 없이 선언될 때.
-
- 동적 저장 기간을 가진 객체가 초기화자 없는
new-표현식으로 생성될 때.
- 동적 저장 기간을 가진 객체가 초기화자 없는
-
- 기반 클래스나 비-정적 데이터 멤버가 생성자 초기화 목록에서 언급되지 않고 그 생성자가 호출될 때.
기본 초기화의 효과는 다음과 같아요.
T가 (cv-한정된) 비-POD(C++11 이전) 클래스 타입이면, 생성자들을 조사해 빈 인자 목록에 대해 오버로드 해석을 수행해요. 선택된 생성자(기본 생성자 중 하나)가 새 객체의 초기값을 제공하기 위해 호출돼요.T가 배열 타입이면 배열의 모든 요소가 기본 초기화돼요.T가std::meta::info이면 객체는 널 리플렉션 값으로 초기화돼요. (C++26)- 그 외에는 초기화가 수행되지 않아요. (주의 참고)
(C++11 이전) 자동 저장 기간을 가진 (cv-한정된) 비-POD 클래스 타입(또는 그 배열)만 초기화자 없이 기본 초기화된 것으로 간주됐어요. 동적 저장 기간의 스칼라·POD 타입은 초기화되지 않은 것으로 간주됐어요. (C++11부터 이 상황은 기본 초기화의 한 형태로 재분류됐어요.)
const 객체의 기본 초기화
프로그램이 const-한정 타입 T의 객체 기본 초기화를 요구하면, T는 const-default-constructible 타입이어야 해요. 타입 T는 다음이면 const-default-constructible이에요.
T가std::meta::info. (C++26)T가std::nullptr_t. (C++11)T가 클래스 타입이고, (cv-한정된)T에 대해 기본 생성자가 명시적으로=default로 선언된 경우에 const-default-constructible.
기본 초기화에서 스칼라나 POD 타입은 초기화가 수행되지 않으므로, 그 값을 읽는 것은 미정의 동작이 될 수 있다는 점을 주의해야 해요. 클래스 타입은 자신의 기본 생성자가 초기값을 제공해요.