스토리텔링 개발자

[Effective C++] 6. 암시적으로 생성되는 함수 금지하기 본문

개발/Effective C++

[Effective C++] 6. 암시적으로 생성되는 함수 금지하기

김디트 2024. 5. 20. 11:19
728x90

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

 

 

 

암시적 생성 함수의 문제
  • 컴파일러가 생성하는 함수는 모두 public 멤버가 된다.
  • 이처럼 의도하지 않은 인터페이스 노출은 실수를 유발할 수 있다.

 

 

 

private 멤버로 명시적 선언만 하여 해결
  • private 멤버로만 처리했을 때의 문제점
    • 해당 클래스의 멤버 함수 및 프랜드(friend) 함수 내에서 private 멤버를 호출할 여지가 있다.
    • 정의를 하지 않음으로써 호출 시 링크 시점에 에러가 뜨게 한다.

 

 

링크 시점 에러를 컴파일 시점 에러로 옮기는 방법 
  • 에러 탐지는 나중으로 미루는 것보다 미리하는 것이 좋기 때문.
  • 복사 생성자, 복사 대입 연산자를 private로 선언한 부모 클래스를 상속한다.
  • 컴파일러가 생성한 복사 함수는 기본 클래스의 대응 버전을 호출하게 되어 있다.

 

 

복사 생성자, 복사 대입 연산자를 금하는 기본 클래스(Uncopyable)의 기술적 이슈
  1. 이 클래스를 상속할 때는 public일 필요가 없다.(항목 32, 39)
  2. 이 경우 소멸자는 가상 소멸자가 아니어도 된다.(항목 7)
  3. 데이터 멤버가 전혀 없으므로 공백 기본 클래스 최적화 기법이 먹힐 수 있다.(항목 39)
  4. 그러나 기본 클래스이므로 해당 기법 적용시 다중 상속 문제가 발생할 가능성이 있다.(항목 40)
  5. 다중 상속시 공백 기본 클래스 최적화가 통하지 않을 때가 종종 있다.(항목 30)
  6. 부스트 라이브러리(항목 55)에 같은 구실의 클래스(noncopyable)가 있다.
728x90
Comments