본문 바로가기
Working on

[Effective C++] operator= 에서는 자기대입에 대한 처리가 빠지지 않게하자 / 복사 후 맞 바꾸기 (Copy and Swap)

by Warehaus 2021. 5. 19.

복사 후 맞바꾸기 방법은 아래 두 가지 특성을 활용하여 조금 다르게 구현 가능하다.

class Apple {
    void swap( Apple& a ); // *this의 데이터 및 a의 데이터를 바꾼다.
};

Apple& Apple::operator=(const Apple& a)
{
    Apple temp(a); // a 의 데이터에 대해 사본을 만든다.
    swap(temp); 	   // *this의 데이터를 사본과 맞바꾼다.
    return *this;
}

위에 코드는 temp 라는 사본을 생성하여 swap한 뒤 *this 를 리턴한다.

 

이 방법은 아래의 C++ 특징을 이용해 조금 다르게 구현 가능하다.

1. 클래스의 복사 대입 연산자는 인자를 값으로 취하도록 선언 가능한 특징

2. 값에 의한 전달을 수행하면 전달된 대상의 사본이 생기는 특징

Apple& Apple::operator=(Apple a) // a는 객체의 사본을 받는다. '값에 의한 전달'
{
    swap( a );	// *this 의 데이터를 사본의 데이터와 바꾼다.
    return *this;
}

참조를 사용하지 않고 파라미터로 전달받을 때 자동으로 복사되는 특성을 이용한다고 보면 된다.


  • operator= 구현 시 어떤 객체가 자신에 대입되는 경우 처리를 해야한다. 주소를 비교하거나 복사 후 맞바꾸기 기법을 사용해도 좋다.
  • 두개 이상의 객체에 대해 동작하는 함수가 있다면, 해당 함수에 넘겨지는 객체들이 같은 객체인 경우 정확히 동작하는지 확인이 반드시 필요하다.