2009년 5월 18일 월요일

02장. 생성자, 소멸자 및 대입 연산자

항목 5. C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자.

  • 컴파일러는 경우에 따라 기본 생성자, 복사 생성자, 복사 대입 연산자, 소멸자를 암시적으로 만들수 있다.

 

항목 6. 컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해 버리자.

  • private : 복사 생성자와 대입 연산자를 명시적으로 선언하자. ( 구현은 빼자. friend 객체, 함수에서 호출이 가능해진다. )
  • boost::noncopyable 같이 기본 클래스로 만들어 놓을수도 있다. ( 이러면 컴파일 타임에 에러가 난다  )
  • 사용하지 않는 멤버 함수는 private으로 선언하고 구현 하지 말자.

 

  • 카피 하지 말아야 할껏?? 자원관리 객체(복사 처리 되도록 참조 카운트를 사용할 경우는 상관 없음), singleton 객체

 

항목 7. 다형성을 가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자.

  • 파생 객체를 기본 클래스의 포인터를 통하여 삭제될 때 그 기본 클래스가 비가상 소멸자를 가지면 부분 소멸(partially destroyed)가 발생한다.
  • 다형성을 지원하는 기본 클래스로 쓸려는 의도가 아니면 소멸자를 virtual로 하지 말라. ( 다른 언어 호환성 X, 메모리 낭비 )
  • 순수 가상 소멸자는 정의도 해줘야한다.?? ( -_-;; 링크 에러 발생 )

 

항목 8. 예외가 소멸자를 떠나지 못하도록 붙들어 놓자.

  • 소멸자에서 예외 처리
    • 프로그램 종료
    • 예외 삼키기
  • 예외는 "소멸자가 아닌 다른 함수에서 비롯된 것이어야 한다." 가 포인트.
  • assert 를 활용하면 예외를 초기에 잡을수 있다 (적극 활용하자)

 

항목 9. 객체 생성 및 소멸 과정 중에는 절대로 가상 함수를 호출하지 말자.

  • 생성자 혹은 소멸자 안에서 가상 함수를 호출하지 마세요. 가상 함수라고 해도, 지금은 실행중인 생성자나 소멸자에 해당되는 클래스의 파생 클래스 쪽으로는 내려가지 않으니까요.

 

항목 10. 대입 연산자는 *this의 참조자를 반환하게 하자.

  • 대입 연산자는 *this 참조자를 반환하도록 하자.

 

항목 11. operator=에서는 자기대입에 대한 처리가 빠지지 않도록 하자.

  • operator = 을 구현할 때, 어떤 객체가 그 자신에 대입되는 경우는 제대로 처리하도록 만듭시다. 원본 객체와 복사 대상 객체의 주소를 비교해도 되고, 문장의 순서를 적절히 조절할 수도 있으면, 복사 후 맞바꾸기 기법을 써도 됩니다.
  • 두 개 이상의 객체에 대해 동작하는 함수가 있다면, 이 함수에 넘겨지는 객체들이 사실 같은 객체인 경우에 정확하게 동작하는지 확인 하세요.

 

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

  • 복사한는 함수는  복사 생성자복사 대입 연산자 두개.
  • 객체 멤버 변수(field)가 추가 될때 마다 위의 두 함수를 같이 업데이트 해줘야한다.
  • 파생된 객체일 경우에 기본 클래스의 함수들도 호출해 줘야한다.
  • 객체 복사 함수는 주어진 객체의 모든 데이터 멤버 및 모든 기본 클래스 부분을 빠뜨리지 말고 복사해야 합니다.
  • 클래스의 복사 함수 두 개를 구현할 때, 한쪽을 이용해서 다른 쪽을 구현하려는 시도는 절대로 하지 마세요. 그 대신, 공통된 동작을 제3의 함수에다 분리해 놓고 양쪽에서 이것을 호출하게 만들어서 해결합시다.

 

 

이 글은 스프링노트에서 작성되었습니다.

댓글 없음:

댓글 쓰기