카테고리 없음

[Effective C++] Item11_operator=에서는 자기대입에 대한 처리가 빠지지 않도록 하자

해달 2018. 1. 29. 19:54

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

챕터 핵심 내용

  • operator=을 구현할 때, 어떤 객체가 그 자신에 대입되는 경우를 제대로 처리하도록 만들자.
  • 두 개 이상의 객체에 대해 동작하는 함수가 있다면, 이 함수에 넘겨지는 객체들이 사실 같은 객체인 경우에 정확하게 동작하는지 확인하라.

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

  • 자기 대입(self assignment)은 적법한 코드이며, 실수할 여지가 있다. 또한 눈에 잘 띠지도 않는다.

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

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