복사 후 맞바꾸기 방법은 아래 두 가지 특성을 활용하여 조금 다르게 구현 가능하다.
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= 구현 시 어떤 객체가 자신에 대입되는 경우 처리를 해야한다. 주소를 비교하거나 복사 후 맞바꾸기 기법을 사용해도 좋다.
- 두개 이상의 객체에 대해 동작하는 함수가 있다면, 해당 함수에 넘겨지는 객체들이 같은 객체인 경우 정확히 동작하는지 확인이 반드시 필요하다.
'Working on' 카테고리의 다른 글
[Effective C++] 자원 관리에는 객체를 활용한다 (0) | 2021.05.23 |
---|---|
[Effective C++] 객체의 모든 부분을 빠짐없이 복사하자 (0) | 2021.05.20 |
[Effective C++] operator= 에서는 자기대입에 대한 처리가 빠지지 않게하자 (0) | 2021.05.19 |
[Effective c++] 항목 10: 대입 연산자는 *this 참조 반환하게 하자. (0) | 2021.05.12 |
NVIDIA NVTAGS ( Topology-Aware GPU Selection ) 메뉴얼 읽기 - 1 (0) | 2021.04.21 |