오늘부터는 가독성을 위해 제일 처음에 요약부분을 넣도록 하겠다.
요약
- operator=을 구현할 때, 어떤 객체가 그 자신에 대입되는 경우를 제대로 처리하도록 만들자. 원본 객체와 복사대상 객체의 주소를 비교해도 되고, 문장의 순서를 적절히 조정할 수도 있으며, 복사 후 맞바꾸기 기법을 써도 된다.
- 같은 맥락으로 두 개 이상의 객체에 대해 동작하는 함수가 있다면, 이 함수에 넘겨지는 객체들이 같은 객체인 경우에 정확하게 동작하는지 확인해 보자.
자기 대입이란?
어떤 객체가 자기 자신에 대해 대입 연산자를 적용하는 것을 말한다.
오늘은 자기대입의 경우 발생할 수 있는 예외처리에 대해 알아본다.
Widget& Widget::operator=(const Widget& rhs)
{
delete pb;
pb = new Bitmap(*rhs.pb);
return *this;
}
위의 코드는 rhs와 *this가 같은 객체이면 delete pb에 의해 자신이 사라져 버리기 때문에 위험한 코드이다.
따라서 아래와 같이 if문을 삽입해야 된다.
Widget& Widget::operator=(const Widget& rhs)
{
if(this == &rhs) return *this;
delete pb;
pb = new Bitmap(*rhs.pb);
return *this;
}
책에는 위의 코드말고도 값의 의한 전달(call by value)로 예외처리를 막는 방법도 소개되어 있지만 메모리를 더 쓰고 복사를 한다는 점에서 위의 코드보다 좋지 않은 알고리즘이라 판단할 수 있다.
따라서 두 개 이상의 객체를 대입하거나 대입연산자 함수를 만든다면 2개 이상의 객체가 같을 때의 예외처리를 반드시 해주자!
'C,C++' 카테고리의 다른 글
[Effective C++] 항목 13 : 자원 관리에는 객체가 그만! (0) | 2019.07.31 |
---|---|
[Effective C++] 항목 12 : 객체의 모든 부분을 빠짐없이 복사하자. (0) | 2019.07.30 |
[Effective C++] 항목 10 : 대입 연산자는 *this의 참조자를 반환하게 하자 (0) | 2019.07.24 |
[Effective C++] 항목 9 : 객체 생성 및 소멸 과정 중에는 절대로 가상 함수를 호출하지 말자 (0) | 2019.07.23 |
[Effective C++] 항목 8: 예외가 소멸자를 떠나지 못하도록 붙들어 놓자. (0) | 2019.07.22 |
댓글