Post
[ STUDY/Effective C++ ]
2022. 6. 23. 23:41
항목5를 보면 알 수 있다시피 컴파일러는 클래스에 대해 기본생성자, 복사 생성자, 복사 대입 연산자, 소멸자를 암시적으로 만들 수 있다.
그러면 복사가 되지않게 복사 생성자 자체를 만들지 않을 수 없는걸까?
1. 해당 멤버함수를 private으로 선언
class HomeForSale {
public:
...
private:
...
HomeForSale(const HomeForSale&);
HomeForSale& operator=(const HomeForSale&);
};
결론은 컴파일러에서 자동으로 생성하는것을 방지하고자하는 멤버함수를 따로 private으로 선언만하고 구현을 하지않으면 되는일이다.
2. Uncopyable 상속
class Uncopyable {
protected:
Uncopyable() {}//생성과 소멸 허용
~Uncopyable() {}
private:
Uncopyable(const Uncopyable&) //복사 방지
Uncopyable& operator=(const Uncopyable&);
};
class HomeForSale: private Uncopyable {
...
};
아니면 기본 클래스인 Uncopyable 을 상속받으면 되는일이다. 좀 더 깔끔하긴하다.
이 Uncopyable이라는 클래스를 보면 생성과 소멸을 허용하는건 protected내에서 선언을 해준다.
그리고 앞의 방법과 똑같이 방지가 되었으면 하는 멤버함수의 경우에는 private으로 선언을 한다.
3. noncopyable 상속
Uncopyable과 같은 기능을 하나, 부스트 라이브러리안에 있는 클래스이다.
'STUDY > Effective C++' 카테고리의 다른 글
항목 8: 예외가 소멸자를 떠나지 못하도록 붙들어 놓자 (0) | 2022.08.17 |
---|---|
항목 7: 다형성을 가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자 (0) | 2022.06.25 |
항목 5: C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자 (0) | 2022.06.23 |
항목 4: 객체를 사용하기 전에 반드시 그 객체를 초기화하자 (0) | 2022.06.23 |
항목 3: 낌새만 보이면 const를 들이대 보자! (0) | 2022.06.18 |