이니셜라이져 리스트 (Initializer_list)
여러개의 요소들을 하나의 리스트에 넣어서 생성자에 넘김. (since C++11)
이 때, 해당 요소들은 전부 동일한 타입이어야 함.
내부적으로 std::initializer_list<T> 라는 자료형에 담겨서 전송됨.
즉, 해당 초기화 방식을 사용하려면 std::initializer_list<T>를 인자로 받는 생성자가 있어야 함.
example 1 :
std::initializer_list<int> list = {1, 2, 3}; vector<int> v1{list}; // v1 [1, 2, 3], call vector(initializer_list) vector<int> v2(list); // v2 [1, 2, 3], call vector(initializer_list) vector<int> v3{1, 2, 3}; // v3 [1, 2, 3], call vector(initializer_list) vector<int> v4(1, 2, 3); // compile error, no constructor vector(int, int, int)
example 2:
class data { private: int num[4]; public: data(std::initializer_list<int> list){ uint32_t idx = 0; for(const int var : list){ num[idx] = var; idx++; } } }; data v1{1, 2, 3, 4}; // call data(initializer_list) data v2({1, 2, 3, 4}); // call data(initializer_list)
집합 초기화와 비교 (vs Aggregate initialization.)
이니셜라이져 리스트 :
초기화 방식이 아님 (유틸리티에 가까움), copy initailization으로 동작함.
다중인자를 std::initializer_list<T>에 넣어서 생성자에 전송.
다중인자의 자료형은 모두 같아야 함.
std::initializer_list를 인자로 받는 생성자가 있어야 함.
중괄호 리스트 초기화 (집합 초기화) :
aggregate initialization.
다중인자를 하나의 집합으로 취급하여 per copy initialize를 진행.
다중인자의 자료형은 전부 달라도 됨.
생성자가 없어도 됨. (단, 사용하는 C++버전의 제약조건을 지켜야 함.)
혼용하여 사용하면 initializer_list constructor를 우선적으로 호출한다.
위는 gcc 기준이며, visual studio compiler에서의 처리방식은 위와 다를 수 있다.
example 1 :
class data { public: int a; int b; data(int _a, int _b){ cout << "call data(int, int)" << endl; } data(std::initializer_list<int> list){ cout << "call data(initializer_list)" << endl; } }; data a(1, 2); // copy init, call data(int, int) data b{1, 2}; // copy init, call data(initializer_list)
example 2 :
class data { public: int a; int b; }; data a(1, 2); // compile error, no matching constructor. data b{1, 2}; // aggregate init,
example 3 :
vector<int> v1(2, 1); // [1, 1], call vector(int, int) vector<int> v2{2, 1}; // [2, 1], call vector(initializer_list)
참고 문헌
'# Lang > C++' 카테고리의 다른 글
6.4 균일된 초기화 방식 (0) | 2019.05.07 |
---|---|
6.2 중괄호 리스트 초기화 (0) | 2019.04.30 |
6.1 로컬변수 초기화 (0) | 2019.04.22 |
5.2 완벽한 전달 (0) | 2019.04.19 |
5.1 이동 의미론 (0) | 2019.04.18 |