1. 복사 초기화(Copy initialization)
=> 다른 object에서 object를 초기화하는 경우
=> non-explicit(명시적이지 않은) 사용자 정의 변환함수만 고려함
=> 많은 경우 대입연산자를 사용(=)
=> 수행 조건
-> 1. non-reference type T가 등호로 구성된 초기화 프로그램과 expression으로 선언된 경우
-> 2. 값으로 함수에 인수를 전할달 때
-> 3. value로 반환되는 function에서 return 시
-> 4. value에 의해 exception을 throw / catch할 때
-> 5. aggregate initialization의 일부로써, initializer가 제공되는 요소를 초기화 할때
T object = other; // 1
func(other); // 2
return other; // 3
throw object; // 4-1
catch (Tobject); // 4-2
T array[N] = {other}; // 5
2. 직접 초기화(Direct initialization)
=> 명시적 생성자 인수 집합에서 object 초기화
=> 오버로드 된 함수에 대한 function call처럼 자동함
=> 즉, 가장 일치하는 생성자를 찾고 암시적 변환 수행
=> 생성자를 호출하는데 필요한 변환이 없고 사용자 정의 변환이 적은 초기화
=> 모든 생성자와 모든 사용자 정의 변환 함수를 고려하는 초기화
=> 모호할경우 선언문으로 취급하여 해결
=> 많은 경우 괄호()를 사용함
=> 수행 조건
-> 1.(C++ 11)비어 있지 않은 괄호로 묶인 표현식
-> 2. 중괄호로 묶인 initializer로써, class가 아닌 object 초기화
-> 3. functional cast 혹은 괄호로 묶은 표현식 목록으로 prvalue 초기화
-> 4. static_cast 표현식에 의한 임시 prvalue 초기화
-> 5. 비어있지 않은 initializer을 이용한 new 초기화
-> 6. initializer list를 이용한 non-static member 초기화
-> 7. lambda 식에서 copy에 잡힌 variable에서 closure object member 초기화
T object(arg); // 1
T object{arg}; // 2
T (arg1, arg2, ...); // 3
static_cast<T>(other); // 4
new T(args, ..); // 5
Class::class() : member(args, ...) {} // 6
[arg]() { ...} // 7
3. 기본 초기화(Default initialization)
=> initializer가 없는 변수가 생성될 때 수행되는 초기화
=> 수행 조건
-> 1. initializer없이 automatic / static / thread-local storage duration을 갖는 변수가 선언된 경우
-> 2. new로 선언한 obejct가 initializer없이 생성된 경우
T object; // 1
new T; // 2
4. 목록 초기화(list initialization)(C++ 11부터)
=> braced-init-list(리스트)에서 object 초기화
=> Uniform initialization 이라고도 부름
=> 많은 경우 중괄호({})를 사용
=> 수행 조건
[Direct-list-initialization]
-> 1. 명명된 변수의 초기화(비어있는 괄호로 묶은 표현식 목록 또는 중첩된 괄호로 묶은 초기 목록)
-> 2. unnamed temporary 초기화
-> 3. initializer 가 list인 new를 사용한 객체 초기화
-> 4. 등호를 사용하지 않는 non-static Data member initializer
-> 5. 생성자의 member initializer list에서 list 사용
[Copy-list-intialization]
-> 6. named variable의 초기화(등호 사용)
-> 7. 함수 호출 표현식에서 list 인수로 사용되며 목록 초기화
-> 8. return 표현식으로 사용된 초기화
-> 9. operatr[]에서 사용하는 subscript expression에서의 초기화
-> 10. assignment expression에서의 초기화
-> 11. functional cast expression에서의 초기화
-> 12. 등호를 사용하는 non-static Data member initializer
//Direct-list-initialization
T object{arg1, arg2, ...}; //1
T {arg1, arg2, ...}; //2
new T{arg1, arg2, ...}; //3
Class {T memeber{arg1, arg2, ...};}; //4
Class::class():member{arg1, arg2,...}{} //5
//Copy-list-initialization
T object = {arg1, arg2,...}; //6
func({arg1, arg2,...}) //7
return {arg1, arg2,...}; //8
object[{arg1, arg2,...}] //9
U({arg1, arg2,...}) //10
class{T member = {arg1, arg2,...};}; //11
참조 : https://runebook.dev/ko/docs/cpp/language/list_initialization
'C++ > Tips' 카테고리의 다른 글
[c++] inline (0) | 2021.06.16 |
---|---|
[C++] Casting (0) | 2021.06.15 |
[c++ 14] deprecated (0) | 2021.06.11 |
[c++ 11]Range based for (0) | 2021.06.10 |
[c++]Overloading vs Overriding (0) | 2021.06.04 |