Item11_operator=에서는 자기대입에 대한 처리가 빠지지 않도록 하자
챕터 핵심 내용
- operator=을 구현할 때, 어떤 객체가 그 자신에 대입되는 경우를 제대로 처리하도록 만들자.
- 두 개 이상의 객체에 대해 동작하는 함수가 있다면, 이 함수에 넘겨지는 객체들이 사실 같은 객체인 경우에 정확하게 동작하는지 확인하라.
- operator=을 구현할 때, 어떤 객체가 그 자신에 대입되는 경우를 제대로 처리하도록 만들자.
- 자기 대입(self assignment)은 적법한 코드이며, 실수할 여지가 있다. 또한 눈에 잘 띠지도 않는다.
a[i] = a[j]; // i와 j가 같다면? *px = *py; // px와 py가 같다면?
- 자기 대입이 생기는 이유는 중복참조(aliasing) 때문이다.
- 대입 연산자는 자기 대입에 대해 안전하게 동작해야 한다.
- 자기 대입을 처리하는 방법
- 일치성 검사(identity test)
- 가능성에 비해 비용이 다소 클 수 있다.
- 문장 바꾸기
- 많은 경우에 문장 순서를 세심하게 바꾸는 것만으로 예외에 안전한(동시에 자기대입에 안전한) 코드가 만들어진다.
- 복사 후 맞바꾸기
- 임시 객체 생성후
swap
을 한다.- 인자를 상수 참조 대신 값으로 바꿔볼 수도 있다. 이렇게 되면 명확성은 떨어지나 함수의 매개변수의 생성자로 옮겨져 컴파일러가 좀 더 효율적인 코드를 생성할 수 있다.