- 하나밖에 없는 객체가 있다면 그 객체는 사본을 만들 수 없어야 한다.
- 컴파일러가 복사 생성자 및 복사 대입 연산자를 은근슬쩍 만들기 때문에 복사의 가능성이 존재한다.
- 여전히 그 클래스의 멤버 함수 및 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{};
public
상속을 받을 필요가 없다.Uncopyable
의 소멸자는 가상 소멸자가 아니어도 된다.- 다중 상속의 문제가 발생할 수 있는데, 다중 상속 시 공백 기본 클래스 최적화가 돌아가지 못할때가 있지만 무시해도 상관없다.
- 부스트에 해당 형태의 클래스와 같은 역할을 하는 클래스가
noncopyable
이라는 이름으로 존재한다.