[C++] initialization

C++/Tips / / 2021. 6. 14. 14:33

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
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기