Effective C++ 3rd Edition. Scott Meyers.
C++ 프로그래머의 필독서라고 불리는 Effective C++을 읽고 중요한 내용을 정리한 글 입니다.
Item6. 컴파일러가 만들어낸 함수가 필요없으면 확실히 이들의 사용을 금해버리자
어떤 클래스에서 특정한 종류의 기능을 지원하지 않았으면 하는 의도를 반영하는 방법은 그런 기능을 제공하는 함수를 선언하지 않는 것이다. 하지만, 복사 생성자나 복사 대입 연산자에 대해서는 해당되지 않는 방법이다. 선언하지 않아도 컴파일러가 자동으로 생성하기 때문이다. 따라서 이에 대한 해결책으로 복사 생성자와 복사 대입연산자를 private 멤버로 선언함으로써 외부의 사용을 막을 수 있다.
하지만 이 방법의 문제점은 그 클레스의 멤버 함수나 friend함수가 호출할 수 있다는 점이다. 따라서 이것까지 막으려면, "정의"를 안해버리면 된다. 이러면 링크 시점에 에러를 볼 것이다.
class HomeForSale
{
public:
...
private:
...
HomeForSale(const HomeForSale &); // 선언만 달랑 해준다
HomeForSale &operator=(const HomeForSale &);
}
이렇게 만들면 사용자가 객체의 복사를 시도하면 컴파일러가 거부할 것이고, 멤버 함수 혹은 프렌드 함수 안에서 그렇게하면 링커가 에러를 뱉을 것이다.
링크 시점 에러를 컴파일 시점 에러로 옮길 수도 있다.(에러 탐지는 미루는 것보다 미리 하는 것이 좋다).복사 생성자와 복사 대입연산자를 HomeForSale 자체에 넣지 말고 별도의 기본 클래스에 두고 상속받는 형식이다.
class Uncopyable
{
protected:
Uncopyable() {}
~Uncopyable() {}
private:
Uncopyable(const Uncopyable &); // 복사를 방지
Uncopyable &operator=(const Uncopyable &);
};
class HomeForSale : private Uncopyable
{
...
};
컴파일러가 생성한 복사 함수는 기본 클래스의 버전을 호출하게 되어 있는데, 이런 호출이 지금 통하지 않으므로 컴파일러 시점에서 에러가 난다.
💡 핵심!
🔸 컴파일러에서 자동으로 제공하는 기능을 허용치 않으려면, 대응되는 멤버 함수를 private로 선언한 후에 구현은 하지
않을 채로 두자. Uncopyable과 비슷한 기본 클래스를 쓰는거도 한 방법이다.
'C++ > Effective C++' 카테고리의 다른 글
[Effective C++] 5. C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자 (0) | 2022.11.10 |
---|---|
[Effective C++] 4. 객체를 사용하기 전에 반드시 그 객체를 초기화하자 (0) | 2022.11.09 |
[Effective C++] 3. 낌새만 보이면 const를 들이대 보자! (0) | 2022.11.09 |
[Effective C++] 2. #define을 쓰려거든 const, enum, inline을 떠올리자. (0) | 2022.11.08 |
[Effective C++] 1. C++을 언어들의 연합체로 바라보자. (2) | 2022.11.08 |
게임개발자를 꿈꾸는 대학생의 개발 공부 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!