항목11 - operator= 에서는 자기대입에 대한 처리가 빠지지 않도록 하자!

operator= 에서는 자기대입에 대한 처리가 빠지지 않도록 하자!

 

자기대입이란(self assignment)?

어떤 객체가 자기 자신에 대해 대입연산자를 적용하는 것을 말함

w = w;

a[i] = a[j];

*px = *py;

같은 값을 같거나 같은 값을 가르키면 그것은 자기대입이 성립됨.

자기대입이 생기는 이유는 여러 곳에서 하나의 객체를 참조하는 상태인 '중복참조(aliasing)' 라고 불리는 것 때문!

 

자기대입이 안좋은 이유

- 코드가 커짐

- 처리 흐름에 분기점을 만들어 실행속도 느려짐

- CPU 명령어 선행인출, 캐시, 파이프러닝 등의 효과 떨어짐

 

해결책 

- ' 옮긴 후 삭제! ' 

1. 원래의 포인터변수 pb를 어딘가에 저장한다. Bitmap *pOrig = pb;

2. pb 가 *pb의 사본을 가리키게 한다. pb = new Bitmap(*rhs.pb);

3. 원래의 pb를 삭제한다. delete pOrig;

- > new Bitmap 부분에서 예외가 발생하더라도 pb는 변경되지 않은 상태가 유지되어 예외에서 안전하다.

 

- '복사 후 맞바꾸기(copy and swap)'

1.  temp = 사본의 copy를 하나 만들고 그것을 원본과 스왑하는 기법

-> 클래스의 복사 대입 연산자는 인자를 값으로 취하도록선언하는 것이 가능하다는 점

-> 값에 의한 전달을 수행하면 전달된 대상의 사본이 생긴다는 점

 

잊지말자!

- operator= 을 구현할 때, 어떤 객체가 그 자신에 대입되는 경우를 제대로 처리하도록 만듭시다.

원본 객체와 복사대상 객체의 주소를 비교해도 되고, 문장의 순서를 적절히 조정할 수도 있으며, 복사 후 맞바꾸기 기법을 써도 된다!

- 두 개 이상의 객체에 대해 동작하는 함수가 있다면, 이 함수에 넘겨지는 객체들이 사실 같은 객체인 경우에 정확하게 동작하는지 확인해 보자!

 

댓글을 작성해보세요.