일지

Effective C++...5

niamdank 2022. 6. 3. 16:03

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

private으로 선언 후 정의를 하지 않는 방법

복사 생성자와 복사 대입 연산자를 private 내부에서 선언하면 컴파일러가 자동 생성하지 않는다.

또, friend를 통해 사용하고자 하더라도 정의가 되어 있지 않으므로 링크 에러가 발생한다.


class HomeForSale {

public:

    ...

private:

    ...

    HomeForSale(const HomeForSale&);

    HomeForSale& operator=(const HomeForSale&);

}


 

링크 에러를 컴파일 시점 에러로 옮기기

복사를 방지하는 상위 클래스를 만들어 상속받으면 friend에서도 복사 관련 함수에 접근할 수 없게 되어 링크 에러 대신 컴파일 에러가 발생하게 된다.


class Uncopyable {

protected: // 파생된 객체에 대해 생성, 소멸은 허용한다.

    Uncopyable() {}

    ~Uncopyable() {}

private: // 하지만 복사는 막는다.

    Uncopyable(const Uncopyable&);

    Uncopyable& operator=(const Uncopyable&);

}

 

class HomeForSale : private Uncopyable {};


 

※ 부스트 라이브러리에서 Uncopyable과 동일한 기능을 하는 noncopyable 클래스를 지원한다.