직접 초기화 , 복사 초기화_240509 수정함.

보물창고·2022년 9월 3일
0
  • 업데이트 : 240318

직접 초기화

  • 생성되지 않은 객체에 변환 생성자 호출을 통해서 호출하거나,
    직접 생성자를 호출함으로써 호출되는 초기화를 말함.

: 초기화 시에 '=' 대입을 사용하지 않는 것을 말함.
-> 잘못된 표현이고, 복사라는 것은 이미 만들어진 객체를 이용해 다른
lvalue 에다가 대입할 때 복사가 발생한다.

아래 두 초기화 모두 직접 초기화이다.
1) typeid ()
2) typeid {}

복사 초기화

: 초기화시에 '=' 대입을 사용하는 초기화를 말함.

  • typeid =

객체 : direct 초기화 vs copy 초기화 차이점

  • 아래의 경우, 암시적 형변환을 통해 , 변환 생성자를 호출함.
    Point p = 5;
    -> Point p = Point(5) 로 변환된후 , 복사호출이 아닌 바로 초기화다.
    컴파일러가 최적화시킴.
  • 즉, 복사가 이루어지는 것이 아니라 바로 생성자를 호출한거다.
    --> 복사 대입이 이루어짐.
  • 생성자에 explicit을 명시하게 되면, 암시적 형변환을 차단함.
    -> Point 의 변환생성자에다가 explicit을 작성해보자.

  • explicit
    : 변환생성자로의 암시적 형변환을 방지함.
    -> Point p{5}
    --> Point p2 = p; : 추가적으로 복사 생성도 차단할 수 있다.

  • 그런데 대입 연산자에다가는 선언 못한다...

problem

가) 인자가 1개, 2개 있는 변환 생성자를 만들어라
나) 객체를 대입, 유니폼 초기화로 만들어라

  • 대입의 경우는 생성자 호출을 명시하지 말고, Point p = {1,2};
    이런식으로 작성하라.

다) 인자가 1,2개 있는 생성자를 explicit 명시하고 확인하라.


객체 초기화

Point pt{} 의 경우, 직접 초기화이고, 초기화 단 한번만 이루어짐.

Point pt = {}; 의 경우, {} 에서 임시객체가 생성되고, 대입으로 인해
복사가 발생한다.

-> 아니다! 최적화로 인해 바로 생성자가 호출되는 것을 확인할 수 있다.

profile
🔥🔥🔥

0개의 댓글