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

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

 클래스의 복사 대입 연산자, 복사 생성자를 그야말로 완벽하게 막기 위해서는 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

댓글

이 블로그의 인기 게시물

Unity - Dialogue 시스템을 구현할 때 유용한 무료 에셋

Unity - 메타 파일

Unity - 라이브러리 폴더