Skip to content

Latest commit

 

History

History
51 lines (45 loc) · 2.06 KB

Item6.md

File metadata and controls

51 lines (45 loc) · 2.06 KB

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

단 하나만 존재하는 객체

  • 하나밖에 없는 객체가 있다면 그 객체는 사본을 만들 수 없어야 한다.
  • 컴파일러가 복사 생성자복사 대입 연산자은근슬쩍 만들기 때문에 복사의 가능성이 존재한다.

복사를 막는 방법

복사 생성자 및 복사 대입 연산자를 private 멤버로 선언

  • 여전히 그 클래스의 멤버 함수friend 함수가 호출할 수 있는 위험이 존재한다.

해당 함수들을 클래스에 선언만 하기

  • 선언만 하고 정의를 하지 않는다.
  • 객체의 복사를 시도하려고 할때 컴파일러가 못하도록 막는다.
class test
{
public:
    test();
private:
    // 선언만 존재하는 복사 생성자와 복사 대입 연산자
    test(const test&);
    test& operator=(const test&);
};

int main()
{
    test a;
    test b;
    a = b; // 에러
    a(b);  // 에러
    return 0;
}

선언만한 복사 생성자와 복사 대입연산자를 해당 클래스에 넣지 말고 별도의 기본 클래스에 넣고 해당 클래스로부터 파생

class Uncopyable{
protected:
    Uncopyable() {}  // 생성 허용
    ~Uncopyable() {} // 소멸 허용
private:
    Uncopyable(const Uncopyable&);             // 복사 방지
    Uncopyable& operator=(const Uncopyable&);  // 복사 대입 방지
};

class test : private Uncopyable{};