(C++ : Move Semantics-1) 컴파일러가 제공해주는 복사생성자 모양

Posted by : at

Category : Cpp


컴파일러가 제공해주는 복사생성자는 어떻게 생겼을까?

class Point
{
  int x, y;
public:
  Point(int a = 0, int b = 0) : x(a), y(b) {}
  
  Point(const Point& p)   // 컴파일러가 제공해주는 모양
  {
    // 모든 멤버 복사
  }
};

int main()
{
  Point p1(1, 1);

  // Point(Point) - 복사 생성자가 필요하다., 우선적으로 컴파일러가 제공은해준다.
  Point p2(p1);
}
// 그런데 복사 생성자를 이런모양으로 만들면 안되나?
Point(Point p)
// 이 모양의 문제는 Point p = p1의 꼴을 갖기에 무한히 복사 생성자를 호출하게 된다.
// ** 복사 생성자는 Call-by-value를 사용할 수 없다. **
// 그럼 이 모양은?
Point(Point& p)
{

} // 여기까진 문제가 없음

Point foo()
{
  Point ret(0, 0);
  return ret;
}

int main()
{
    Point p3(foo());
    // foo()의 결과는 임시객체로 현재 복사 생성자는 임시객체를 받을 수 없다.
}

// l, r value를 모두 받을수 있는 방법은
Point(const Point& p) 

About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links