language_value_initialization
language_value_initialization (값 초기화)
빈 초기화자(empty initializer)로 객체를 생성할 때 수행되는 초기화예요. 대부분의 경우 객체를 0으로 초기화한 뒤, 클래스 타입이면 생성자를 호출해요.
출처: cppreference
본문
문법
T () // (1)
new T () // (2)
Class::Class(...) : member () { } // (3)
T object {}; // (4) since C++11
T {} // (5) since C++11
new T {} // (6) since C++11
Class::Class(...) : member {} { } // (7) since C++11
설명
값 초기화는 다음 상황에서 수행돼요.
- 1,5) 이름 없는 임시 객체를 빈 괄호 또는 빈 중괄호(C++11) 초기화자로 만들 때.
- 2,6) 동적 저장 기간 객체를 빈 괄호 또는 빈 중괄호(C++11) 초기화자가 있는
new표현식으로 만들 때. - 3,7) 비-정적 데이터 멤버 또는 기반 클래스를 빈 괄호 또는 빈 중괄호(C++11) 멤버 초기화자로 초기화할 때.
-
- 이름 있는 객체(자동·정적·스레드-로컬)를 중괄호 한 쌍의 초기화자로 선언할 때.
모든 경우에, 빈 중괄호 {}를 쓰고 T가 애그리게이트 타입이면 애그리게이트 초기화가 수행돼요. 그 외의 값 초기화 효과는 다음과 같아요.
T가 (cv-한정된) 클래스 타입이고 기본 생성자가 명시적으로 정의됐거나 사용자 제공이라면, 그 객체가 기본 초기화되고 기본 생성자가 호출돼요. (이때 멤버는 0 초기화되지 않아요.)T가 (cv-한정된) 클래스 타입이고 기본 생성자가 defaulted라면, 객체는 0으로 초기화된 다음 기본 생성자가 호출돼요.T가 배열 타입이면 각 요소가 값 초기화돼요.- 그 외에는 객체가 0으로 초기화돼요.
struct T1 { int mem; }; // 기본 생성자 defaulted
struct T2 { int mem; T2() {} }; // 사용자 제공 기본 생성자
T1 t1{}; // t1.mem == 0 (0 초기화 후 defaulted 생성자)
T2 t2{}; // t2.mem 은 초기화되지 않음
int x{}; // x == 0
값 초기화는 빈 중괄호 {}로 안전하게 0 초기화된 값을 얻고 싶을 때 유용해요. 사용자 제공 기본 생성자가 있으면 멤버 초기화 규칙이 달라진다는 점을 주의해야 해요.