티스토리 뷰

Class를 생성할 때, 컴파일러는 기본적으로 생성자, 소멸자, 복사 생성자, 복사 대입 생성자를 자동으로 생성하게 된다.

 

class Empty(){
public:
    Empty(){ }
    ~Empty() { }
    
    Empty(const Empty& rhs) { }
    Empty& operator=(const Empty& rhs) { }
}

Empty e1;		// 기본
Empty e2(e1);		// 복사
e2 = e1;		// 복사 대입

 

이렇게 자동으로 생성되는 코드는 예상치 못한 오류를 일으킬 수 있습니다. 예를 들어 가상 소멸자가 생성되어야 하는데
비가상 소멸자가 생성된다던가, 몰래 만들어진 복사 생성자로 인해 객체가 예상치 못한 작동을 할 수도 있죠. 고로 이러한 함수들은 막거나, 직접 생성하여야 합니다. 이 내용은 항목 6으로 이어지게 됩니다.

 

class Empty(){
public:
    Empty(){ }
    ~Empty() { }
    
private:
    Empty(const Empty& rhs) { }
    Empty& operator=(const Empty& rhs) { }
}

 

다음과 같이 사용하지 않은 기본 함수들을 private에 넣어서 사용을 막을 수 있습니다.이렇게 넣어두면 복사를 하려고 복사 생성자를 호출하려고 할 때, private로 막혀있기 때문에 오류가 발생하게 되죠. 고로 이상한 행동을 막을 수 있게 된 것입니다. 이는 다음과 같이도 사용할 수 있습니다.

 

class Uncopyable{
protected:
	Uncopyable() { }
    ~Uncopyable() { }
    
private:
	Uncopyable(const Uncopyable&);
    Uncopyable& operator=(const Uncopyable&);
}

// 이렇게 되면 복사 생성자, 복사 대입 연산자 모두 선언되지 않습니다.
class HomeForSale : private Uncopyable{
	...
}

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함