본문 바로가기
Programming/Effective C++ 3판

항목 12. 객체의 모든 부분을 빠짐없이 복사하자.

by deviAk 2009. 2. 17.
반응형

내용
객체의 안쪽 부분을 캡슐화한 객체 지향 시스템 중 설계가 잘 된 것들을 보면, 객체를 복사 하는 함수가 딱 두개만 있는 것을 볼 수 있다. 이 둘을 복사 생성자와 복사 대입 연산자라 하고, 이 둘을 통틀어 객체 복사 함수(copying function)라 부른다.

컴파일러가 생성한 복사 함수는 기본적인 요구에 충실하다. 복사되는 객체가 갖고 있는 데이터를 빠짐없이 복사한다.

주의점
만약 컴파일러가 만든 기본 동작에 마음에 안들어 직접 복사 함수를 선언한다면 다음과 같은 것들을 지켜야 한다.
  1. 기존 클래스에 멤버를 추가하면 복사 함수를 수정 해줘야 한다.
  2. 파생 클래스에서 기본 클래스의 복사 함수를 호출 하도록 만들어야 한다.
    CBase { ... }
    
    CTest
    {
     private:
      INT m_iMember;
    }
    
    CTest::CTest(const CTest& rhs)
    : CBase(rhs),                     // 기본 클래스의 복사 생성자를 호출한다.
     m_iMember(rhs.m_iMember)
    {
    }
    
    CTest& CTYest::operator=(const CTest&rhs)
    { 
     CBase::operator=(rhs);
     m_iMember = rhs.m_iMember;      // 기본 클래스 부분을 대입한다.
     
     return *this;
    }
    


이것만은 잊지 말자!
- 객체 복사 함수는 주어진 객체의 모든 데이터 멤버 및 모든 기본 클래스 부분을 빠드리지 말고 복사해야 한다.
- 클래스의 복사 함수 두개를 구현할 떄, 한쪽을 이용해서 다른 쪽을 구현하려는 시도는 절대로 하지 말자.그 대신, 공통된 동작을 제 3의 함수에다 분리해 놓고 양쪽에서 이것을 호출하게 만들어서 해결하자.

관련링크
http://ikpil.tistory.com/414
http://kldp.org/node/78631
http://rookiecj.tistory.com/8
http://ikpil.tistory.com/298

반응형