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

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

by deviAk 2008. 6. 27.
반응형
하나밖에 없는 클래스 즉, 똑같은게 없는 클래스를 만든다고 할 때 객체는 사본(copy)를 만드는 것 자체가 이치에 맞지 않다. 그러다 보니 객체를 복사하려 하는 코드는 컴파일이 되지 않게 하려면 어떻게 해야 할까?

HomeForSale h1;
HomeForSale h2;

HomeForSale h3(h1);       // h1을 복사하려 한다. - 컴파일이 되면 안된다.

h1 = h2;             // h2를 복사 하려 한다. - 컴파일이 되면 안된다.


해결 방법
- 컴파일러가 생성하는 복사 생성자와 복사 대입 연산자는 public 으로 자동 생성 해버리므로 이들을 private 멤버로 선언 하면 된다.
 ㄴ 효과1 : 클래스 멤버 함수가 명시적으로 선언되어 컴파일러는 자시느이 기본 버전을 만들 수 없다.
 ㄴ 효과2 : 비공개(private) 접근성을 가지므로 외부에서 호출 할 수 없게 된다.

- private 멤버 함수는 그 클래스의 멤버 함수 및 프렌드 함수가 호출 할 수 있으므로 함수 자체를 정의를 하지 않으면 된다.
 ㄴ 효과1 : 멤버 함수 및 프렌드 함수 까지의 접근을 완벽히 차단할 수 있다.

위의 꼼수는 [멤버 함수를 private 멤버로 서언하고 일부러 정의(구현)하지 않는 방법] 은 꽤 널리 퍼지면서 하나의 '기법' 화가 되어 C++의 iostream 라이브러리에 속한 몇몇 클래스에서도 복사 방지책으로 쓰이고 있다.

class HomeForSale {
public:
 ...
private:
 ...
 HomeForSale(const HomeForSale&);      // 선언만 되어 있다.
 HomeForSale& operator=(const HomeForSale);
}


이것만은 잊지 말자!
- 컴파일러에서 자동으로 제공하는 기능을 허용치 않으려면, 대응되는 멤버 함수를 private로 선언한 후에 구현은 하지 않은 채로 두자. Uncopyable과 비슷한 기본 클래스를 쓰는것도 한 방법이다.

관련링크
http://ikpil.tistory.com/407
http://yesarang.tistory.com/42
http://ikpil.tistory.com/318
반응형