C++에서 기본적으로 비어있는 클래스를 만들었을경우, 컴파일러가 자동으로 선언해주는 함수가 있습니다.
이함수들은 모두 public이고 inline함수 입니다.
즉!
class Empty()
{
// 이렇게 빈 껍데기 클래스를 만들게 되면
};
class Empty()
{
public:
Empty() { } // 기본 생성자
Empty( const Empty& rhs ){ } // 복사 생성자
~Empty() { } // 기본 소멸자
Empty& operator=( const Empty& rhs) { } // 복사 대입 연산자
};
위의 클래스와 같이 자동으로 생성이 됩니다.
Empty e1; // 기본 생성자, 기본소멸자
Empty e2(e1); // 복사생성자
e2 = e1; // 복사 대입 연산자
만약에 클래스 멤버 변수가 참조자이거나 상수일 경우에는 기본 복사 대입 연산자가 생성되지 않고,
호출할경우 에러를 내버린다.
이유는?
기본 생성 된 복사 대입 연산자는 호출될 때 넘겨받은 인자의 내용을 모든 멤버 변수에 복사하게되는데,
멤버변수가 참조자(&)라면 대입 이전에 처음생성되는 시점에서 이미 다른위치를 참조하게 되고, 그이후에는 이 참조되는 위치를 바꿀 수 없기 때문이다.즉! 참조자는 처음에 참조된 객체 외에 다른 객체를 다시 참조할 수 없기 때문 입니다.
또한, 상수일 경우에도 마찬가지이다. 생성된 이후에 값의 변경은 불가능 하기 때문에 사용자가 직접 복사 대입 연산자를 정의해 주어야 한다.
그리고
복사 대입 연산자를 private로 선언한 기본 클래스로부터 파생된 클래스일 경우, 기본 복사 대입 연산자는 생성되지 않는다.
이유는?
파생된 클래스의 객체에서 복사 대입 연산자가 호출될때, 기본클래스의 복사 생성자를 호출해야하는데 private 영역에 있어서 호출 할 수가 없기 때문이다.
이것 만은 잊지 말자!
◆ 컴파일러는 경우에 따라 클래스에 대해 기본 생성자, 복사 생성자, 복사 대입 연산자, 소멸자를 암시적으로 만들어 놓을 수 있습니다.
'0x0001 > Effective C++' 카테고리의 다른 글
[Effective C++] 항목 7 : 다형성을 가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자 (0) | 2019.02.10 |
---|---|
[Effective C++] 항목 6 : 컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해버리자 (0) | 2019.02.10 |
[Effective C++] 항목 4 : 객체를 사용하기 전에 반드시 그 객체를 초기화 하자 (0) | 2019.02.09 |
[Effective C++] 항목 3 : 낌새만 보이면 const를 들이대 보자! (0) | 2019.02.09 |
[Effective C++] 항목 2 : #define을 쓰려거든 const, enum, inline을 떠올리자 (0) | 2019.02.09 |