컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해 버리자
항목 6 : 컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해 버리자.
클래스의 복사 대입 연산자, 복사 생성자를 그야말로 완벽하게 막기 위해서는 private으로 선언해주고 정의를 빼면 된다.
(friend class에서도 쓸 수 없게 된다. 만약에 사용하려 한다면 컴파일 단계에서 링크에러 발생).
좀더 일찍 컴파일 단계에서 에러를 검출하고 싶다면,
기반클래스에서 복사 생성자& 복사 대입 연산자를 private 선언 해준 뒤 파생클래스에서 private 상속까지 하면 절대 사용하지 못한다.
클래스의 복사 대입 연산자, 복사 생성자를 그야말로 완벽하게 막기 위해서는 private으로 선언해주고 정의를 빼면 된다.
(friend class에서도 쓸 수 없게 된다. 만약에 사용하려 한다면 컴파일 단계에서 링크에러 발생).
좀더 일찍 컴파일 단계에서 에러를 검출하고 싶다면,
기반클래스에서 복사 생성자& 복사 대입 연산자를 private 선언 해준 뒤 파생클래스에서 private 상속까지 하면 절대 사용하지 못한다.
1
2
3
4
5
6
7
8
|
class HomeForSale {
public:
private:
HomeForSale(const HomeForSale&); //선언만 달랑 있습니다.
HomeForSale& operator=(const HomeForSale&); //요 방식으로, 복사 생성자 와 대입 연산자를 사용할 수 없도록 막아버린다.
};
| cs |
표준 라이브러리 구현환경에서 ios_base, basic_ios, sentry가 이 방식으로 선언되었다
1
2
3
4
5
6
7
8
9
10
11
12
|
class Uncopyable {
protected:
Uncopyable() {} //생성과 소멸 허용
~Uncopyable() {}
private:
Uncopyable(const Uncopyable&); //복사 생성, 대입은 방지한다. 링크 시점에서 에러 판정
Uncopyable& operator=(const Uncopyable);
};
class HomeForSale2 : private Uncopyable { //private 상속
//복사생성자, 대입 연산자를 선언조차 할 수 없다.
};
| cs |
댓글
댓글 쓰기