내용
객체의 안쪽 부분을 캡슐화한 객체 지향 시스템 중 설계가 잘 된 것들을 보면, 객체를 복사 하는 함수가 딱 두개만 있는 것을 볼 수 있다. 이 둘을 복사 생성자와 복사 대입 연산자라 하고, 이 둘을 통틀어 객체 복사 함수(copying function)라 부른다.
컴파일러가 생성한 복사 함수는 기본적인 요구에 충실하다. 복사되는 객체가 갖고 있는 데이터를 빠짐없이 복사한다.
주의점
만약 컴파일러가 만든 기본 동작에 마음에 안들어 직접 복사 함수를 선언한다면 다음과 같은 것들을 지켜야 한다.
- 기존 클래스에 멤버를 추가하면 복사 함수를 수정 해줘야 한다.
- 파생 클래스에서 기본 클래스의 복사 함수를 호출 하도록 만들어야 한다.
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
'Programming > Effective C++ 3판' 카테고리의 다른 글
항목 12. 객체의 모든 부분을 빠짐없이 복사하자. (0) | 2009.02.17 |
---|---|
항목 11. operator=에서는 자기대입에 대한 처리가 빠지지 않도록 하자 (0) | 2009.02.17 |
항목 10. 대입 연산자는 *this 참조자를 반환하게 하자 (0) | 2009.02.15 |
항목 9. 객체 생성 및 소멸 과정 중에는 절대로 가상 함수를 호출하지 말자. (0) | 2009.02.15 |
항목 8. 예외가 소멸자를 떠나지 못하도록 붙들여 놓자. (0) | 2008.07.10 |
항목 7. 다형성을가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자. (0) | 2008.07.01 |
항목 6. 컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해 버리자. (0) | 2008.06.27 |
항목 5. C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자 (0) | 2008.06.27 |
항목 4. 객체를 사용하기 전에 반드시 그 객체를 초기화하자. (0) | 2008.06.10 |
항목 3. 낌새만 보이면 const를 들이대 보자! (0) | 2008.06.10 |
항목 2. #define을 쓰려거든 const, enum, inline을 떠올리자. (0) | 2008.05.29 |
댓글을 달아 주세요