복사 생성자의 모양에 대해서

phoenixKim·2022년 9월 11일
0

핵심

: 어떠한 이유에서 복사 생성자, 복사 대입연산자 만들 때,
const &를 사용하는지를 확실히 알아야 함.

복사 생성자가 const Object& 인 이유?

결론

    1. 복사 생성자는 인자로 전달했을 때, 복사가 재귀적으로 호출되는 것을 막기 위해
      참조 형식으로 만들어져야 함.
    1. 복사 생성자는 lvalue와 rvalue를 모두 받기 위해
      const 참조 형식으로 만들어저야 함.

이유 1번 : 왜 참조형태인가?

참조 형태로 선언해야 함.
값을 불가함.

  • 그림

    -> Point p를 Point p3으로 보자.

  • 이게 가능하다고 한다면? call 되는 형태를 보면,
    Point p1(1,1);
    Point p2(p1);

1) 복사 생성자의 매개변수로 객체가 전달되고, Point p2(Point p3 = p1)이 되고,
엇.. p3 = p1을 의 경우는 p2(p1) 처럼 다시 또...
Point p3(Point p3 = p1)??
2) 그러면 다시 복사 생성자가 호출되는 형태임.
3) 결과 : 복사 호출이 재귀적으로 발생하게 됨.

  • 결론 : 오류를 보면, 컴파일러가 만드는 방식을 제한 하고 있음.

이유 2번 : 왜 const를 명시해야 하는지?

  • 그림
    -> 에러 발생함.
    : 에러 안뜨면 cl 컴파일러가 확장문법을 사용하고 있기 때문임.
    cl copy /Za 를 입력해야 함.


: foo의 경우, 임시객체, 즉 rvalue값을 반환하고 있음.
rvalue는 lvalue 참조로 받을 수 없기 때문임.

  • 복사 생성 및 대입되는 대상에 대해서 생각해보면, lvalue 만 우변에 위치하는 것이 아니라, rvalue도 우변에 위치할 수 있다!!

-> 따라서 lvalue 뿐 아니라, rvalue 도 받을 수 있는 const ref 를 사용해야 함.

  • 결과
    : const 참조는 rvalue와 lvalue를 모두 받을 수 있다는 특성을 이용함.
profile
🔥🔥🔥

0개의 댓글