- 복사 생성자
- 복사 대입 연산자
- 기존에 클래스를 설계할때 복사 함수를 직접 구현하는 경우가 있다.
- 작성 후 나중에 변수가 추가될때 부분 복사가 일어날 가능성이 존재한다.
class B{
private:
std::string name;
};
B::B(const B& rhs) : name(rhs.name){}
B& B::operator=(const B&rhs)
{
name = rhs.name;
return *this;
}
- 클래스에 멤버를 추가한다면, 추가한 데이터 멤버를 처리하도록 복사 함수를 재작성해야 한다.
- 이런 상황에서 알려주는 컴파일러는 거의 없다.
- 경고 수준을 최대로 높여도 마찬가지이다.
- 생성자도 전부 갱신해줘야 하고 비표준형 operator= 함수도 바꿔줘야 한다.
- 파생 클래스에 대한 복사 함수를 직접 작성한다면 기본 클래스 부분을 복사에서 빠뜨리지 않도록 주의하여야 한다.
- 기본 클래스부분은 private 멤버일 가능성이 높기 때문에 직접 건드리긴 어렵다.
- 파생 클래스의 복사 함수 안에서 기본 클래스의 복사 함수를 호출하도록 만든다.
class Derived : public Base { };
Derived::Derived(const Derived& rhs) : Base(rhs) { } // 기본 클래스의 복사 생성자 호출
Derived& Derived::operator=(const Derived& rhs)
{
Base::operator=(rhs); // 기본 클래스 부분을 대입
return *this;
}