기본 초기화 (default initalization)
아무것도 하지 않는 초기화.
어떤 초기화도 진행하지 않았을 때 발생한다.
발생 사례 :
T object;
new T;
아무것도 하지 않는 것이 표준이기 때문에,
기본 초기화를 진행한 변수는 쓰레기값을 갖게된다.
발생 사례 해석 :
- 이름 유무에 관계없이 (auto, static, thread-local) 스토리지로 선언되었고,
어떠한 초기화도 사용하지 않은 경우.
복사 초기화 (copy initialization)
다른 오브젝트의 값을 복사하여 초기화.
발생 사례 :
T object = other;
T array[N] = { other };
throw exception and catch
pass arguments when call by value
return expression value as non-reference
발생 사례 해석 :
이름 있는 비참조 변수가 (auto, static, thread-local) 스토리지로 선언되었고,
다른 오브젝트나 리터럴을 이용하여 초기화된 경우.
배열을 aggregate initialization로 초기화 할 때,
각각의 요소를 값으로 초기화하는 단계.
새로운 복사값이 만들어지는 경우.
(1) 익셉션을 던지고 받기.
(2) 비참조로 인자 넘기기.
(3) 비참조를 리턴하는 함수에서 return 표현식.
값 초기화 (value initialization)
기본 생성자를 이용한 초기화.
인자없는 소괄호ㆍ중괄호를 사용했을 때 발생한다.
발생 사례 :
T ( )
new T( )
T object{ };
T { }
new T { }
발생 사례 해석 :
- 이름 없는 변수가 (auto, static, thread-local) 스토리지로 선언되었고,
인자없는 소괄호나 중괄호를 사용한 경우.
직접 초기화 (direct initialization)
기본 생성자가 아닌 생성자를 이용하여 초기화.
단일ㆍ다중인자 소괄호, 단일인자 중괄호를 사용했을 때 발생한다.
다중인자 중괄호는 aggregate initialization 으로 간주된다.
사례 구분 :
인자없는 소괄호 : value initializaiton
인자없는 중괄호 : value initialization
단일인자 소괄호 : direct initialization
단일인자 중괄호 : direct initialization
다중인자 소괄호 : direct initialization
다중인자 중괄호 : aggregate initialization
발생 사례 :
T object ( arg )
T object ( arg1, arg2, ... )
T object { arg }
T ( arg )
T ( arg1, arg2, ... )
T { arg }
static_cast expression
capture by copy of lambda-expression
발생 사례 해석 :
변수 T a를 R 타입으로 캐스팅하면, 암묵적으로 R(a)가 생성된다.
람다식에서 변수 T a를 copy 형식으로 캡쳐하면, 암묵적으로 T(a)가 생성된다.
참고 문헌
'# Lang > C++' 카테고리의 다른 글
6.3 이니셜라이져 리스트 (0) | 2019.05.04 |
---|---|
6.2 중괄호 리스트 초기화 (0) | 2019.04.30 |
5.2 완벽한 전달 (0) | 2019.04.19 |
5.1 이동 의미론 (0) | 2019.04.18 |
4.3 우측값 참조 (rvalue reference) (0) | 2019.04.16 |